首页 文章

未分配给单独行的边界案例的代码覆盖率

提问于
浏览
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%的分支覆盖 .

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

1 回答

  • 2

    从线/条件覆盖的角度来看,没有任何错误 . 您的代码只有一行,只有一个分支,两者都包含在内 . 从测试的角度来看,你假设 Math.cos() 的正确性,你的代码在这方面工作得很好,我会说没问题 .

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

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

    对于输入 PI 是相同的

    myCos(double angle) {
       return -1;
    }
    

    尽管如此,对于某些情况,您可以使用称为Mutation Testing的技术帮助处理边界情况 . 但是,如果您实施了正确的要求,这也不会告诉您 .

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

相关问题