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模式

Download history 1664/week @ 2024-04-23 1974/week @ 2024-04-30 1594/week @ 2024-05-07 1580/week @ 2024-05-14 1564/week @ 2024-05-21 1208/week @ 2024-05-28 1359/week @ 2024-06-04 1356/week @ 2024-06-11 1309/week @ 2024-06-18 1216/week @ 2024-06-25 1114/week @ 2024-07-02 1534/week @ 2024-07-09 1345/week @ 2024-07-16 1031/week @ 2024-07-23 926/week @ 2024-07-30 1038/week @ 2024-08-06

4,590 每月下载量
23 crates 中使用

MIT 许可证

76KB
1.5K SLoC

K9 - Rust测试库

Crates.io Docs.rs Rust CI

k9_header

快照测试 + 更好的断言

可用的测试宏

  • 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 运行测试后,将自动将新值插入测试源代码文件作为第二个参数,之后所有后续的测试运行都应开始通过。

inline_snapshot_demo

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_equal_example

基于不等性的断言

测试等价性非常简单,并且绝对适用于大多数情况,但仅使用 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' 这样的内容会迫使您查看代码,而您甚至不知道问题可能是什么,这可能会非常耗时。

我们可能想要看到的是

assert_matches_regex_example

这为我们提供了足够的上下文,说明了问题的性质以及如何修复它,而无需我们首先运行/调试测试。

依赖关系

~5–17MB
~192K SLoC