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

Download history 77809/week @ 2024-05-01 79104/week @ 2024-05-08 81081/week @ 2024-05-15 79747/week @ 2024-05-22 75710/week @ 2024-05-29 87707/week @ 2024-06-05 83280/week @ 2024-06-12 69123/week @ 2024-06-19 80021/week @ 2024-06-26 61932/week @ 2024-07-03 74045/week @ 2024-07-10 75364/week @ 2024-07-17 77060/week @ 2024-07-24 78277/week @ 2024-07-31 85833/week @ 2024-08-07 75904/week @ 2024-08-14

每月下载量 331,634
171 个crate中使用(直接使用159个)

MIT/Apache

28KB
662

expect-test

Docs

Rust 的极简快照测试库。

更新失败的测试

请查看更多文档:[链接](https://user-images.githubusercontent.com/1711539/120119633-73b3f100-c1a1-11eb-91be-4c61a23e7060.mp4)

添加新的测试

expect-fresh

更多请参考文档:[链接](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/

替代方案

  • insta - 一个功能更全面的快照测试库。
  • k9 - 一个测试库,包括对快照测试的支持等。

维护状态

此库的主要客户是 rust-analyzer。库是稳定的,计划不会发布超过 1.0 的任何主要版本。

最低支持的 Rust 版本

此crate的最低支持的 rustc 版本是 1.60.0。MSRV 谨慎更新,支持大约 10 个 rustc 的次要版本。MSRV 升级不是 semver 破坏,但至少需要次要版本升级。

依赖关系

~115KB