#bdd #testing #behavior #style #driven #catch2 #given-when-then

beady

用于编写行为驱动(BD)风格的测试的宏

10个版本 (6个重大更新)

0.6.1 2024年2月24日
0.6.0 2022年10月2日
0.5.0 2022年8月28日
0.4.0 2022年7月16日
0.0.2 2022年7月5日

过程宏类别中排名第1645

每月下载量44
2 个库中使用

MIT/Apache

16KB
325

beady

用于编写行为驱动(BD)风格的测试的宏。灵感来源于Catch2

  • 简单(实际上只是重新排列你的测试)
  • 当测试失败时提供有用的输出
  • tokio::test(以及其他自定义测试属性)兼容

示例

use beady::scenario;

#[scenario]
#[test]
fn pushing_an_element_to_a_vec() {
    'given_an_empty_vec: {
        let mut vec = vec![];
        
        'when_an_element_is_pushed_to_the_vec: {
            vec.push(7);
            
            'then_the_vec_should_have_one_element: {
                assert_eq!(vec.len(), 1);
                
                'and_then_that_element_should_be_the_pushed_value: {
                    assert_eq!(vec[0], 7);
                }
            }
            
            'and_when_the_vec_is_cleared: {
                vec.clear();
                
                'then_the_vec_should_be_empty: {
                    assert!(vec.is_empty());
                }
            }
        }
    }
}

运行 cargo test 我们可以看到此场景生成了三个测试

running 3 tests
test pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::then::the_vec_should_have_one_element::and::the_element_should_be_the_pushed_value ... ok
test pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::and::the_vec_is_cleared::then::the_vec_should_be_empty ... ok
test pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::then::the_vec_should_have_one_element ... ok

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

如果我们故意使其中一个断言失败,那么我们将在panic消息旁边看到失败场景的完整描述

test pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::then::the_vec_should_have_one_element::and::the_element_should_be_the_pushed_value ... FAILED

failures:

---- pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::then::the_vec_should_have_one_element::and::the_element_should_be_the_pushed_value stdout ----

Scenario: pushing an element to a vec
   Given: an empty vec
    When: an element is pushed to the vec
    Then: the vec should have one element
     and: the element should be the pushed value

thread 'pushing_an_element_to_a_vec::given::an_empty_vec::when::an_element_is_pushed_to_the_vec::then::the_vec_should_have_one_element::and::the_element_should_be_the_pushed_value' panicked at 'assertion failed: `(left == right)`
  left: `7`,
 right: `8`'

用法

灵感来源于Catch2中的BDD风格测试用例,你可以使用#[scenario]注释来将测试用例转换为BDD风格。在测试用例中,你可以使用'given_'when_'then_前缀来标记块和结构化测试用例。可以使用'and_given_'and_when_'and_then_前缀来指定从句。

依赖

~1.5MB
~36K SLoC