首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未分配给单独行的边界用例的代码覆盖率

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

Stack Overflow用户
提问于 2017-03-21 20:16:35
回答 1查看 69关注 0票数 1

我在Eclipse中使用Eclemma来展示我的类的测试覆盖率。但是,即使线路和分支的覆盖率都是100%,仍然可能有单元测试没有覆盖的情况。

示例:

代码语言:javascript
运行
复制
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)等。

据我所知,在这种情况下执行代码覆盖率的唯一方法是以以下方式编写代码:

代码语言:javascript
运行
复制
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%的分支覆盖率。

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-21 23:15:51

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

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

代码语言:javascript
运行
复制
myCos(double angle) {
   return Math.cos(angle);  
}

对于输入PI的值与

代码语言:javascript
运行
复制
myCos(double angle) {
   return -1;
}

然而,对于某些场景,您可以使用一种称为突变测试的技术来处理边界情况。但是这并不能告诉你你是否实现了正确的需求。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42926914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档