39次发布
0.12.0 | 2024年1月2日 |
---|---|
0.11.6 | 2022年10月12日 |
0.11.5 | 2022年6月17日 |
0.11.1 | 2021年8月25日 |
0.2.7 | 2020年6月28日 |
#143 in Rust模式
4,590 每月下载量
在 23 crates 中使用
76KB
1.5K SLoC
K9 - Rust测试库
快照测试 + 更好的断言
可用的测试宏
snapshot
assert_equal
assert_greater_than
assert_greater_than_or_equal
assert_lesser_than
assert_lesser_than_or_equal
assert_matches_regex
assert_err_matches_regex
assert_matches_snapshot
assert_matches_inline_snapshot
assert_ok
assert_err
请参阅https://docs.rs/k9获取API文档
snapshot!()
宏
快照宏提供了捕获任何值的 Debug
表示并确保它随时间不发生变化的函数。
如果它发生了变化,测试将失败并打印“旧”值和“新”值之间的差异。
如果变化是预期的且有效的,使用设置了 K9_UPDATE_SNAPSHOTS=1
环境变量的 cargo test
运行测试后,将自动将新值插入测试源代码文件作为第二个参数,之后所有后续的测试运行都应开始通过。
assert_equal!()
宏
Rust已经提供了一套良好的内置测试运行器和一系列断言宏,如 assert!
和 assert_eq!
。它们对快速单元测试非常有效,但随着代码库和测试套件的成长到一定程度,测试变得越来越困难,并且测试的可读性也在下降。
例如,当使用 assert_eq!
宏测试两个结构体是否相等时,输出并没有提供很多帮助来理解为什么这个测试失败了。
#[derive(PartialEq, Debug)]
struct Person {
name: &'static str,
age: usize,
}
#[test]
fn test_eq() {
let person1 = Person {name: "Bob", age: 12 };
let person2 = Person {name: "Alice", age: 20 };
assert_eq!(person1, person2, "These two must be the same person!");
}
我们通常只能得到一行折叠的文本墙,你必须自己找到两个结构体之间的差异。当结构体有10+个字段时,这会变得非常耗时。
---- eq::test_eq stdout ----
thread 'eq::test_eq' panicked at 'assertion failed: `(left == right)`
left: `Person { name: "Bob", age: 12 }`,
right: `Person { name: "Alice", age: 20 }`: These two must be the same person!', src/eq.rs:13:5
使用 k9::assert_equal
宏可以改进输出,并打印两个结构体之间的差异
use k9::assert_equal;
assert_equal!(person1, person2, "These two must be the same person!");
基于不等性的断言
测试等价性非常简单,并且绝对适用于大多数情况,但仅使用 assert!
和 assert_eq!
的一个缺点是当出现失败时的错误消息。例如,如果您正在测试代码是否生成有效的URL
let url = generate_some_url();
assert_eq!(URL_REGEX.is_match(url), true);
您将得到的是
thread 'eq::test_eq3' panicked at 'assertion failed: `(left == right)`
left: `false`,
right: `true`', src/eq.rs:19:5
这并没有太多帮助。尤其是如果您是代码库的新手,看到类似 expected 'true' but got 'false'
这样的内容会迫使您查看代码,而您甚至不知道问题可能是什么,这可能会非常耗时。
我们可能想要看到的是
这为我们提供了足够的上下文,说明了问题的性质以及如何修复它,而无需我们首先运行/调试测试。
依赖关系
~5–17MB
~192K SLoC