【问题标题】:How to show True/False Condition on Branch Coverage on Gcovr如何在 Gcovr 上的分支覆盖率上显示真/假条件
【发布时间】:2018-03-15 16:56:21
【问题描述】:

我一直在尝试获取我执行的测试用例在分支上所采用的条件。 例如,这是我从 Gcov 的gcov -b 获得的覆盖信息的片段(为了便于阅读,我还使用了-i 选项):

lcount:10,1
branch:10,nottaken 
branch:10,taken    

在检查了一些样本之后,似乎真实条件总是首先写在每个分支信息上。这意味着我可以确定执行的测试用例是采用分支的真部分还是假部分。而在这种情况下,测试用例在第 10 行取了分支的 false 部分。

现在,这是 Gcovr 的 --branches--xml 对同一程序和测试用例生成的 xml 的片段:

<line branch="true" condition-coverage="50% (1/2)" hits="1" number="10">
   <conditions>
      <condition coverage="50%" number="0" type="jump"/>
   </conditions>
</line>

在这里,我无法弄清楚分支的哪一部分被占用了。

我可以使用 Gcovr 上的任何选项吗?

【问题讨论】:

    标签: gcov gcovr


    【解决方案1】:

    gcovr XML 输出使用多种其他工具可以理解的 Cobertura XML 格式。这意味着 gcovr 仅限于该 XML 模式,并且不能包含额外信息。

    Gcovr 的 HTML 报告 (--html-details) 显示分支覆盖率。要查看哪些分支未被发现,通常最容易查看条件分支中的哪些语句未被发现。但是,分支覆盖率列也会显示小图标,指示采用了哪些分支。每个分支有一个指标/每个条件两个。绿色 ✔ 表示覆盖的分支,红色 ✘ 表示未覆盖的分支。

    在上面的示例中,第一个分支未被覆盖。第一个分支是否对应一个真或假条件是未定义。如果有疑问,请重写代码以仅使用语句级条件(无 … ? … : …&amp;&amp;|| 运算符),以便所有分支都是单独的语句。请注意,在 C++ 中,异常处理可能会引入其他可能难以/不可能覆盖的分支。

    提示:--branch 选项对于获取分支覆盖是不必要的。它只控制 gcovr 文本报告是否显示分支或行覆盖。

    【讨论】:

    • 所以没有办法从 Gcovr 的 xml 中获取信息。解析 html 以在我的程序中使用它会很困难。
    • 此时您可能更喜欢直接解析机器可读的 gcov 输出。 gcovr html报告是供人使用的,未来布局会发生变化。
    • 对不起,如果这是问这个问题的错误地方,但是否可以直接修改 Gcovr 的 python 脚本以在 xml 上添加一两行?我对 Python 的了解充其量只是初学者,所以目前我仍在四处浏览,看看是否有什么可以调整的。
    • 您将如何使用 XML?如果您更改结构,它将不再符合 Cobertura 格式。如果您想深入研究代码,请从 GitHub 获取开发版本并查看 gcovr/cobertura_xml_generator.py。目前,报告的条件覆盖率是从该行的所有分支汇总的。
    • 示例中的这张图片确实是人造的。当你有一个条件和真/假时,这很容易。但我有两个条件(a || b)和 4 个分支。在这里它变得棘手 - 我不知道哪个分支没有被覆盖,并且线路覆盖率是 100%
    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多