想象一下以下情况:有一个遗留应用程序我想编写测试,以便能够重构(丑陋)代码。
现在有很多代码可以处理一些约束。基本上它归结为这个签名:
public Boolean isValidRequest(Boolean constraint0, Boolean constraint1, Boolean constraint2, BooleanConstraint3) {
return constraint0 && constraint1 && constraint2 && constraint3;
}
现在我要测试的就是“链接”(这里所有的约束都与“&&”相关联,但我想确保它保持不变,例如没有拼写错误!)
为了测试所有组合,我必须编写n²个测试,其中n是约束的数量。这里将是4²,因此进行了16次测试。 我想知道是否有更简单的方法。唯一有效的测试用例是:
@Test
public void testAllConstraintsFulfilled() {
assertThat(myObjectToTest.isValidRequest(true, true, true, true)).isTrue();
}
虽然所有其他组合都会失败。我想知道是否有一种方法我不知道要不要手动编写其他15个测试用例,而是说:
1) Try all combinations
2) Only (true, true, true, true) should not fail
我有mockito,assertj和junit4可用。任何提示,想法?
答案 0 :(得分:1)
这里有两种方式:
A)你转向覆盖;并且你一直在编写测试用例,直到你达到100%。您无需测试所有可能的路径 - 只需要您的程序可以使用的现有路径!
B)你改变了这种方法:而不是将测试用例写入命中路径;您使用生成测试的解决方案。换句话说:您提供规则,并且引擎会验证测试中的代码是否与这些规则匹配。 QuickCheck将是此类工具的一个示例。