#fail #parallel-testing #points #error #run-time #execution #failpoints

fail-parallel

Rust 的失败点。一个支持并行测试执行的分支。

1 个不稳定版本

0.5.1 2024 年 7 月 15 日

#175测试

Download history 128/week @ 2024-07-13 17/week @ 2024-07-20 78/week @ 2024-07-27 7/week @ 2024-08-03 738/week @ 2024-08-10 827/week @ 2024-08-17

1,658 每月下载量
用于 slatedb

Apache-2.0

43KB
644

fail-rs

CI Crates.io

文档.

Rust 的失败点实现。

失败点是代码植入,允许在运行时动态地注入错误和其他行为,主要用于测试目的。失败点灵活,可以配置以表现出各种行为,包括恐慌、提前返回和休眠。它们可以通过程序和环境进行控制,并且可以条件性和概率性地触发。

此包受 FreeBSD 的 失败点 启发。

用法

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
fail = "0.5"

现在,您可以从 fail 包中导入 fail_point! 宏,并使用它注入动态失败。此宏默认禁用失败点生成,可以在相关位置通过 failpoints Cargo 功能启用。

以下是一个使用失败点模拟 I/O 潜在的简单程序的示例

use fail::{fail_point, FailScenario};

fn do_fallible_work() {
    fail_point!("read-dir");
    let _dir: Vec<_> = std::fs::read_dir(".").unwrap().collect();
    // ... do some work on the directory ...
}

fn main() {
    let scenario = FailScenario::setup();
    do_fallible_work();
    scenario.teardown();
    println!("done");
}

在这里,程序对 read_dir 的结果调用 unwrap,这是一个返回 Result 的函数。换句话说,这个特定程序期望这个对 read_dir 的调用总是成功。实际上它几乎总是这样,这使得测试当 read_dir 失败时该程序的行为变得困难。通过在程序中植入失败点,我们可以假装 read_dir 失败,导致后续的 unwrap 潜在,并允许我们观察程序在失败条件下的行为。

程序正常运行时仅打印 "完成"

$ cargo run --features fail/failpoints
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/failpointtest`
done

但是,通过设置 FAILPOINTS 变量,我们可以看到如果 read_dir 失败会发生什么

FAILPOINTS=read-dir=panic cargo run --features fail/failpoints
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/failpointtest`
thread 'main' panicked at 'failpoint read-dir panic', /home/ubuntu/.cargo/registry/src/github.com-1ecc6299db9ec823/fail-0.2.0/src/lib.rs:286:25
note: Run with `RUST_BACKTRACE=1` for a backtrace.

有关更多信息,请参阅 API 文档

待办事项

通过 HTTP API 触发失败点计划中,但尚未实现。

依赖项

~315–445KB