1

我在 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% 的分支覆盖率。

这显然不是实现该方法的最佳方式。有什么替代方案可以解决这个问题?代码覆盖工具中是否有任何注释可以更方便地标记边界情况?通常,处理我的示例的最佳实践是什么?

4

1 回答 1

2

从线路/条件覆盖的角度来看,没有错。您的代码只有一行,只有一个分支,它们都被覆盖了。从测试的角度来看,您假设 的正确性Math.cos()并且您的代码在这方面工作正常,我会说这很好。

但是那些覆盖率分析器是相当愚蠢的工具,它们不会告诉你,你是否测试了正确的东西,因此你需要实际使用你的大脑并设计适当的测试用例来定义你的问题域的约束。

myCos(double angle) {
   return Math.cos(angle);  
}

与输入PI相同

myCos(double angle) {
   return -1;
}

不过,对于某些情况,您可以使用一种称为突变测试的技术来解决边界情况。但这并不能告诉您是否实施了正确的要求。

如果您想实现一个替代方案Math.cos(),并且您的假设是 Math.cos() 是正确的,您实际上可以使用它来验证您的实现的正确性,从 0 迭代到 2*PI 并比较您的值的实施Math.cos()

于 2017-03-21T15:15:51.037 回答