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

MIT 许可证

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