3个版本

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

#1989 in 过程宏


suitest 中使用

MIT 许可证

43KB
927

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
    • 在测试失败后运行。理想情况下不应导致恐慌。

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

配置

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

  • sequential= bool [false]
    • 如果为 true,则按顺序运行测试。同步测试将在异步测试之前执行。无论是否为 true,套件中的所有测试都总是执行。
  • verbose= bool [false]
    • 打印 suitest 在底层执行的操作,有助于调试。

状态

测试套件包含两种类型的状态;全局状态,在整个测试套件中可用,以及局部状态,在测试中局部可用。

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

*_each 钩子可以修改本地测试状态中的项。每个测试都从这些钩子中获取提供的状态的副本,这些状态也是只读的。

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

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

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

每个钩子和测试都会尝试从其本地状态中检索项,然后再尝试从全局状态中检索。如果钩子/测试在这两个地方都找不到它,则会引发恐慌。

依赖关系

~0.3–0.8MB
~19K SLoC