6 个版本
0.3.0 | 2020 年 5 月 27 日 |
---|---|
0.2.2 | 2019 年 4 月 10 日 |
0.2.1 | 2018 年 8 月 27 日 |
0.2.0 | 2018 年 6 月 2 日 |
0.1.0 | 2018 年 2 月 28 日 |
#148 in 测试
871,291 每月下载量
用于 56 个 crate(48 个直接使用)
52KB
683 行
rusty-fork
rusty-fork 提供了一种将单元测试“fork”到单独进程的方法。
有许多原因想要在隔离的进程中运行某些测试
-
当测试共享一个进程时,如果任何测试导致进程崩溃、段错误、栈溢出等,整个测试运行器进程都会死亡。如果测试在子进程中,只有子进程会死亡,测试运行器只会使测试失败。
-
将测试隔离到子进程中,可以给测试添加超时,并强制终止它,产生正常的测试失败。
-
需要与一些固有的全局属性(如当前工作目录)交互的测试可以这样做,而不会干扰其他测试。
该 crate 本身提供两个东西
-
rusty_fork_test!
宏,它是一种简单的方式来包装标准的 Rust 测试,以便在子进程中运行并可选添加超时。 -
fork
函数,它可以作为构建块来创建其他类型的进程隔离策略。
快速入门
如果您只想在隔离的进程中运行正常的 Rust 测试,入门非常快。
在 Cargo.toml
中添加
[dev-dependencies]
rusty-fork = "0.3.0"
然后,您只需使用 rusty_fork_test!
宏将任何要隔离的测试包装起来。
use rusty_fork::rusty_fork_test;
rusty_fork_test! {
#[test]
fn my_test() {
assert_eq!(2, 1 + 1);
}
// more tests...
}
对于更高级的用法,请参阅 fork
函数。
rusty-fork 的工作原理
由于许多原因,Unix 风格的进程 fork 在标准 Rust 测试环境中实际上并不可行。
-
虽然在 Windows 上可以实现真正的进程 fork,但它既不快也不可靠。
-
Rust 测试环境是多线程的,因此进程 fork 之后尝试进行任何非平凡操作都会导致未定义行为。
与Rusty-fork不同,它会通过创建当前进程的新实例来工作,调整命令行以确保只输入所需的测试。一些额外的协调建立父/子分支,并将子进程的输出(不是非常无缝地)与测试输出捕获系统集成。
进程之间的协调是通过环境变量进行的,因为在其他情况下没有传递参数给测试的方法。
由于它需要创建测试运行器可执行程序的新副本,所以rusty-fork确实需要知道用户传递的每个标志的含义。如果遇到任何未知标志,则分叉将失败。如果rusty-fork无法识别传递给测试运行器的任何有效标志,请毫不犹豫地提交问题。
可以通过设置环境变量来通知rusty-fork新的标志,而无需修补。例如,如果测试运行器添加了新的--frob-widgets
标志,可以将RUSTY_FORK_FLAG_FROB_WIDGETS
设置为以下之一
pass
— 将标志(仅标志)传递给子进程pass-arg
— 将标志及其后续参数传递给子进程drop
— 不将标志传递给子进程drop-arg
— 不将标志传递给子进程,并忽略随后的任何参数。
一般来说,影响运行哪些测试的参数应该被丢弃,其他参数应该被传递。
贡献
除非你明确表示,否则根据Apache-2.0许可中定义的,任何有意提交给您的工作以供包含的贡献,均应按上述方式双重许可,不附加任何额外的条款或条件。
依赖项
~2–12MB
~116K SLoC