如何结合Cython单元测试与C/C++测试框架的代码覆盖率数据
问题与解答
背景
我使用Cython封装算法相关的现有C代码,以便通过Python执行单元测试或运行仿真。同时,我也使用C/C++常规单元测试框架(Catch2)编写简单测试用例,可通过lcov获取Catch2测试的代码覆盖率概览。
问题1:是否可以获取通过Python(经Cython扩展)测试的C代码部分的代码覆盖率?如何实现?
可以实现,核心借助gcov/lcov工具链完成,步骤如下:
- 编译阶段:编译Cython扩展及目标C代码时,添加编译参数
-fprofile-arcs -ftest-coverage,链接参数添加-lgcov(部分编译器支持统一参数--coverage,可替代上述两个参数)。如果使用setup.py构建Cython扩展,需在ext_modules的extra_compile_args和extra_link_args中配置这些参数。 - 执行测试:运行Python单元测试用例,测试完成后,C代码所在目录会生成
.gcno(编译时生成的覆盖率元数据文件)和.gcda(运行时生成的覆盖率统计数据文件)。 - 生成覆盖率报告:执行
lcov --capture --directory . --output-file coverage_python.info,即可得到Python测试覆盖C代码的覆盖率数据文件。
问题2:是否可以将Catch2测试与Python/Cython单元测试的代码覆盖率数据进行合并?
完全可以合并,具体步骤:
- 分别生成两类测试的覆盖率文件:Catch2测试的覆盖率文件(例如
coverage_catch2.info)、Python测试的覆盖率文件(例如coverage_python.info)。 - 执行合并命令:
lcov --add-tracefile coverage_catch2.info --add-tracefile coverage_python.info --output-file coverage_combined.info。 - 生成可视化报告:
genhtml coverage_combined.info --output-directory coverage_report,打开报告即可查看两类测试共同覆盖C代码的整体覆盖率情况。
注意事项
- 确保Catch2测试与Python测试的编译阶段都开启了相同的覆盖率编译选项,且C代码未在两次测试间重新编译(否则
.gcno文件更新会导致覆盖率数据不兼容)。 - 每次运行测试前,建议清空旧的
.gcda文件,避免数据干扰:执行find . -name "*.gcda" -delete即可。
内容的提问来源于stack exchange,提问作者fkh746351
相关产品推荐
相关产品推荐

