【问题标题】:One assert statement tests several conditions一个断言语句测试几个条件
【发布时间】:2016-06-07 01:04:55
【问题描述】:

我发现了很多关于在一种方法(一个测试条件)中使用多个断言的不良做法的信息。很明显。每种方法都应测试一个且仅一个条件。所以在大多数情况下它应该是一个断言。

但如果我的一个断言测试了多个条件,我找不到任何关于最佳实践的信息。

例子:

@Test
public void findAllPerformers_returnsPerformersInAlphabeticalOrder() {
    List<String> performers = reportRepository.findAllPerformers();
    assertThat("Should return performers in alphabetical order",
            performers, contains("Bart Simpson", "Homer Simpson",
                    "Ned Flanders", "Xena Warrior Princess"));
}

首先,我必须有另外 2 个测试方法(条件):findAllPerformers_returnsAllUniquePerformersfindAllPerformers_returnsEachPerformerOnlyOnce。但后来我意识到我的第一个方法也测试了这两个条件!

那么,我该怎么办?

  1. 保留所有方法。
  2. 删除其他 2 个测试方法并将我的 findAllPerformers_returnsPerformersInAlphabeticalOrder 方法重命名为包含所有三个条件的非常长的名称(因为它确实测试了所有三个条件!)
  3. 只需删除其他 2 种测试方法即可。
  4. 保留所有方法,但从其他两个方法调用 findAllPerformers_returnsPerformersInAlphabeticalOrder 方法。
  5. findAllPerformers_returnsPerformersInAlphabeticalOrder 方法内容复制粘贴到另外两个方法中。
  6. 还有什么...

【问题讨论】:

  • 如果您分别测试每个功能,我认为测试多个功能的单元测试没有任何问题。
  • 那么,您建议“1. 保留所有方法。”?
  • 一个断言应该测试一个条件。否则你无法判断哪一个失败了。但是,我不明白为什么一种方法不能用多个断言测试多个条件(如果它们是相关的)。
  • 我无法进一步评论,因为您给了我们零功能。
  • 您的示例看起来更像BDD,而不是单元测试。

标签: java unit-testing integration-testing


【解决方案1】:

如果此测试失败,那么查看失败测试的人最初会看到findAllPerformers_returnsPerformersInAlphabeticalOrder()。 仅从这一点来看,被测方法似乎返回了一个不按字母顺序排列的列表,而不是该列表不包含“Bart Simpson”。

避免使用选项 4 和 5,它们并不能真正解决任何问题,并且会增加重复/维护而没有任何附加值(因为测试会因测试名称中未提及的原因而失败)。而是尝试找到一种方法来实际测试您想要的断言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多