Nie*_*ann 5 c++ code-coverage lcov catch-unit-test
我有一个相当大的C++ 库测试套件,行覆盖率接近 100%,但分支覆盖率只有 55.3%。浏览 的结果lcov,似乎大多数错过的分支都可以用 C++ 的多种抛出方法来解释std::bad_alloc,例如每当std::string构造 an 时。
我问自己在这种情况下如何提高分支覆盖率,并认为如果有一个new操作符可以配置std::bad_alloc为在命中测试套件中错过的每个分支所需的分配数量后抛出,那就太好了。
我(天真地)尝试定义一个全局void* operator new (std::size_t)函数,该函数对全局进行倒计时并在到达时int allowed_allocs抛出异常。std::bad_alloc0
但这有几个问题:
new在“第一次”需要之前很难获得呼叫数量throw。我可以执行试运行来计算成功所需的调用,但是如果多个调用可能在同一行中失败,则这无济于事,例如,类似于std::to_string(some_int) + std::to_string(another_int)where every std::to_string、串联 viaoperator+以及初始分配可能会失败。new调用,因此即使我知道我的代码需要多少次调用,也很难猜测测试套件需要多少次额外调用。(更糟糕的是,Catch 有几种“详细”模式,它们会创建大量输出,而这些输出又需要内存......)您知道如何提高分支机构覆盖率吗?
同时,我发现/sf/answers/3060836831/包含一个 Python 脚本的链接,用于过滤 lcov 输出中的异常创建的一些分支。这使我的分支覆盖率达到了 71.5%,但是剩下的未命中的分支仍然很奇怪。例如,我有几个这样的 if 语句:
有四个 (?) 分支,其中一个分支未被击中 (reference_token是 a std::string)。
有谁知道这些分支意味着什么以及如何攻击它们?
不久前我在这方面取得了成功。我没有测试套件,只是运行我的应用程序,但发现了以下内容。
对被测事物进行某种形式的隔离很重要。我有矢量和地图,当它们也容易发生时,它们基本上中断了测试。
我认为当我在故障注入和故障点之间有一个 IPC 时我就成功了。这允许故障注入器代码独立于被测试的事物来新建和删除
当在同一个二进制文件中时,我也成功地完成了类似的事情,但有两个独立的分配路径 - 一个用于错误注入代码的自定义分配器 - 这确保它不会受到干扰。
我成功的系统获取了 malloc 的调用堆栈,并通过 IPC 将其发送到另一个程序。它决定之前是否见过堆栈,如果没有,则分配失败。然后程序可能崩溃并失败(核心转储被捕获),然后测试系统重新启动。这极大地提高了我正在开发的代码的质量。
| 归档时间: |
|
| 查看次数: |
3705 次 |
| 最近记录: |