3个版本
0.1.2 | 2023年10月29日 |
---|---|
0.1.1 | 2023年10月28日 |
0.1.0 | 2023年10月23日 |
#1989 in 过程宏
在 suitest 中使用
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