#traits #testing #multiple #macro #run #example-struct2 #example-struct

test-impl

用于测试的宏,用于在多个特质实现上运行测试以确保它们都返回相同的结果。

2个不稳定版本

0.2.0 2020年12月1日
0.1.0 2020年11月27日

#1748 in 过程宏

MIT 许可证

12KB
167

test-impl

test-impl 是一个Rust宏,用于在测试时测试多个特质实现,以确保它们都返回相同的结果。

如何使用它?

宏使用示例

#[test_impl(ExampleTrait(ExampleStruct, ExampleStruct2))]
#[test]
fn example_test() {
    let bool_value = ExampleTrait::return_true();
    assert_eq!(bool_value, true)
}

使用此处提供的参数,宏将测试 ExampleStruct 和 ExampleStruct2 与您提供的代码。翻译后的版本看起来像这样

#[test]
fn example_test() {
    fn ExampleStruct() {
        type ExampleTrait = ExampleStruct;
        let bool_value = ExampleTrait::return_true();
        assert_eq!(bool_value, true)
    }
    ExampleStruct();

    fn ExampleStruct2() {
        type ExampleTrait = ExampleStruct2;
        let bool_value = ExampleTrait::return_true();
        assert_eq!(bool_value, true)
    }
    ExampleStruct2();
}

为什么这样布局?因为它可以在保留测试回溯行数的同时,也能检测到哪个实现失败。例如,当其中一个实现返回 false

thread 'example_test' panicked at 'assertion failed: `(left == right)`
  left: `false`,
right: `true`', tests/example.rs:32:5
stack backtrace:
  0: rust_begin_unwind
            at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:475
  1: std::panicking::begin_panic_fmt
            at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:429
  2: example::example_test::ExampleStruct2
            at ./tests/example.rs:32
  3: example::example_test
            at ./tests/example.rs:27
  4: example::example_test::{{closure}}
            at ./tests/example.rs:27

回溯指示panic发生在这段代码中 example::example_test::ExampleStruct2,告诉我们是 ExampleStruct2 导致了问题。

依赖项

~1.5MB
~34K SLoC