首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用锈菌编写综合单元测试

用锈菌编写综合单元测试
EN

Stack Overflow用户
提问于 2021-07-01 21:55:37
回答 1查看 626关注 0票数 3

假设我有一个名为add的Rust函数,它添加了两个数字。我想要写一套全面的单元测试,以确保它始终有效。

据我所知,有两种方法可以编写测试。

在一个测试function

  • Create中,
  1. 多次使用assert_eq! --许多不同的函数--每个inputs/outputs

集一个

这两种方法都不是理想的(见下文)。还有另一种更好的用锈蚀编写单元测试的方法吗?

使用多个断言

代码语言:javascript
复制
#[test]
fn test() {
  assert_eq!(add(1, 2), 3);
  assert_eq!(add(2, 4), 5);
  assert_eq!(add(2, 3), 5);
}

当一切都过去的时候,这一切都很好。但是如果一个断言失败了,你就不知道是哪个了。例如,在上面的测试中,您得到的唯一帮助是“左: 6,右: 5”。是哪个断言导致了这一切?这是相当容易分辨的,因为add是微不足道的,但是在任何非平凡的事情中,您都不知道。

使用多功能

代码语言:javascript
复制
#[test]
fn add_1_and_2() {
  assert_eq!(add(1, 2), 3);
}

#[test]
fn add_2_and_4() {
  assert_eq!(add(2, 4), 6);
}

这解决了使用多个断言的所有问题。但是,测试变得非常冗长,您需要为每个测试创建一个唯一的函数名。假设一个函数有4-5个不同的参数,您正在测试所有的组合。这是很多很难命名的函数!但至少你会知道哪个断言会中断。

JavaScript等效

理想情况下,我正在寻找一个与使用Jest的JavaScript测试具有相同功能的解决方案。

代码语言:javascript
复制
const tests = [[1, 2, 3], [2, 4, 6]];

it.each(tests)("adding %s and %s gives %s", ([a, b, result]) => {
    expect(add(a, b)).toBe(result);
})

如果其中一个测试失败了,Jest会告诉你到底是哪一个。而实际的测试代码是非常简洁和可读的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 23:29:15

部分原因是风格问题和个人喜好。在执行许多类似的操作时,第一种方法非常常见,所以我认为这是常见的。

但是,这并不意味着您无法判断哪个测试失败了。我得到了这样的输出:

代码语言:javascript
复制
thread 'tests::test' panicked at 'assertion failed: `(left == right)`
  left: `6`,
 right: `5`', src/main.rs:15:9

这告诉我,第15行的断言失败了。如果您正在调用某个进行测试和调用assert_eq!的函数,并且需要知道其中哪个调用导致了调用,则可以使用RUST_BACKTRACE=1查看回溯并找到适当的行。

您还可以在描述之后编写一个描述(带有附加的格式参数,就像format!):

代码语言:javascript
复制
#[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");
}

然后,您将看到输出中失败的测试名称(注意,它现在显示为"add 2 and 4"):

代码语言:javascript
复制
thread 'tests::test' panicked at 'assertion failed: `(left == right)`
  left: `6`,
 right: `5`: add 2 and 4', src/main.rs:15:9

如果您更喜欢使用表格驱动的方法,也有一些方法可以做到这一点:

代码语言:javascript
复制
#[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);
    }
}

或者,如果您的测试参数很长且不易打印:

代码语言:javascript
复制
#[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);
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68217374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档