测试数据生成

本章解释了 Coco 测试数据生成功能背后的原理。

遗传算法原理

Coco 发现新的测试用例的方法是使用基于现有单元测试的遗传算法,以发现最优的输入数据集。

首先,用户提供一个单元测试,其中包含输入参数(整数、浮点数、字符串等)和产生的某些输出(同样为整数、浮点数、字符串等)。假设测试 T 有 2 个参数,一个字符串和一个整数,以及 1 个输出,一个浮点数。这定义了一个 数据行

每次这个测试执行时,Coco 都知道覆盖率。

例如

调用输出覆盖率
1T("", 0 )0.020%
2T("a",1)3.050%

Coco 将尝试通过混合 3 种技术来寻找新的测试数据行,以增加代码覆盖率

  • 使用随机参数
  • 参数变异
  • 执行两个测试的杂交

每个新生成的行都只保留如果它对总体覆盖率有所贡献。

让我们在我们的示例中运行这个。最初,没有可用的测试数据。算法只选择随机值

调用输出覆盖率
1T("x", 0 )0.020%
2T("a",10)3.050%
3T("ab",-4)3.0与第 2 行相同

在执行 3 个测试之后,将保留 2 行。第 3 行的覆盖率与第 2 行相同,因此是冗余的。所以完整的列表将是

调用输出覆盖率
1T("x", 0 )0.020%
2T("a",10)3.050%

对于下一个测试,算法可以选择执行变异或杂交。这个决定是随机做出的。

假设它执行变异:它从一个先前行中取来并更改一个参数。我们使用 T("x", 0 ) 并将第二个参数替换为 -1:T("x", -1 )。如果覆盖率增加,则保留结果,如果不增加的话,尝试其他方案。

如果使用杂交,那么我们将两个测试参数混合在一起。在这种情况下,我们可以取第一行的第一个参数和第二行的第二个参数。这将给出测试 T("x",10)

这个算法可以无限期地迭代。

遗传方法的好处

遗传算法的主要优势在于,如果一组数据发现了一片未发现的代码分支,突变和交叉是高效地发现该分支的技术。代码覆盖率测量指导算法。

Coco v7.2.0©2024 Qt公司有限公司。
Qt及其相关商标是芬兰和/或其他国家/地区的Qt公司的商标。所有其他商标均为其各自所有者的财产。