【发布时间】:2017-07-18 07:11:54
【问题描述】:
我团队最近的一场辩论让我感到好奇。基本主题是我们应该用功能/集成测试覆盖多少和什么(当然,它们不一样,但这个例子是假的,这无关紧要)。
假设您有一个“控制器”类,例如:
public class SomeController {
@Autowired Validator val;
@Autowired DataAccess da;
@Autowired SomeTransformer tr;
@Autowired Calculator calc;
public boolean doCheck(Input input) {
if (val.validate(input)) {
return false;
}
List<Stuff> stuffs = da.loadStuffs(input);
if (stuffs.isEmpty()) {
return false;
}
BusinessStuff businessStuff = tr.transform(stuffs);
if (null == businessStuff) {
return false;
}
return calc.check(businessStuff);
}
}
我们确实需要大量的单元测试(例如,如果验证失败,或者数据库中没有数据,......),这是毫无疑问的。
我们的主要问题是我们不能达成一致意见的是集成测试应该涵盖多少:-)
我支持我们的目标是减少集成测试(测试金字塔)。我要涵盖的只是一条快乐-不快乐的路径,执行从最后一行返回,只是为了看看我是否将这些东西放在一起它不会爆炸。
问题在于,要判断为什么测试结果为假并不那么容易,这让一些人对此感到不安(例如,如果我们只检查返回值,隐藏了测试是绿色的,因为有人更改了验证并返回 false)。当然,是的,我们可以涵盖所有情况,但恕我直言,这将是一个严重的矫枉过正。
对于这类问题,有没有人有好的经验法则?还是推荐?读?讲话?博文?有什么话题吗?
提前非常感谢!
PS:抱歉这个丑陋的例子,但很难将特定的代码部分翻译成一个例子。是的,人们可以争论抛出异常/使用不同的返回类型/等等。但由于外部依赖,我们的手或多或少受到了束缚。
【问题讨论】:
-
我投票决定将此问题作为离题结束,因为它属于 softwareengineering.stackexchange.com 。然而,这是一个非常好的问题!
-
我不同意搁置,因为我要求提供一些参考资料(文章、对 Google 隐藏的神奇 Martin Fowler 卷轴、关于上述情况的具体文章等)。无论如何,我会将问题添加到 se.so.com 并在此处留下链接。
标签: java unit-testing testing automated-tests integration-testing