问题标签 [gcovr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
790 浏览

c++ - 包含 Linux 系统调用的单元测试代码

我是 C++ 单元测试的新手。我正在使用 googletest 对包含 linux 系统调用的源执行单元测试(并使用 gcovr 进行覆盖率报告)。为了测试它们,我想到了两种方法

1. 使用**LD_PRELOAD(通过存根自己的系统调用实现,例如写入、读取等)**

2. 使用 --wrap链接器选项将实际系统调用与我的存根实现包装起来。

由于使用的系统调用的数量更多(open,write,read,fseek,socket等),使用选项2几乎是不可行的,因此我想到了使用方法1。

但是,我无法使用方法 1 生成覆盖率报告(我确实使用 --coverage 选项编译了我的存根库)。当我看到 strace 时,它​​被锁定了。我不知道如何解决这个问题。所以我想保留系统调用而不是创建虚拟设备文件并处理它们。(例如:/sys/devices/system/cpu1/online --> /home/user/dummy/cpu/online)。

现在,我想模拟从写入系统调用到该文件的错误条件,但它似乎不起作用(例如,我已经使用 fcntl 函数设置了虚拟文件的 O_NONBLOCK 标志)。

我需要关于

1. 使用方法一,如何生成覆盖率报告?

2. 如果不能,如何设置虚拟文件与设备文件相同的属性。

只是我的代码的快照:openstub.c

使用open.c


编译命令:

用于使用打开

gcovr -f usingopen(这在 LD_PRELOAD 设置为 openstub.so 后卡住了)

谢谢你的建议!

0 投票
2 回答
2253 浏览

gcc - 如何合并覆盖率报告?

我有一个 C 程序,我用 -fprofile-arcs -ftest-coverage 标志编译它。然后我在 5 个不同的输入上运行程序,这将覆盖 .gcda 文件并给我一个组合报告。但我想要覆盖单个测试的报告并将它们存储在一个文件夹中,当我在此文件夹上运行任何覆盖工具时,我会得到每个测试的报告以及一个组合报告。有没有办法做到这一点?

0 投票
1 回答
1220 浏览

gcc - 如何正确处理 GCC 测试覆盖分析的输出目录?

我正在尝试为我的单元测试生成覆盖率数据,最终目标是将所述数据显示为我们自动构建输出的一部分。

我们使用 makefile 和cs-make,cxxtest作为单元测试框架进行构建。自动生成的测试运行程序文件是 C++,我们所有的应用程序文件都是 C。

单元测试可执行文件的单元测试目标和配方是:

$(INCLUDES)酌情使用$(SOURCES)

配方通过运行来执行(例如)

cs-make cs-make -C TestPlatform -f UnitTest\makefile UnitTest\Test1.exe

这将构建Test1.exe并生成.gcno文件。Test1.exe运行并生成.gcda文件。gcovr正确解释这些文件并输出覆盖数据。

到目前为止,一切都很好。但我们实际上是通过执行以下命令并行构建和运行多个单元测试:

cs-make -C TestPlatform -j -f UnitTest\makefile UnitTest\all

whereall取决于所有已定义的单元测试可执行文件。

为了支持并行构建,我在 GCC 调用中添加了这个选项:

它将每个可执行文件的 .gcda 文件放在单独的目录中。

但是现在,gcovr 无法正确处理文件:

gcovr似乎正在查找文件并将它们交给gcov,但没有覆盖数据出现。

我尝试了各种不同的gcovr选择,但似乎没有一个能让这变得更好。

我在 Eclipse CDT 中的 Windows 10 上运行此构建 - 这是我们的要求。我根据其他答案怀疑可能存在路径和/或目录分隔符问题,但实际上我目前不确定。

我的问题是:我需要通过 makefile 进行哪些更改,以便我可以将此覆盖数据添加到我们的构建中,从而继续支持并行构建?

我当然可以重组我们的单元测试,使其拥有一个 makefile-per-unit-test-suite,但这是一项艰巨的工作,如果可能的话,我想避免它。

0 投票
1 回答
413 浏览

python - Conda - gcovr 离线安装

在装有 Windows 10 的计算机上,我可以创建以下 conda 环境

现在,我想在没有 Internet 连接的 Windows 7 计算机上创建这个 conda 环境。我检查了这个链接

Conda - 离线安装/更新

但我找不到包裹

gcovr.tar.bz2

如何在离线计算机上安装 gcovr?我在哪里可以找到要下载的当前 gcovr 包?

谢谢!

0 投票
1 回答
1088 浏览

c++ - 使用 Gcovr 的多个文件的代码覆盖率

我是 gcovr 的新手。我的代码中有 3 个文件,即 main.cpp、math.cpp 和 math.hpp。我使用以下命令用 g++ 编译它

我的代码已编译并成功运行。当我运行以下命令进行代码覆盖时

它产生这样的输出

它仅显示 main.cpp 的代码覆盖率。我也想知道其他文件的代码覆盖率。我怎样才能得到它?如果可以的话,请帮助我。在此先感谢。

这是我的代码 main.cpp

数学.cpp

数学.hpp

运行命令 gcovr -v -r 时。下面给出

0 投票
1 回答
332 浏览

python - 运行 gcovr 命令后无法生成代码覆盖率并且 .gcda 从子目录中删除

我面临以下代码覆盖率问题:

  1. 对于具有 .gcno 和 .gcda 对应文件的 .cpp 文件,不会生成详细的 html 文件。
  2. gcda 文件在运行 gcovr 命令后自动被删除。

我按照以下步骤操作:

  1. 当我使用 -fprofile-arcs -ftest-coverage 选项编译我的代码并与 -lgcov 选项链接时,生成了 .gcno。
  2. 我运行可执行文件来生成 .gcda 文件。
  3. 我将 .gcno 和 .gcda 文件复制到我有源代码的位置。
  4. 我从顶层目录运行 gcovr 命令(如下所述),该目录具有进一步包含 .cpp 文件的子目录。
  5. 生成了coverage.html,其中包含有关其他html报告的信息,但是当我打开它们时它们是空白的。
  6. 我尝试过在不同位置运行 gcovr,例如从根目录或子目录。

存在 ,gcno 和 .gcda 文件的目录是 :: D:\RTC_Latest_GTEST\RTC_21_11_18\software\output_gtest\Application\contents\Application_name

执行 gcovr 命令的目录是 :: D:\RTC_Latest_GTEST\RTC_21_11_18\software\Application\contents\Application_name

目前我正在从 Application_name 文件夹运行 gcovr 命令。

我运行以下命令为我的代码生成深入的 html 报告:

预期成绩:

  1. 实际结果将为每个具有对应 .gcda 和 .gcno 对应文件的 .cpp 文件提供 html 格式的详细覆盖率报告。
  2. 运行 gcovr 命令后,.gcda 和 .gcno 文件将出现在子目录中。

生成的 HTML 覆盖率报告

0 投票
1 回答
1353 浏览

c++ - 如何为头文件中的成员函数获得正确的代码覆盖率

当我在运行我的单元测试套件后运行 gcovr 时,我得到错误的数字来覆盖头文件,其中放置了一些内联成员函数定义。例如:

对于Hit.h报告的覆盖率为 0%,但我确信在单元测试运行期间至少执行了该标头中的一些代码,因为如果我在其中放置一个 cout,那么我会在控制台输出中看到它。在网络上,经常有人认为这是一个问题,因为编译器内联了成员函数代码,因此没有生成函数调用,因此覆盖工具不会跟踪执行。所以我添加了标志:

调用编译器(gcc 8.2.1),但我得到相同的覆盖率报告。所以我不明白发生了什么。

最让我困惑的是为什么 gcovr 在DetailedHit.h. 此标头非常相似,Hit.h因此我希望报告覆盖率为 0% 时具有相同的行为,但此成员函数:

执行 10 次的结果。这是一个简单的函数,因此它应该像 in 中的那样内联Hit.h,但它仍然会被覆盖。万一重要,Hit 是DetailedHit 的具体基类,两者都没有虚拟方法。

我想我错过了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,所以我很感激任何帮助。谢谢。

0 投票
1 回答
559 浏览

gcovr - 使用 gcvor 覆盖其他目录中的文件

我在这里遇到问题,没有在 gcovr 输出中获取 cpp 文件。实际上,我的主项目包含许多子 cpp 文件,但是它们位于不同的目录路径中。

目录布局:

  • D:\selv_ar\GCovTest\ado\cic\rc_actuator_switch\ulf\src(源目录)
    • test\devices\puu_driver\sw(主项目目录)
    • core\devices\puu_driver(子文件)
    • test\testtools(子文件)
    • test\devices\puu_driver(工作区)

我有一个简单的 hello world 程序,其中的文件main.cpphelloworld.hhelloworld.cpp位于同一目录中。

笔记:

  • 我正在编译到嵌入式目标debgcov_qnx660_qcc_x86并将 gcda 文件复制到与源文件相同的目录中。
  • 我正在从主项目目录运行 gcovr。

问题:

  • 当我为 hello world 程序创建覆盖率报告时,为什么它不显示该helloworld.h文件?

  • 当我为我的实际软件创建覆盖率报告时,它会显示主项目目录中文件的覆盖率。为什么它不显示子文件的覆盖范围?

  • 我应该从哪个目录运行 gcvor?主目录?源码目录?工作区?

  • 我应该把 gcda 文件放在哪里?进入主项目目录?进入子文件目录?

0 投票
0 回答
1151 浏览

c++ - 如何使用 gcovr 和多个源/对象目录创建覆盖率报告?

我正在尝试使用 gcovr 4.1 在运行单元测试时为 C++/Qt 中的共享库项目生成覆盖率报告。我在检测我的代码时没有问题,但遇到了麻烦获取库的 gcda 文件并且也遇到问题甚至获得确实产生 gcda 文件的单元测试的完整报告。

在运行并通过调用执行单元测试后make,我的项目具有以下层次结构:project-rootx64/release/tests

请注意,build/library/obj它不包含任何 gcda 文件build/tests/obj后一个目录中总共有 11 个 gcda 文件。

我已经尝试从具有各种过滤器的多个目录中运行 gcovr。一些至少产生一些输出的例子:

尝试指定源目录:

使用完整路径指定根:

这些中的每一个(以及其他几个变体)都会产生相同的结果。

  • 我收到一长串“无法打开源文件”消息
  • 即使我可以通过使用 gcov 检查子目录中的 gcda 文件是否包含数据,它也会立即报告文件的覆盖率,tests/src但不会报告其中的文件。tests/src/subdir

正在检测中的 cpp 文件build/.../GeneratedFiles(即具有相应的 gcno 文件);但是,我不太关心他们的数据是否包含在报告中。我确实需要弄清楚:

  1. 如何在执行单元测试时获取为库生成的 gcda 文件?
  2. 我使用什么命令行来允许 gcovr 将该结构的结果和源配对?

我很感激任何帮助!

编辑#1:添加了 Makefile 的位置,并阐明了构建/运行二进制文件。

编辑#2:
部分谜团已解开。我的 Qt *.pro 文件中的拼写错误导致 -fprofile-arcs 无法包含在库的链接器标志中。
我通过这个问题找到了帮助:gcov:从共享库生成 .gcda 输出?
这使我进入了这个 gcc 帮助线程:gcov support for shared library
,最终让我通过运行检查编译器试图保存 gcda 文件的位置:

没有条目,所以我仔细检查了库的构建设置,发现了我的错误。修复后,将为库文件生成 gcda 文件,并且 gcov 可以使用它们创建报告 - 包括其中的文件library/src/subdir(与测试二进制文件的行为相矛盾)。
但是,我仍然看到所有相同的“无法打开源文件”消息。尝试构建详细的 HTML 报告失败,结果出现错误。

0 投票
1 回答
861 浏览

gcc - 如何避免 gcc 在编译后生成额外的代码?

我正在尝试使用“gcovr”获得代码覆盖率。我-O0 用作优化级别。对于线路覆盖,我得到了我需要的结果,但不幸的是分支覆盖没有。根据下面的答案,gcc 在编译时会产生额外的代码,这会影响程序中的分支数。有没有办法告诉gcc不要生成额外的代码,或者至少生成尽可能少?

根据提到的答案,使用-O1有助于生成更少的额外代码,但它并没有给我带来任何好处。相反,我得到了更多的行覆盖(这是错误的),而一个分支的覆盖更少。