#process #fork #test-runner #test-macro

rusty-forkfork

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

2个不稳定版本

0.4.0 2022年2月5日
0.3.0 2021年12月7日

#376测试

Download history 2801/week @ 2024-03-14 2074/week @ 2024-03-21 2496/week @ 2024-03-28 2806/week @ 2024-04-04 2667/week @ 2024-04-11 2086/week @ 2024-04-18 1883/week @ 2024-04-25 2392/week @ 2024-05-02 2132/week @ 2024-05-09 2334/week @ 2024-05-16 2319/week @ 2024-05-23 2549/week @ 2024-05-30 2738/week @ 2024-06-06 2674/week @ 2024-06-13 2516/week @ 2024-06-20 2572/week @ 2024-06-27

10,914 每月下载量
8 个crate中使用(通过 sealed_test

MIT/Apache

54KB
807

rusty-fork

Build Status

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