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

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

我有一个相当大的测试套件 C++ library线路覆盖率接近 100%,但分支机构覆盖率仅为 55.3%。浏览一下 lcov 的结果,似乎大多数遗漏的分支都可以用 C++ 的许多方法来解释 std::bad_alloc,例如每当构造 std::string 时。

enter image description here

我在问自己如何在这种情况下提高分支覆盖率,并且认为有一个可以配置为抛出 std::bad_allocnew 运算符会很好> 在达到我的测试套件中错过的每个分支所需的分配数量之后。

我(天真地)尝试定义一个全局 void* operator new (std::size_t) 函数,它对全局 int allowed_allocs 进行倒计时并抛出 std: :bad_alloc 每当达到 0 时。

虽然这有几个问题:

  • 很难获得调用的数量,直到“第一个”所需的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

有四个(?)分支,其中一个未命中(reference_token 是一个 std::string)。

有谁知道这些分支是什么意思以及如何攻击它们?

最佳答案

您想测试谁的代码 - 您的代码还是标准库?令我震惊的是,您的覆盖率报告告诉您的是“std::string”中的分支,而不是您的代码。

您能否配置“lcov”以忽略标准库并只专注于您的代码?

关于c++ - 如何提高 C++ 中的分支覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46575061/

相关文章:

c++ - 类和类成员的联系

c++ - 从 QPushbutton 继承的类不显示文本

node.js - 使用 Karma 覆盖 NodeJS

c - 如何使用 gcov/lcov 为 fork() 的 child 生成覆盖率报告?

code-coverage - kcov vs lcov vs 原始性能?

c++ - LCOV/GCOV 分支覆盖,C++ 生成分支遍布各处

c++ - Google glog 不打印堆栈跟踪

C++ 对类数据成员的引用

java - 当前哪些 Java 代码覆盖率工具可以从测试的角度显示覆盖率?

go - golang安装覆盖包时出现的问题