在不修改/编译代码的情况下用c ++进行变异测试

时间:2013-06-20 08:56:51

标签: c++ testing mutation-testing

目前我有一些测试被归咎于没有很好地捕获错误。我想进行突变测试以检测它们(并防止添加新的无用的),但没有时间效率低的循环:更改代码 - >重新编译 - >运行测试 - >更改代码 - >重新编译 - >运行测试......等等。

最初我想以某种方式直接改变二进制精灵文件(无需重新编译),但正如后面的帖子建议的那样,没有任何意义。

2 个答案:

答案 0 :(得分:3)

好的,通过将突变测试分为4个主要阶段,我能够部分地解决它:

  • 使用python / clang-tooling检测所有突变中的代码(选定的C ++表达式包含在一个特殊的宏中,它将调用委托给一个突变类,为每个突变生成ID,控制变异操作符的激活等)
  • 重新编译代码(仅一次
  • 并行运行测试,所有突变都处于非活动状态,并获取所有突变的ID(如果测试失败,请将它们放在忽略列表中),
  • 并行运行测试,同时在运行时切换突变(通过上一步获得的ID),并收集统计数据(突变杀死率等)

实现是在python和C ++中完成的,它是大约1700行代码(带有测试)+生产代码中的小修改(CMake和gtest main.cpp文件)。它只支持几个简单的突变,但它仍然很有趣:)

答案 1 :(得分:2)

  

假设测试运行得很快,并且运行次数足够大(~1M,~1k ??),我应该粗略估计潜在错误的命中率?

没有。你的“精灵二进制文件中某处的一位错误”可能会破坏任何东西(从精灵格式到数据段再到调用堆栈等等)。您不会对错误的数量进行任何粗略的估计,而是粗略估计可执行文件的执行损坏的可能性(根本不说明您的应用程序)。

  

目前我有很多测试被归咎于根本没有捕获错误。

这是您必须直接解决的问题,并且没有捷径可供选择:您必须为测试建立新目标,重构代码以支持它们并实施它们。