我有一个相当大的C++ library测试套件,线路覆盖率接近100%,但只有55.3%的分支机构覆盖率。略过lcov
的结果,似乎大多数错过的分支可以通过C ++解释std::bad_alloc
的许多方法来解释,例如无论何时构建std::string
。
我问自己如何在这种情况下改善分支覆盖率,并认为有一个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+
进行连接以及初始分配可能会失败。new
次调用,所以即使我知道我的代码需要多少次调用,也很难猜猜有多少额外的测试套件调用是必要的。 (更糟糕的是,Catch有几个"冗长的"模式,它们创造了许多输出,再次需要记忆......)您是否知道如何改善分支机构覆盖范围?
与此同时,我发现https://stackoverflow.com/a/43726240/266378带有Python脚本的链接,用于过滤由lcov输出中的异常创建的一些分支。这使我的分支机构覆盖率达到71.5%,但剩下的不合适分支机构仍然非常奇怪。例如,我有几个这样的if语句:
有四个(?)分支,其中一个仍然是unhit(reference_token
是std::string
)。
有没有人知道这些分支是什么意思以及它们如何被击中?
答案 0 :(得分:1)
前一阵子我成功了。我没有测试套件,只是运行我的应用程序,但发现了以下内容。
某种形式的被测物被隔离很重要。我有矢量和地图,当它们也容易发生时基本上会中断测试。
当我在故障注入和故障点之间有一个IPC时,我认为我成功了。这使得故障注入器代码可以独立于被测物件
进行新的和删除在同一个二进制文件中,我也成功地使用了类似的东西,但是有两个独立的分配路径 - 一个用于故障注入代码的自定义分配器 - 确保它不会受到干扰。
我成功的系统采用了malloc的调用堆栈,并通过IPC将其发送到另一个程序。它决定它之前是否已经看过堆栈,如果没有,它就失败了。然后程序可能崩溃并失败(捕获核心转储),然后重新启动测试系统。 这大大提高了我正在开发的代码的质量。
答案 1 :(得分:0)
您想要测试哪些代码 - 您的代码或标准库?我觉得你的报道报告告诉你关于std :: string'的分支。而不是你的代码。
你能配置' lcov'忽略std库并只关注你的代码?