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 测试
每月 213 次下载
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
提供了 glob
和 glob_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