Nic*_*ick 5 testing unit-testing rust
假设我有一个名为add添加两个数字的 Rust 函数。我想编写一套全面的单元测试以确保它始终有效。
据我所知,有两种方法可以编写测试。
\nassert_eq!在一个测试函数中多次使用这些都不理想(见下文)。还有另一种更好的方法来用 Rust 编写单元测试吗?
\n#[test]\nfn test() {\n assert_eq!(add(1, 2), 3);\n assert_eq!(add(2, 4), 5);\n assert_eq!(add(2, 3), 5);\n}\nRun Code Online (Sandbox Code Playgroud)\n当一切都过去后,这很有效。但如果一个断言失败了,你就不知道是哪一个断言失败了。例如,在上面的测试中,您获得的唯一帮助是“左:6,右:5”。哪个断言导致了这个?这很容易分辨,因为add这是微不足道的,但对于任何非微不足道的事情,你都一无所知。
#[test]\nfn add_1_and_2() {\n assert_eq!(add(1, 2), 3);\n}\n\n#[test]\nfn add_2_and_4() {\n assert_eq!(add(2, 4), 6);\n}\nRun Code Online (Sandbox Code Playgroud)\n这解决了使用多个断言的所有问题。然而,测试变得非常冗长,您需要为每个测试创建一个唯一的函数名称。想象一个具有 4-5 个不同参数的函数,并且您正在测试所有组合。有很多难以命名的函数!但至少你会知道哪个断言是错误的。
\n理想情况下,我正在寻找一个与使用 Jest 进行 JavaScript 测试具有相同功能的解决方案。
\nconst tests = [[1, 2, 3], [2, 4, 6]];\n\nit.each(tests)("adding %s and %s gives %s", ([a, b, result]) => {\n expect(add(a, b)).toBe(result);\n})\nRun Code Online (Sandbox Code Playgroud)\n如果其中一项测试失败,Jest 会准确地告诉您是哪一项测试失败。而且实际的测试代码非常简洁易读。
\n部分原因是风格问题和个人喜好。在执行许多类似的操作时,第一种方法非常常见,因此我认为它很常见。
但是,这并不意味着您无法判断哪个测试失败了。我得到这样的输出:
thread 'tests::test' panicked at 'assertion failed: `(left == right)`
left: `6`,
right: `5`', src/main.rs:15:9
Run Code Online (Sandbox Code Playgroud)
这告诉我第 15 行的断言失败了。如果您正在调用某个进行测试和调用的函数assert_eq!,并且您需要知道是哪个调用导致了它,则可以使用它RUST_BACKTRACE=1来查看回溯并找到适当的行。
format!您还可以在描述后编写描述(带有附加格式参数,就像):
#[test]
fn test() {
assert_eq!(add(1, 2), 3, "add 1 and 2");
assert_eq!(add(2, 4), 5, "add 2 and 4");
assert_eq!(add(2, 3), 5, "add 2 and 3");
}
Run Code Online (Sandbox Code Playgroud)
然后您将在输出中看到失败的测试名称(请注意,它现在显示“add 2 and 4”):
thread 'tests::test' panicked at 'assertion failed: `(left == right)`
left: `6`,
right: `5`: add 2 and 4', src/main.rs:15:9
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢表驱动的方法,也有一些方法可以做到这一点:
#[test]
fn test() {
let conditions = &[(1, 2, 3), (2, 4, 5), (2, 3, 5)];
for (a1, a2, sum) in conditions {
assert_eq!(add(*a1, *a2), *sum, "add {} and {}", a1, a2);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您的测试参数很长且不易打印:
#[test]
fn test() {
let conditions = &[
(1, 2, 3, "test case 1"),
(2, 4, 5, "test case 2"),
(2, 3, 5, "test case for bug #12345"),
];
for (a1, a2, sum, desc) in conditions {
assert_eq!(add(*a1, *a2), *sum, "{}", desc);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |