2 个不稳定版本
0.4.0 | 2020年8月30日 |
---|---|
0.1.1 | 2020年8月30日 |
0.1.0 |
|
#28 在 #test-macro
959 每月下载量
在 two-rusty-forks 中使用
8KB
135 行
two-rusty-fork
注意:这是优秀的 rusty-fork 的分支——它是对分支的分支,因此得名。
与原版的差异
- 添加了尚未合并的 pull request,引入了过程宏:https://github.com/AltSysrq/rusty-fork/pull/11
- 将测试输出附加到父进程的 panic 消息中,而不是打印到 stdout。
rusty-fork 提供了一种将单元测试“分叉”到单独进程的方法。
有许多原因想要在隔离的进程中运行一些测试
-
当测试共享一个进程时,如果任何测试导致进程终止、段错误、栈溢出等,整个测试运行进程就会死亡。如果测试在子进程中,只有子进程会死亡,测试运行器会简单地标记测试失败。
-
将测试隔离到子进程中,可以给测试添加超时,并强制终止它,产生正常的测试失败。
-
需要与某些本质上全局属性(如当前工作目录)交互的测试可以在不干扰其他测试的情况下这样做。
这个 crate 本身提供了两样东西
-
一个宏
rusty_fork_test!
,这是一个将标准 Rust 测试包装在子进程中运行并具有可选超时的简单方法。 -
一个函数
fork
,它可以用作构建其他类型进程隔离策略的模块。
快速开始
如果您只想在隔离的进程中运行正常的 Rust 测试,开始非常快。
在 Cargo.toml
中添加
[dev-dependencies]
rusty-fork = "0.3.0"
然后,您只需使用 rusty_fork_test!
宏将任何要隔离的测试包装起来。
use two_rusty_forks::rusty_fork_test;
rusty_fork_test! {
#[test]
fn my_test() {
assert_eq!(2, 1 + 1);
}
// more tests...
}
对于更高级的用法,请参阅 fork
函数。
rusty-fork 的工作原理
由于多个原因,Unix风格的进程分叉在标准Rust测试环境中并不可行。
-
尽管在Windows上可以进行真正的进程分叉,但这既不快也不可靠。
-
Rust测试环境是多线程的,因此在进程分叉之后尝试进行任何非平凡的操作会导致未定义的行为。
因此,Rusty-fork通过在调整命令行以确保只执行所需的测试后,通过创建当前进程的新实例来工作。一些额外的协调建立了父/子分支,并将子进程的输出(并非无缝地)与测试输出捕获系统集成。
由于没有其他方式可以将参数传递给测试,进程之间的协调是通过环境变量来进行的。
由于它需要生成测试运行器可执行文件的新副本,Rusty-fork确实需要知道用户传递的每个标志的含义。如果遇到任何未知标志,分叉将失败。如果您发现Rusty-fork未能识别测试运行器传递给测试的任何有效标志,请毫不犹豫地提交问题。
可以通过设置环境变量而不打补丁来通知Rusty-fork新的标志。例如,如果测试运行器中添加了新的--frob-widgets
标志,则可以将RUSTY_FORK_FLAG_FROB_WIDGETS
设置为以下之一
pass
— 将标志(仅标志)传递给子进程pass-arg
— 将标志及其后续参数传递给子进程drop
— 不将标志传递给子进程drop-arg
— 不将标志传递给子进程,并忽略其后的任何参数。
通常,影响要运行哪些测试的参数应该被丢弃,而其他参数应该被传递。
贡献
除非您明确表示,否则您提交的任何旨在包含在您的工作中的贡献,如Apache-2.0许可证所定义的,应如上所述双重许可,不附加任何额外条款或条件。
依赖关系
~1.5MB
~33K SLoC