我有一个相当大的C++ 库测试套件,其线路覆盖率接近 100%,但分支覆盖率只有 55.3%。浏览 的结果lcov
,似乎大多数遗漏的分支都可以用 C++ 的多种 throw 方法来解释std::bad_alloc
,例如,每当std::string
构造 an 时。
我在问自己如何在这种情况下提高分支覆盖率,并认为最好有一个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)
where eachstd::to_string
、连接 viaoperator+
以及初始分配可能失败,这将无济于事。- 更糟糕的是,我的测试套件(我正在使用 Catch)
new
本身使用了很多调用,所以即使我知道我的代码需要多少调用,也很难猜测测试套件需要多少额外的调用。(更糟糕的是,Catch 有几种“冗长”模式,它们会创建大量再次需要内存的输出......)
您知道如何提高分支覆盖率吗?
2017-10-07 更新
同时,我发现https://stackoverflow.com/a/43726240/266378带有指向 Python 脚本的链接,用于过滤由 lcov 输出中的异常创建的一些分支。这使我的分支覆盖率达到了 71.5%,但剩下的未命中分支仍然很奇怪。例如,我有几个这样的 if 语句:
有四个(?)分支,其中一个未命中(reference_token
是 a std::string
)。
有谁知道这些分支的含义以及它们是如何被击中的?