让我们假设有一个类(用类似Java的伪代码编写):
class MyClass {
...
public List<Element> getElementsThatContains(String str) {
return this.getElementsThatContains(new Set<String> { str });
}
public List<Element> getElementsThatContains(Set<String> strs) {
...
}
}
首先-我已经getElementsThatContains(Set<String> strs)
100%正确地得到了保障。
我应该如何涵盖getElementsThatContains(String str)
:
getElementsThatContains(String str)
吗? 答案 0 :(得分:0)
是的,您应该同时介绍两种方法。重构代码时,进行单元测试的原因是安全网。例如,某人可能会重构“ getElementsThatContains(String str)”的实现,并且它将始终返回一个空的List。尽管getElementsThatContains(Set strs)具有100%的覆盖率,但这些测试仍无法解决。
否,您不应使用一种测试方法来检查第一方法和第二方法的结果是否相同。通常认为这是一种不良做法。此外,如果一个方法中存在错误,则您的测试只需检查另一种方法是否返回相同的错误结果即可。
否,您不应该复制所有测试,因为每种方法的测试用例都不同。方法的参数不同。因此,尽管在同一方法下调用了相同的方法,但每个测试用例都会有不同的情况。
答案 1 :(得分:0)
是的,您应该测试这两种方法,并且每种方法都应使用不同的测试用例。
但是您应该减少对线路覆盖范围的关注。
不要误会我的意思!保持较高的线路覆盖率很重要。但是拥有100%的行为覆盖率更为重要。并且,如果您遇到未经测试的行,您的问题应该是:“ 是否需要此未经测试的代码(即,它实现了什么要求)还是过时了?” 。
当我们考虑到 line coverage 编写测试时,我们倾向于关注被测代码的实现细节。因此,当我们更改此实施细节时(例如在重构中),我们的测试很可能会失败。但是,只有在测试的行为发生变化时,我们的测试才会失败,而当我们改变实现这种行为的方式时,我们的测试就不会失败。