#process #fork

dev rusty-fork

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

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 测试

Download history 170448/week @ 2023-11-21 208064/week @ 2023-11-28 215583/week @ 2023-12-05 201704/week @ 2023-12-12 152275/week @ 2023-12-19 86608/week @ 2023-12-26 194125/week @ 2024-01-02 202621/week @ 2024-01-09 227147/week @ 2024-01-16 218057/week @ 2024-01-23 213886/week @ 2024-01-30 208900/week @ 2024-02-06 199502/week @ 2024-02-13 221498/week @ 2024-02-20 224870/week @ 2024-02-27 186111/week @ 2024-03-05

871,291 每月下载量
用于 56 个 crate(48 个直接使用)

MIT/Apache

52KB
683

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 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