【问题标题】:How to measure code coverage of the part of execution in C++如何测量 C++ 中执行部分的代码覆盖率
【发布时间】:2021-04-25 05:02:06
【问题描述】:

我有两个 C++ 二进制文件(A 和 B),两个二进制文件之间有套接字连接。
二进制 A 正在监听 B。并且,B 连接到 A。

A接受B的消息并根据消息内容执行一些功能。
我们创建了一种单元测试来测试各种消息类型。

从这些测试中,我想从我们的测试消息中测量 A 的执行行。
我搜索了测量代码覆盖率的工具,发现 lcov

但是,lcov 测量了总执行的代码行数,包括初始化和其他无用的块。
我可能会创建一个新代码来测试没有套接字连接的功能。
但代码结构复杂,实现测试需要很长时间。

所以,我想跳过lcov 中的那些行,以获取由我们的测试消息引起的纯粹执行的行

如果不可能并且有更好的工具来解决这种情况,请推荐合适的工具来衡量。

谢谢。

【问题讨论】:

  • "要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题与 Stack Overflow 无关" - 来自 @987654321 @
  • 您可以过滤掉整个文件,但我不确定是否有过滤文件内容的方法。您关心的行是否在他们自己的文件中?

标签: c++ code-coverage gcov lcov


【解决方案1】:

了解“覆盖”是一组源代码位置很重要。 您可以对集合进行“算术”运算:联合(“加”)、补、差(“减”)。

关键是要获得一个工具,可以(设置)减去测试覆盖率数据集。

然后您收集测试覆盖率以启动/停止您的程序。这包括初始化和设置。称这组为 I。

现在为您的程序执行感兴趣的活动收集测试覆盖率, 例如,“通信”部分。将此集合称为 X。

您想要的是通过从 X 中减去 I 计算得到的集合:集合符号中的“X-I”。

这意味着您需要一个工具来收集这些集合并进行计算。

我相信你可以用 lcov 收集 X 和 I。但我不认为 lcov 给你一种计算集合差异的方法。如果是这样,宾果游戏,你在做生意。

如果没有,您可以考虑使用我公司的测试覆盖率工具。它们提供了一种明确的方法来收集测试覆盖集,并且可以任意执行 在用户界面中设置计算,例如,设置并集、集补集、集差分。您无需更改代码即可执行此操作。

http://www.semdesigns.com/Products/TestCoverage/

【讨论】:

  • 这对我来说也是一个不错的建议。但我认为稍微修改源代码可能是一个更好的解决方案,因为我必须重新学习这个工具。谢谢你的回答!
【解决方案2】:

在您的测试用例之前调用__gcov_reset 以丢弃从初始化收集的数据。

【讨论】:

  • 这意味着您必须熟悉应用程序代码库,并修改源代码。我们遇到的大多数测试人员(和他们的经理)都讨厌为了测试目的而修改代码的想法。
  • @IraBaxter 我怀疑你正在推广的工具......在你的回答中会让你在不理解代码库的情况下做 OP 的要求,至少在某种程度上。它确实在问题中说单元测试。这些通常涉及编写专门用于测试目的的代码。
  • 使用我们的工具,他只需要了解启动和停止程序以运行琐碎的测试用例或不覆盖初始化的测试用例,并启动程序以执行特定感兴趣的测试用例。 (是的,他必须有一个他认为会执行他想要执行的测试的测试用例;这不会改变工具必须执行的操作)。该工具将收集测试覆盖率集,他可以使用该工具的内置计算器为他计算增量。抱歉,如果您怀疑它可能如此简单。欢迎您下载该工具并亲自试用。
  • 关于“推广”:如果 lcov 不这样做,OP 很清楚他对解决方案感兴趣。我想如果其他人以相同的确切答案提到我们的工具,那会好吗?
  • 正如@dratenik 所说,我们有用于测试的代码库,所以它对我来说是一个完美的解决方案。在上传问题之前,我已经阅读了手册页,但我可能误读了那部分。非常感谢。
猜你喜欢
  • 2011-02-26
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多