我在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%的分支覆盖。
这显然不是实现该方法的最佳方式。有什么方法可以解决这个问题?代码覆盖工具中是否有任何注释以更方便的方式标记边框情况?一般来说,处理我的例子的最佳做法是什么?
答案 0 :(得分:2)
从线/条件覆盖的角度来看,没有错。您的代码只有一行,只有一个分支,两者都包含在内。
从测试角度来看,您假设 <?php
include "db.inc.php";
include "redirect.php";
session_start();
$id=$_POST['id'];
$data=$_POST['stringdata'];
echo $id;
?>
的正确性,并且您的代码在这方面工作正常,我说这很好。
但是那些覆盖率分析器是相当愚蠢的工具,他们不会告诉你,你是否测试过正确的东西,因此你需要实际使用你的大脑并设计适当的测试用例来定义你的问题域。
Math.cos()
输入myCos(double angle) {
return Math.cos(angle);
}
的与
相同PI
尽管如此,对于某些情况,您可以使用名为Mutation Testing的技术帮助处理边界情况。但是,如果您实施了正确的要求,这并不能告诉您。
如果您想要实现myCos(double angle) {
return -1;
}
的替代方案,并且您的假设是,Math.cos()是正确的,您实际上可以使用它来验证实现的正确性,从0迭代到2 * PI并将您的实施值与Math.cos()
的值进行比较。