4 个版本
使用旧的 Rust 2015
0.1.3 | 2018 年 5 月 19 日 |
---|---|
0.1.2 | 2018 年 5 月 9 日 |
0.1.1 | 2018 年 5 月 8 日 |
0.1.0 | 2018 年 5 月 8 日 |
#2797 in Rust 模式
19KB
157 行
可信度 - 用于创建非 panic 断言的宏和类型
这个包帮助你用 Rust 编写表格驱动测试,就像你在 Go 中写的那样。
(希望你们还在这里。)
这个包提供了一个宏,test_block!
,它允许你在所有断言都在测试块中执行后延迟测试失败。此外,test_block!
还允许你使用 Err
处理 ?
结果,这样你就可以更容易地从设置代码中快速退出,而无需过多地调用 .unwrap()
在 Result
返回类型上。
示例
#[macro_use] extern crate credibility;
#[test]
fn test_sums() {
test_block!(tb, "An example test block", {
let cases = vec![
(2, 3, 5),
(1, 1, 2),
(1, 1, 2),
];
for (in1, in2, output) in cases {
aver_eq!(tb, output, in1+in2+1);
}
Ok(())
});
}
这个测试将检查给出的所有三个示例,即使它们都失败了。输出看起来像这样
Running target/debug/deps/example-d766d73311bcb7d0
running 1 test
test test_sums ... FAILED
failures:
---- test_sums stdout ----
thread 'test_sums' panicked at 'assertion failed: `(left == right)`
left: `5`,
right: `6`', tests/example.rs:10:13
note: Run with `RUST_BACKTRACE=1` for a backtrace.
thread 'test_sums' panicked at 'assertion failed: `(left == right)`
left: `2`,
right: `3`', tests/example.rs:10:13
thread 'test_sums' panicked at 'assertion failed: `(left == right)`
left: `2`,
right: `3`', tests/example.rs:10:13
thread 'test_sums' panicked at 'Test cases in block "An example test block" failed', src/reporter.rs:54:13
failures:
test_sums
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
比编写大量的测试函数要好得多(你也可以重用设置代码!)
背景
在 Go 中,我最喜欢的功能之一是能够有失败的测试但仍然执行所有代码;这允许你一次性测试多个示例,并查看当前代码没有正确处理的示例。与 Rust 的默认测试断言机制相比,这要直观得多:看到多个失败的示例可以让你更快地缩小问题的根源,而不是逐个修复它们。以下是一个简单的 Go 示例来阐述我的意思
func TestSums(t *testing.T) {
tests := []struct {
in1, in2 int
out int
}{
{1, 1, 2},
{1, 2, 3},
{4, 5, 6},
}
for _, elt := range tests {
test := elt
t.Run(fmt.Sprintf("Sum %d+%d=%d", test.in1, test.in2, test.out), func(t *testing.T) {
t.Parallel()
sum := test.in1 + test.in2
if sum != test.out {
t.Errorf("Sum is wrong. Expected %d, got %d", test.out, sum)
}
})
}
}
输出将是这样的
$ go test -test.v -run=TestSums .
=== RUN TestSums
=== RUN TestSums/Sum_1+1=2
=== PAUSE TestSums/Sum_1+1=2
=== RUN TestSums/Sum_1+2=3
=== PAUSE TestSums/Sum_1+2=3
=== RUN TestSums/Sum_4+5=6
=== PAUSE TestSums/Sum_4+5=6
=== CONT TestSums/Sum_1+1=2
=== CONT TestSums/Sum_4+5=6
=== CONT TestSums/Sum_1+2=3
--- FAIL: TestSums (0.00s)
--- PASS: TestSums/Sum_1+1=2 (0.00s)
--- FAIL: TestSums/Sum_4+5=6 (0.00s)
sums_test.go:363: Sum is wrong. Expected 6, got 9
--- PASS: TestSums/Sum_1+2=3 (0.00s)
FAIL
FAIL github.com/antifuchs/example 0.023s
依赖项
~1.5MB
~39K SLoC