#test-suite #hook #testing #proc-macro #configure

suitest

一个用于提高测试套件生活质量的库

3 个版本

0.1.2 2023年10月29日
0.1.1 2023年10月28日
0.1.0 2023年10月23日

#1674 in Rust 模式

MIT 许可证

11KB
99

suitest

一个提供过程宏的库,用于轻松设置测试钩子和配置测试状态。

示例

#![cfg(test)]

use suitest::{suite, suite_cfg};

#[suite(my_test_suite)]
#[suite_cfg(sequential = false, verbose = true)]
pub mod tests {
    use suitest::{after_all, after_each, before_all, before_each, cleanup};

    #[derive(Debug, Clone)]
    struct MyTestStruct {
        qux: usize,
    }

    #[cleanup]
    fn cleaning() {
        println!("cleaning");
    }

    #[before_all]
    async fn setup() -> (usize, MyTestStruct) {
        (420_usize, MyTestStruct { qux: 69 })
    }

    #[before_each]
    fn beach() -> (u8, String) {
        (69_u8, String::from("works"))
    }

    #[after_each]
    fn aeach(works: String) {
        assert_eq!(works, "works")
    }

    #[after_all]
    async fn teardown(bar: usize, my_stuff: MyTestStruct) {
        assert_eq!(bar, 420);
        assert_eq!(my_stuff.qux, 69);
    }

    #[test]
    fn works(works: String, foo: u8, bar: usize, my_stuff: MyTestStruct) {
        assert_eq!(works, "works");
        assert_eq!(foo, 69);
        assert_eq!(bar, 420);
        assert_eq!(my_stuff.qux, 69);
    }

    #[test]
    async fn works_too(works: String, foo: u8, bar: usize, my_stuff: MyTestStruct) {
        assert_eq!(works, "works");
        assert_eq!(foo, 69);
        assert_eq!(bar, 420);
        assert_eq!(my_stuff.qux, 69);
    }
}

工作原理

使用 suitest::suite 标注您想要作为测试套件的模块,您可以使用钩子标注其中的函数。

使用 suitest::suite_cfg 并传递参数来配置套件。

像平时一样使用 #[test] 标记测试,suitest 使用这些标注将函数注册为生成的测试套件中的测试。最后将生成一个单独的测试来运行套件。

可用的钩子有

  • before_all
    • 在套件开始时运行
  • before_each
    • 在套件中的每个测试之前运行
  • after_each
    • 在套件中的每个测试之后运行
  • after_all
    • 在整个套件通过后运行
  • cleanup
    • 在任何测试失败后运行。理想情况下不应panic。

suitest 与异步函数一起工作,但依赖于 tokio,因此您需要在依赖关系中包含它。任何钩子和测试都可以标记为异步,您可以使用异步钩子与同步测试混合使用,反之亦然。

配置

suite_cfg 是可选的,并接受以下内容

  • sequential= bool [false]
    • 如果为 true,则依次运行测试。同步测试在异步测试之前执行。套件中的所有测试总是执行。
  • verbose= bool [false]
    • 打印 suitest 在底层执行的操作,对调试很有用。

状态

测试套件由两种类型的状态组成;全局状态,在整个测试套件中可用,和局部状态,局部于测试。

只有 *_all 钩子可以修改全局状态中的项。测试和局部钩子只能从中读取。

带有 *_each 的钩子可以修改局部测试状态中的项。每个测试都会得到在这些钩子中提供的状态的副本,该状态也是只读的。

要将项目添加到上述描述的状态中,您只需使钩子返回一个任意元组即可。这将生成代码,将提供的参数插入到状态中。

要获取项目,请将必要的参数添加到函数的参数中。局部状态优先于全局状态。

每个状态可以存储每个类型的一个值。这意味着如果您在状态中插入任何类型的多次,只有最后一条记录将出现在映射中。如果您需要插入同一类型的多个值,请使用元组。

每个钩子和测试都会先尝试从其局部状态检索项目,然后再尝试从全局状态检索。如果两者都找不到,测试/钩子会引发恐慌。

依赖项

~3–4.5MB
~81K SLoC