我在Eclipse中使用Eclemma来展示我的类的测试覆盖率。但是,即使线路和分支的覆盖率都是100%,仍然可能有单元测试没有覆盖的情况。
示例:
public double myCos(double angle) {
return Math.cos(angle);
}如果我使用测试类中的参数Math.PI调用此方法,行、分支和路径覆盖率将为100%,但使用此方法时,我没有测试所有相关的边界用例,如Math.cos(Math.PI * 0.5)、Math.cos(0)、Math.cos(Math.PI * 1.5)等。
据我所知,在这种情况下执行代码覆盖率的唯一方法是以以下方式编写代码:
public double myCos(double angle) {
if (angle == Math.PI) {
//Don't do anything. This is only for the coverage tool to enforce
//border case testing to achieve 100% coverage
}
//...other border cases
return Math.cos(angle);
}这样,测试代码必须通过边界用例才能实现100%的分支覆盖率。
这显然不是实现该方法的最佳方式。解决这个问题的替代方案是什么?代码覆盖率工具中是否有注释可以更方便地标记边界情况?一般来说,处理我的示例的最佳实践是什么?
发布于 2017-03-21 23:15:51
从行/条件覆盖的角度来看,没有任何问题。您的代码只有一行和一个分支,这两行都包含在内。从测试的角度来看,您假设Math.cos()是正确的,并且您的代码在这方面工作得很好,我会说这很好。
但这些覆盖率分析器是相当愚蠢的工具,它们不能告诉你,你是否测试了正确的东西,因此你需要实际使用你的大脑并设计适当的测试用例来定义问题域的约束。
myCos(double angle) {
return Math.cos(angle);
}对于输入PI的值与
myCos(double angle) {
return -1;
}然而,对于某些场景,您可以使用一种称为突变测试的技术来处理边界情况。但是这并不能告诉你你是否实现了正确的需求。
如果您想实现Math.cos()的替代方案,并且您的假设是Math.cos()是正确的,那么您实际上可以使用它来验证您的实现的正确性,从0迭代到2*PI并将您的实现的值与Math.cos()的值进行比较。
https://stackoverflow.com/questions/42926914
复制相似问题