【发布时间】: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_returnsAllUniquePerformers 和 findAllPerformers_returnsEachPerformerOnlyOnce。但后来我意识到我的第一个方法也测试了这两个条件!
那么,我该怎么办?
- 保留所有方法。
- 删除其他 2 个测试方法并将我的
findAllPerformers_returnsPerformersInAlphabeticalOrder方法重命名为包含所有三个条件的非常长的名称(因为它确实测试了所有三个条件!) - 只需删除其他 2 种测试方法即可。
- 保留所有方法,但从其他两个方法调用
findAllPerformers_returnsPerformersInAlphabeticalOrder方法。 - 将
findAllPerformers_returnsPerformersInAlphabeticalOrder方法内容复制粘贴到另外两个方法中。 - 还有什么...
【问题讨论】:
-
如果您还分别测试每个功能,我认为测试多个功能的单元测试没有任何问题。
-
那么,您建议“1. 保留所有方法。”?
-
一个断言应该测试一个条件。否则你无法判断哪一个失败了。但是,我不明白为什么一种方法不能用多个断言测试多个条件(如果它们是相关的)。
-
我无法进一步评论,因为您给了我们零功能。
-
您的示例看起来更像BDD,而不是单元测试。
标签: java unit-testing integration-testing