2个不稳定版本
0.4.0 | 2022年2月5日 |
---|---|
0.3.0 | 2021年12月7日 |
#376 在 测试
10,914 每月下载量
在 8 个crate中使用(通过 sealed_test)
54KB
807 行
rusty-fork
Rusty-fork提供了一种将单元测试“fork”到单独进程的方法。
有许多原因想要在某些独立的进程中运行一些测试
-
当测试共享一个进程时,如果任何测试导致进程终止、段错误、栈溢出等,整个测试运行进程就会死亡。如果测试在子进程中,只有子进程会死亡,测试运行器只需失败测试。
-
将测试隔离到子进程中可以使为测试添加超时并强制终止它,并产生正常的测试失败。
-
需要与某些固有的全局属性(如当前工作目录)交互的测试可以在不影响其他测试的情况下这样做。
该crate本身提供两个东西
-
rusty_fork_test!
宏,这是一个将标准Rust测试包装在子进程中运行的简单方法,可选的超时。 -
fork
函数,它可以作为构建其他类型的进程隔离策略的基石。
快速入门
如果您只想在独立的进程中运行正常的Rust测试,入门非常简单。
在 Cargo.toml
中添加
[dev-dependencies]
rusty-fork = "*"
然后,您可以使用 rusty_fork_test!
宏简单地封装任何要隔离的测试。
use rusty_forkfork::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–11MB
~111K SLoC