生成由单独测试调用的 C++ 静态库的测试覆盖率 类
Generating test coverage of C++ static library as called by separate test classes
我正在使用 QT Creator 在 C++ 中处理一个中型项目。
项目结构基本上是这样的
项目
- A组
- 图书馆A1
- B组
- 图书馆B1
- 图书馆B2
- ...等等
测试
- LibA1_Test
- LibB1_Test
- LibB2_Test
- ...等等
库由测试项目中的可执行文件测试。我已经设法在启用 gcov 的情况下自行编译测试,并使用 lcov 生成代码覆盖率报告,但它们显示的覆盖率只是测试用例,而不是我正在测试的实际代码。我也尝试过使用 gcov 编译静态库,但是当我 运行 针对这些库进行测试时,它不会生成任何 gcov 输出文件。
如何通过将我的项目库与测试链接来生成 gcov 输出文件?我想看看我的单元测试有没有漏洞。
--whole-archive
For each archive mentioned on the command line after the --whole-archive
option, include every object file in the archive
in the link, rather than searching the archive for the required object
files.
所以 link 你的静态库使用 --whole-archive
进入你的测试,这将导致你的测试二进制文件具有整个静态库,并提供 gcov
整个可见性代码
说实话,你真的不需要--whole-archive,只需将以下内容添加到所有静态库和单元测试中就足够了,你想要的gcov信息来自:
# only apply codecoverage when CodeCoverage is set and debug-mode is active
CodeCoverage
{
debug:QMAKE_CXXFLAGS_DEBUG += --coverage # -fprofile-arcs -ftest-coverage
debug:QMAKE_LFLAGS_DEBUG += --coverage # -lgcov
}
--coverage
是上下文相关的,它的含义取决于你传递给CXXFLAGS还是LFLAGS:
https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options
中也提到了。
因此无需添加 -fprofile-arcs 或任何其他标志的混合。
在您的情况下,将这些标志添加到 A1.pro、B1.pro 和 B2.pro。
在标志周围添加的 scope 只是防止代码覆盖标志在发布或调试模式下污染您的构建。只需将“CONFIG+=CodeCoverage”传递给 qmake.exe,这样它就会以代码覆盖率构建:
https://doc.qt.io/archives/qt-4.8/qmake-advanced-usage.html#configuration-and-scopes
之后只是 检查 是否在编译后生成了 *.gcno 文件并在 运行 单元测试后生成了 *.gcda 文件-目录并调用 lcov
:
https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html#Gcov-Data-Files
附加信息
Whosebug 帮助我解决了我 运行 遇到的问题:
Where are the gcov symbols?
如果您 运行 遇到链接器错误,例如(对 __gcov_init 和 __gcov_merge_add 的未定义引用),请注意您实际上是在将这些标志添加到每个单元:
https://www.spinics.net/lists/gcchelp/msg29518.html
我正在使用 QT Creator 在 C++ 中处理一个中型项目。
项目结构基本上是这样的
项目
- A组
- 图书馆A1
- B组
- 图书馆B1
- 图书馆B2
- ...等等
测试
- LibA1_Test
- LibB1_Test
- LibB2_Test
- ...等等
- A组
库由测试项目中的可执行文件测试。我已经设法在启用 gcov 的情况下自行编译测试,并使用 lcov 生成代码覆盖率报告,但它们显示的覆盖率只是测试用例,而不是我正在测试的实际代码。我也尝试过使用 gcov 编译静态库,但是当我 运行 针对这些库进行测试时,它不会生成任何 gcov 输出文件。
如何通过将我的项目库与测试链接来生成 gcov 输出文件?我想看看我的单元测试有没有漏洞。
--whole-archive
For each archive mentioned on the command line after the--whole-archive
option, include every object file in the archive in the link, rather than searching the archive for the required object files.
所以 link 你的静态库使用 --whole-archive
进入你的测试,这将导致你的测试二进制文件具有整个静态库,并提供 gcov
整个可见性代码
说实话,你真的不需要--whole-archive,只需将以下内容添加到所有静态库和单元测试中就足够了,你想要的gcov信息来自:
# only apply codecoverage when CodeCoverage is set and debug-mode is active
CodeCoverage
{
debug:QMAKE_CXXFLAGS_DEBUG += --coverage # -fprofile-arcs -ftest-coverage
debug:QMAKE_LFLAGS_DEBUG += --coverage # -lgcov
}
--coverage
是上下文相关的,它的含义取决于你传递给CXXFLAGS还是LFLAGS:
https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options
中也提到了。 因此无需添加 -fprofile-arcs 或任何其他标志的混合。 在您的情况下,将这些标志添加到 A1.pro、B1.pro 和 B2.pro。
在标志周围添加的 scope 只是防止代码覆盖标志在发布或调试模式下污染您的构建。只需将“CONFIG+=CodeCoverage”传递给 qmake.exe,这样它就会以代码覆盖率构建: https://doc.qt.io/archives/qt-4.8/qmake-advanced-usage.html#configuration-and-scopes
之后只是 检查 是否在编译后生成了 *.gcno 文件并在 运行 单元测试后生成了 *.gcda 文件-目录并调用 lcov
:
https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html#Gcov-Data-Files
附加信息
Whosebug 帮助我解决了我 运行 遇到的问题: Where are the gcov symbols?
如果您 运行 遇到链接器错误,例如(对 __gcov_init 和 __gcov_merge_add 的未定义引用),请注意您实际上是在将这些标志添加到每个单元: https://www.spinics.net/lists/gcchelp/msg29518.html