如何提高C ++中的分支覆盖率

时间:2017-10-04 22:20:53

标签: c++ code-coverage lcov catch-unit-test

我有一个相当大的C++ library测试套件,线路覆盖率接近100%,但只有55.3%的分支机构覆盖率。略过lcov的结果,似乎大多数错过的分支可以通过C ++解释std::bad_alloc的许多方法来解释,例如无论何时构建std::string

enter image description here

我问自己如何在这种情况下改善分支覆盖率,并认为有一个new运算符可以配置为在命中所需的分配之后抛出std::bad_alloc会很好我的测试套件中错过了每个分支。

我(天真地)尝试定义一个全局void* operator new (std::size_t)函数,该函数会计算全局int allowed_allocs并在达到std::bad_alloc时抛出0

但这有几个问题:

  • 很难获得new来电的数量,直到"第一"期望throw。我可以执行一个空运行来计算所需的调用成功,但是如果多个调用在同一行中失败,这可能无效,例如:类似std::to_string(some_int) + std::to_string(another_int)的内容,其中每个std::to_string,通过operator+进行连接以及初始分配可能会失败。
  • 更糟糕的是,我的测试套件(我正在使用Catch)本身使用了很多new次调用,所以即使我知道我的代码需要多少次调用,也很难猜猜有多少额外的测试套件调用是必要的。 (更糟糕的是,Catch有几个"冗长的"模式,它们创造了许多输出,再次需要记忆......)

您是否知道如何改善分支机构覆盖范围?

更新2017-10-07

与此同时,我发现https://stackoverflow.com/a/43726240/266378带有Python脚本的链接,用于过滤由lcov输出中的异常创建的一些分支。这使我的分支机构覆盖率达到71.5%,但剩下的不合适分支机构仍然非常奇怪。例如,我有几个这样的if语句:

if statement with unhit branch

有四个(?)分支,其中一个仍然是unhit(reference_tokenstd::string)。

有没有人知道这些分支是什么意思以及它们如何被击中?

2 个答案:

答案 0 :(得分:1)

前一阵子我成功了。我没有测试套件,只是运行我的应用程序,但发现了以下内容。

某种形式的被测物被隔离很重要。我有矢量和地图,当它们也容易发生时基本上会中断测试。

当我在故障注入和故障点之间有一个IPC时,我认为我成功了。这使得故障注入器代码可以独立于被测物件

进行新的和删除

在同一个二进制文件中,我也成功地使用了类似的东西,但是有两个独立的分配路径 - 一个用于故障注入代码的自定义分配器 - 确保它不会受到干扰。

我成功的系统采用了malloc的调用堆栈,并通过IPC将其发送到另一个程序。它决定它之前是否已经看过堆栈,如果没有,它就失败了。然后程序可能崩溃并失败(捕获核心转储),然后重新启动测试系统。  这大大提高了我正在开发的代码的质量。

答案 1 :(得分:0)

您想要测试哪些代码 - 您的代码或标准库?我觉得你的报道报告告诉你关于std :: string'的分支。而不是你的代码。

你能配置' lcov'忽略std库并只关注你的代码?