gpt4 book ai didi

testing - 数据流覆盖

转载 作者:行者123 更新时间:2023-11-28 19:57:21 24 4
gpt4 key购买 nike

如果您编写一个程序,通常可以驱动它以覆盖所有路径。因此,很容易获得 100% 的覆盖率(忽略现代编译器无论如何都会捕捉到的不可行的代码路径)。

但是,100% 的代码覆盖率应该意味着也实现了所有变量定义-使用覆盖率,因为变量是在程序中定义并在程序中使用的。如果所有代码都被覆盖,那么所有 DU 对也应该被覆盖。

那为什么说路径覆盖更容易获得,而数据流覆盖通常不能做到100%呢?我不明白为什么不呢?有什么例子可以说明这一点?

最佳答案

与所有可能的输入相比,实现 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 个(假设 double 是 64 位宽)。

背后的想法All-pairs Testing是测试每个可能的输入是不切实际的,因此我们必须确定涵盖所有情况的范围。

使用我的 invert() 函数,至少有两个集合很重要:{非零值} 和 {zero}。

我们需要添加另一个测试,它涵盖相同的代码路径,但有不同的结果:

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,那么我们就会错过一个错误。了解算法的设计方式对于理解单元测试的正确输入非常重要,这就是编写代码的程序员需要参与单元测试的原因。

关于testing - 数据流覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com