rle*_*ndi 6 java testing integration-testing automated-tests unit-testing
我团队最近的辩论让我很奇怪.基本主题是我们在功能/集成测试中应该涵盖多少以及它们应该包含哪些内容(当然,它们并不相同,但是这个示例在无关紧要的情况下是虚拟的).
假设您有一个"控制器"类,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我们需要进行大量的单元测试(例如,如果验证失败,或者DB中没有数据,......),这是不可能的.
我们的主要问题以及我们不能同意的是集成测试应涵盖多少:-)
我方面的目标是减少集成测试(测试金字塔).我从这里得到的只是一条快乐 - 不快乐的道路,执行从最后一行返回,只是为了看看我把这些东西放在一起它不会爆炸.
问题是,为什么测试结果是错误的并不容易,这让一些人感到不安(例如,如果我们只检查返回值,则隐藏测试为绿色因为某人更改了验证并返回false).当然,是的,我们可以涵盖所有案件,但这将是一个沉重的矫枉过正的imho.
对于这类问题,有没有人有一个很好的经验法则?还是推荐?读?谈论?博客帖子?关于这个主题的一切?
非常感谢提前!
PS:讽刺这个丑陋的例子,但很难将特定的代码部分翻译成一个例子.是的,人们可以争论抛出异常/使用不同的返回类型/等.但是由于外部依赖性,我们的手或多或少受到约束.
如果遵循以下规则,很容易弄清楚测试应该驻留在哪里:
让我们一起来,但首先让我们就术语达成一致:
如果我们建立一个平衡的金字塔,我们最终将对单元和组件级别进行大多数测试,其中很少将留给系统测试.这很好,因为较低级别的测试更快更容易.要做到这一点:
示例:用户名不能超过50个符号,只能有拉丁语以及一些特殊符号.
这是一个更精细的例子,说明如何实现平衡金字塔.