测试数据生成
本章解释了 Coco 测试数据生成功能背后的原理。
遗传算法原理
Coco 发现新的测试用例的方法是使用基于现有单元测试的遗传算法,以发现最优的输入数据集。
首先,用户提供一个单元测试,其中包含输入参数(整数、浮点数、字符串等)和产生的某些输出(同样为整数、浮点数、字符串等)。假设测试 T 有 2 个参数,一个字符串和一个整数,以及 1 个输出,一个浮点数。这定义了一个 数据行。
每次这个测试执行时,Coco 都知道覆盖率。
例如
行 | 调用 | 输出 | 覆盖率 |
---|---|---|---|
1 | T("", 0 ) | 0.0 | 20% |
2 | T("a",1) | 3.0 | 50% |
Coco 将尝试通过混合 3 种技术来寻找新的测试数据行,以增加代码覆盖率
- 使用随机参数
- 参数变异
- 执行两个测试的杂交
每个新生成的行都只保留如果它对总体覆盖率有所贡献。
让我们在我们的示例中运行这个。最初,没有可用的测试数据。算法只选择随机值
行 | 调用 | 输出 | 覆盖率 |
---|---|---|---|
1 | T("x", 0 ) | 0.0 | 20% |
2 | T("a",10) | 3.0 | 50% |
3 | T("ab",-4) | 3.0 | 与第 2 行相同 |
在执行 3 个测试之后,将保留 2 行。第 3 行的覆盖率与第 2 行相同,因此是冗余的。所以完整的列表将是
行 | 调用 | 输出 | 覆盖率 |
---|---|---|---|
1 | T("x", 0 ) | 0.0 | 20% |
2 | T("a",10) | 3.0 | 50% |
对于下一个测试,算法可以选择执行变异或杂交。这个决定是随机做出的。
假设它执行变异:它从一个先前行中取来并更改一个参数。我们使用 T("x", 0 ) 并将第二个参数替换为 -1:T("x", -1 )。如果覆盖率增加,则保留结果,如果不增加的话,尝试其他方案。
如果使用杂交,那么我们将两个测试参数混合在一起。在这种情况下,我们可以取第一行的第一个参数和第二行的第二个参数。这将给出测试 T("x",10)。
这个算法可以无限期地迭代。
遗传方法的好处
遗传算法的主要优势在于,如果一组数据发现了一片未发现的代码分支,突变和交叉是高效地发现该分支的技术。代码覆盖率测量指导算法。
Coco v7.2.0©2024 Qt公司有限公司。
Qt及其相关商标是芬兰和/或其他国家/地区的Qt公司的商标。所有其他商标均为其各自所有者的财产。