13 个版本 (稳定版)
1.5.0 | 2024 年 4 月 2 日 |
---|---|
1.4.1 | 2023 年 2 月 28 日 |
1.4.0 | 2022 年 7 月 19 日 |
1.2.2 | 2021 年 12 月 25 日 |
0.1.0 | 2020 年 8 月 21 日 |
在 测试 中排名第 10
每月下载量 331,634
在 171 个crate中使用(直接使用159个)
28KB
662 行
expect-test
Rust 的极简快照测试库。
更新失败的测试
添加新的测试
更多请参考文档:[链接](https://docs.rs/expect-test)
lib.rs
:
Rust 的极简快照测试库。
简介
expect_test
是在原始的 assert_eq!
测试方法上的一些扩展,它允许自动更新测试结果。
该库的核心是 expect!
宏。它可以被视为一个自我更新的超级字符串字面量。
让我们看一个例子
use expect_test::expect;
let actual = 2 + 2;
let expected = expect!["5"]; // or expect![["5"]]
expected.assert_eq(&actual.to_string())
运行此代码将产生测试失败,因为 "5"
实际上不等于 "4"
。但是,通过设置环境变量 UPDATE_EXPECT=1
来运行测试,代码会“神奇地”更新为
let actual = 2 + 2;
let expected = expect!["4"];
expected.assert_eq(&actual.to_string())
当你有大量具有详细且可能变化的预期输出的测试时,这非常有用。
在底层,expect!
宏使用 file!
、line!
和 column!
在编译时记录源位置。在运行时,如果设置了 UPDATE_EXPECT
,则使用此位置就地修复文件。
指南
expect!
返回一个 Expect
结构体的实例,该实例包含位置信息和字符串字面量。使用 Expect::assert_eq
进行字符串比较。使用 Expect::assert_debug_eq
进行详细的调试比较。注意,前导缩进会自动删除。
use expect_test::expect;
#[derive(Debug)]
struct Foo {
value: i32,
}
let actual = Foo { value: 92 };
let expected = expect![["
Foo {
value: 92,
}
"]];
expected.assert_debug_eq(&actual);
请注意使用 assert_debug_eq
- 通常,调试表示的稳定性不能保证。然而,即使它发生变化,您也可以通过设置环境变量 UPDATE_EXPECT
来运行测试套件,从而快速更新所有测试。
如果预期数据太冗长,无法内联包含,您可以使用 expect_file!
宏将其存储在外部文件中
use expect_test::expect_file;
let actual = 42;
let expected = expect_file!["./the-answer.txt"];
expected.assert_eq(&actual.to_string());
文件路径相对于当前文件。
建议的工作流程
我喜欢使用与 expect_test
的数据驱动测试。我通常定义一个单独的驱动函数 check
,然后从各个测试中调用它
use expect_test::{expect, Expect};
fn check(actual: i32, expect: Expect) {
let actual = actual.to_string();
expect.assert_eq(&actual);
}
#[test]
fn test_addition() {
check(90 + 2, expect![["92"]]);
}
#[test]
fn test_multiplication() {
check(46 * 2, expect![["92"]]);
}
每个测试的主体是对 check
的单个调用。所有测试中的变化都来自输入数据。
在编写新测试时,我通常复制粘贴一个旧的测试,留空 expect
,并使用 UPDATE_EXPECT
填充值
#[test]
fn test_division() {
check(92 / 2, expect![[]])
}
有关野外快照测试的酷例,请参阅 https://blog.janestreet.com/using-ascii-waveforms-to-test-hardware-designs/
替代方案
维护状态
此库的主要客户是 rust-analyzer。库是稳定的,计划不会发布超过 1.0 的任何主要版本。
最低支持的 Rust 版本
此crate的最低支持的 rustc
版本是 1.60.0
。MSRV 谨慎更新,支持大约 10 个 rustc
的次要版本。MSRV 升级不是 semver 破坏,但至少需要次要版本升级。
依赖关系
~115KB