Python导入ctypes共享库时能否获取对应的代码覆盖率?
问题解答:ctypes加载共享库时的C代码覆盖率统计
结论
可以正常获取对应C代码的覆盖率信息。--coverage编译选项生成的覆盖率统计逻辑,和调用方的类型无关,不管是原生C可执行文件直接链接加载,还是Python通过ctypes动态加载共享库,只要库中的代码被执行,就能生成对应的覆盖率数据。
具体操作步骤
- 编译C代码生成共享库时,编译和链接阶段都需要添加
--coverage参数,示例编译命令如下:
# 编译生成目标文件 gcc -fPIC --coverage -c your_lib_source.c -o your_lib.o # 链接生成共享库 gcc -shared --coverage your_lib.o -o mylib.so
- 正常使用ctypes加载
mylib.so,运行你编写的Python测试用例,调用共享库暴露的C接口 - 等Python进程正常退出后,会在C代码的编译目录下生成后缀为
.gcda的覆盖率数据文件 - 使用
gcov、lcov、gcovr等工具解析生成的gcda文件,即可得到完整的C代码覆盖率统计结果
常见注意事项
- 运行Python测试脚本的用户,需要对C代码编译的目录有写权限,否则
libgcov无法写入gcda文件,会出现无覆盖率数据的问题 - 如果需要自定义gcda文件的输出路径,可以在运行Python脚本前设置
GCOV_PREFIX和GCOV_PREFIX_STRIP环境变量调整输出位置,解决源文件路径不匹配的问题 - 每次重新运行测试前建议删除旧的gcda文件,避免历史数据干扰最终的覆盖率统计结果
内容的提问来源于stack exchange,提问作者ayoubsvbri
相关产品推荐
相关产品推荐

