问题标签 [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.
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 后卡住了)
谢谢你的建议!
gcc - 如何合并覆盖率报告?
我有一个 C 程序,我用 -fprofile-arcs -ftest-coverage 标志编译它。然后我在 5 个不同的输入上运行程序,这将覆盖 .gcda 文件并给我一个组合报告。但我想要覆盖单个测试的报告并将它们存储在一个文件夹中,当我在此文件夹上运行任何覆盖工具时,我会得到每个测试的报告以及一个组合报告。有没有办法做到这一点?
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,但这是一项艰巨的工作,如果可能的话,我想避免它。
python - Conda - gcovr 离线安装
在装有 Windows 10 的计算机上,我可以创建以下 conda 环境
现在,我想在没有 Internet 连接的 Windows 7 计算机上创建这个 conda 环境。我检查了这个链接
但我找不到包裹
gcovr.tar.bz2
如何在离线计算机上安装 gcovr?我在哪里可以找到要下载的当前 gcovr 包?
谢谢!
c++ - 使用 Gcovr 的多个文件的代码覆盖率
我是 gcovr 的新手。我的代码中有 3 个文件,即 main.cpp、math.cpp 和 math.hpp。我使用以下命令用 g++ 编译它
我的代码已编译并成功运行。当我运行以下命令进行代码覆盖时
它产生这样的输出
它仅显示 main.cpp 的代码覆盖率。我也想知道其他文件的代码覆盖率。我怎样才能得到它?如果可以的话,请帮助我。在此先感谢。
这是我的代码 main.cpp
数学.cpp
数学.hpp
运行命令 gcovr -v -r 时。下面给出
python - 运行 gcovr 命令后无法生成代码覆盖率并且 .gcda 从子目录中删除
我面临以下代码覆盖率问题:
- 对于具有 .gcno 和 .gcda 对应文件的 .cpp 文件,不会生成详细的 html 文件。
- gcda 文件在运行 gcovr 命令后自动被删除。
我按照以下步骤操作:
- 当我使用 -fprofile-arcs -ftest-coverage 选项编译我的代码并与 -lgcov 选项链接时,生成了 .gcno。
- 我运行可执行文件来生成 .gcda 文件。
- 我将 .gcno 和 .gcda 文件复制到我有源代码的位置。
- 我从顶层目录运行 gcovr 命令(如下所述),该目录具有进一步包含 .cpp 文件的子目录。
- 生成了coverage.html,其中包含有关其他html报告的信息,但是当我打开它们时它们是空白的。
- 我尝试过在不同位置运行 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 报告:
预期成绩:
- 实际结果将为每个具有对应 .gcda 和 .gcno 对应文件的 .cpp 文件提供 html 格式的详细覆盖率报告。
- 运行 gcovr 命令后,.gcda 和 .gcno 文件将出现在子目录中。
c++ - 如何为头文件中的成员函数获得正确的代码覆盖率
当我在运行我的单元测试套件后运行 gcovr 时,我得到错误的数字来覆盖头文件,其中放置了一些内联成员函数定义。例如:
对于Hit.h
报告的覆盖率为 0%,但我确信在单元测试运行期间至少执行了该标头中的一些代码,因为如果我在其中放置一个 cout,那么我会在控制台输出中看到它。在网络上,经常有人认为这是一个问题,因为编译器内联了成员函数代码,因此没有生成函数调用,因此覆盖工具不会跟踪执行。所以我添加了标志:
调用编译器(gcc 8.2.1),但我得到相同的覆盖率报告。所以我不明白发生了什么。
最让我困惑的是为什么 gcovr 在DetailedHit.h
. 此标头非常相似,Hit.h
因此我希望报告覆盖率为 0% 时具有相同的行为,但此成员函数:
执行 10 次的结果。这是一个简单的函数,因此它应该像 in 中的那样内联Hit.h
,但它仍然会被覆盖。万一重要,Hit 是DetailedHit 的具体基类,两者都没有虚拟方法。
我想我错过了一些关于 gcov 和 gcovr 如何工作的重要知识,但我在网上找不到相关线索,所以我很感激任何帮助。谢谢。
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.cpp
、helloworld.h
和helloworld.cpp
位于同一目录中。
笔记:
- 我正在编译到嵌入式目标
debgcov_qnx660_qcc_x86
并将 gcda 文件复制到与源文件相同的目录中。 - 我正在从主项目目录运行 gcovr。
问题:
当我为 hello world 程序创建覆盖率报告时,为什么它不显示该
helloworld.h
文件?当我为我的实际软件创建覆盖率报告时,它会显示主项目目录中文件的覆盖率。为什么它不显示子文件的覆盖范围?
我应该从哪个目录运行 gcvor?主目录?源码目录?工作区?
我应该把 gcda 文件放在哪里?进入主项目目录?进入子文件目录?
c++ - 如何使用 gcovr 和多个源/对象目录创建覆盖率报告?
我正在尝试使用 gcovr 4.1 在运行单元测试时为 C++/Qt 中的共享库项目生成覆盖率报告。我在检测我的代码时没有问题,但遇到了麻烦获取库的 gcda 文件并且也遇到问题甚至获得确实产生 gcda 文件的单元测试的完整报告。
在运行并通过调用执行单元测试后make
,我的项目具有以下层次结构:project-root
x64/release/tests
请注意,后一个目录中总共有 11 个 gcda 文件。build/library/obj
它不包含任何 gcda 文件build/tests/obj
。
我已经尝试从具有各种过滤器的多个目录中运行 gcovr。一些至少产生一些输出的例子:
尝试指定源目录:
使用完整路径指定根:
这些中的每一个(以及其他几个变体)都会产生相同的结果。
- 我收到一长串“无法打开源文件”消息
- 即使我可以通过使用 gcov 检查子目录中的 gcda 文件是否包含数据,它也会立即报告文件的覆盖率,
tests/src
但不会报告其中的文件。tests/src/subdir
正在检测中的 cpp 文件build/.../GeneratedFiles
(即具有相应的 gcno 文件);但是,我不太关心他们的数据是否包含在报告中。我确实需要弄清楚:
如何在执行单元测试时获取为库生成的 gcda 文件?- 我使用什么命令行来允许 gcovr 将该结构的结果和源配对?
我很感激任何帮助!
编辑#1:添加了 Makefile 的位置,并阐明了构建/运行二进制文件。
编辑#2:
部分谜团已解开。我的 Qt *.pro 文件中的拼写错误导致 -fprofile-arcs 无法包含在库的链接器标志中。
我通过这个问题找到了帮助:gcov:从共享库生成 .gcda 输出?
这使我进入了这个 gcc 帮助线程:gcov support for shared library
,最终让我通过运行检查编译器试图保存 gcda 文件的位置:
没有条目,所以我仔细检查了库的构建设置,发现了我的错误。修复后,将为库文件生成 gcda 文件,并且 gcov 可以使用它们创建报告 - 包括其中的文件library/src/subdir
(与测试二进制文件的行为相矛盾)。
但是,我仍然看到所有相同的“无法打开源文件”消息。尝试构建详细的 HTML 报告失败,结果出现错误。
gcc - 如何避免 gcc 在编译后生成额外的代码?
我正在尝试使用“gcovr”获得代码覆盖率。我-O0
用作优化级别。对于线路覆盖,我得到了我需要的结果,但不幸的是分支覆盖没有。根据下面的答案,gcc 在编译时会产生额外的代码,这会影响程序中的分支数。有没有办法告诉gcc
不要生成额外的代码,或者至少生成尽可能少?
根据提到的答案,使用-O1
有助于生成更少的额外代码,但它并没有给我带来任何好处。相反,我得到了更多的行覆盖(这是错误的),而一个分支的覆盖更少。