#动态 #案例 #测试案例 #glob #创建 #dyn-tester

nightly dyntest

动态创建测试案例

5 个版本

0.2.1 2024 年 6 月 3 日
0.2.0 2024 年 5 月 28 日
0.1.2 2024 年 5 月 28 日
0.1.1 2024 年 5 月 28 日
0.1.0 2024 年 5 月 28 日

#205 in 测试

Download history 281/week @ 2024-05-24 163/week @ 2024-05-31 32/week @ 2024-06-07 6/week @ 2024-06-14

每月 213 次下载

MIT/Apache

12KB
232 代码行

dyntest

一个用于动态创建测试案例的小型 Rust 库。

使用方法

# Cargo.toml
[[test]]
name = "test_name"
harness = false
// tests/test_name.rs

use dyntest::{dyntest, DynTester};

dyntest!(test);

fn test(t: &mut DynTester) {
  for (str, len) in [("a", 1), ("pq", 2), ("xyz", 3)] {
    t.test(str, move || {
      assert_eq!(str.len(), len);
    });
  }
}
running 3 tests
test a ... ok
test pq ... ok
test xyz ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

功能

测试分组

使用 DynTester::group,可以将多个相关测试赋予一个共享前缀,类似于静态测试的 mod

use dyntest::{dyntest, DynTester};

dyntest!(test);

fn test(t: &mut DynTester) {
  panic!("hi");
  t.group("foo", |t| {
    t.group("bar", |t| {
      t.test("baz", || {});
    });
    t.test("qux", || {});
  });
}
running 2 tests
test foo::bar::baz ... ok
test foo::qux ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

模式匹配

当启用 glob 功能(默认情况下已启用)时,DynTester 提供了 globglob_in 方法,这些方法便于从目录中的文件生成测试

use dyntest::{dyntest, DynTester};

dyntest!(test);

fn test(t: &mut DynTester) {
  for (name, path) in t.glob_in("my/test/files/", "**/*.ext") {
    t.test(name, move || {
      // ...
    });
  }
}
my/test/files/
  foo.ext
  bar.ext
  baz/
    qux.ext
    something.unrelated
running 3 tests
test foo ... ok
test bar ... ok
test baz::qux ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

限制

使用 dyntest 需要nightly编译器,因为它使用了不稳定的 test crate。

在任何给定的测试文件中,测试必须全部是静态的或全部是动态的;如果你在一个文件中使用 dyntest!,任何 #[test] fns 将会被 rustc 无声忽略(这是由 harness = false 内在决定的)。

同一个测试文件中多次调用 dyntest! 不受支持;要么将其分开成多个测试文件,要么合并 dyntest! 调用(宏支持多个参数)。

依赖

~0–8MB
~52K SLoC