#fork #process #test-macro #proc-macro

two-rusty-forks

跨平台库,用于通过类似fork的接口在子进程中运行Rust测试

3个不稳定版本

0.4.0 2020年8月30日
0.3.2 2020年8月30日
0.3.1 2020年8月30日
0.3.0 2020年8月30日

#311 in 测试

Download history 426/week @ 2024-04-07 413/week @ 2024-04-14 410/week @ 2024-04-21 381/week @ 2024-04-28 212/week @ 2024-05-05 171/week @ 2024-05-12 180/week @ 2024-05-19 168/week @ 2024-05-26 207/week @ 2024-06-02 140/week @ 2024-06-09 259/week @ 2024-06-16 187/week @ 2024-06-23 149/week @ 2024-06-30 134/week @ 2024-07-07 247/week @ 2024-07-14 175/week @ 2024-07-21

每月705次下载
用于 bakare

MIT/Apache

52KB
713

two-rusty-fork


注意: 这是一个优秀的rusty-fork的分支——它是对分支的分支,因此得名。

与原始版本的不同之处


Build Status

Rusty-fork提供了一种将单元测试“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是如何工作的

由于多种原因,在标准的Rust测试环境中,Unix风格的进程分叉实际上并不可行。

  • 虽然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许可证定义),都应如上所述双重许可,而无需附加条款或条件。

依赖项

~2–10MB
~113K SLoC