如果您编写程序,通常可以驱动程序以覆盖所有路径。因此,100%的覆盖率很容易获得(忽略现代编译器无法捕获的不可行的代码路径)。
然而,100%的代码覆盖率应该意味着所有变量定义 - 使用覆盖率也都会实现,因为变量是在程序中定义的并在其中使用。如果涵盖了所有代码,则还应涵盖所有DU对。
为什么然后,它是否说路径覆盖更容易获得,但数据流覆盖通常不可能实现100%?我不明白为什么不呢?有什么可以作为一个例子?
答案 0 :(得分:4)
比所有可能的输入更容易实现100%的代码覆盖率,因为所有可能输入的集合可能非常大或几乎无限制。 测试它们需要花费太多时间。
让我们看一个简单的示例函数:
double invert(double x) {
return 1.0/x;
}
单元测试可能如下所示:
double y = invert(5);
double expected = 1.0/5.0;
EXPECT_EQ( expected, y );
此测试实现了100%的代码覆盖率。但是,在1.8446744e + 19个可能的输入中只有1个(假设双倍是64位宽)。
All-pairs Testing背后的想法是,测试每个可能的输入是不切实际的,所以我们必须确定涵盖所有情况的范围。
使用invert()
函数,至少有两组重要:{非零值}和{零}。
我们需要添加另一个测试,它涵盖相同的代码路径,但结果不同:
EXPECT_THROWS( invert(0.0) );
此外,由于测试编写者必须设计不同的可能参数集以实现测试的完整数据输入覆盖,因此无法知道正确的集合是什么。
考虑这个功能:
double multiply(double x, double y);
我的直觉是为小数字编写测试,为大数字编写另一个测试,以测试溢出。
然而,开发人员可能以这种方式写得不好:
double multiply(double x, double y) {
if(x==0) return 0;
return 1.0 / ( (1.0/x) * (1.0/y) );
}
如果我们的测试没有使用0表示y,那么我们会错过一个错误。了解算法的设计方式对于理解单元测试的正确输入非常重要,这就是编写代码的程序员需要参与单元测试的原因。