VSCode中CMake GCC C++项目如何让“带覆盖率运行测试”按钮识别覆盖率文件?
VSCode中CMake GCC C++项目如何让“带覆盖率运行测试”按钮识别覆盖率文件?
我之前也碰到过一模一样的问题!VSCode那个「带覆盖率运行测试」按钮确实有点小脾气,默认没把CMakeFiles子目录纳入搜索范围。给你几个实用的解决办法,按从简单到麻烦的顺序来:
方案1:直接配置VSCode测试扩展的覆盖率搜索路径
这是最省心的方法,不用改任何CMake配置,只需要调整VSCode的设置,让扩展主动去CMakeFiles目录下找覆盖率文件:
- 打开VSCode设置(快捷键
Ctrl+,),搜索Testing: Coverage Search Paths - 点击「编辑 in settings.json」,添加以下配置:
"testing.coverageSearchPaths": [ "${workspaceFolder}/build/**/*.gcda", "${workspaceFolder}/build/**/*.gcno" ]
这里的**是递归匹配所有子目录的通配符,这样扩展会在build目录下的所有子文件夹(包括藏在深层的CMakeFiles)里扫描覆盖率文件。如果你的构建目录不是叫build(比如build-debug),记得把路径改成你实际的构建目录名称。
方案2:调整CMake配置,让覆盖率文件生成到显眼位置
如果不想依赖VSCode的设置,也可以通过CMake让.gcda/.gcno文件直接生成到测试可执行文件所在的目录,而不是躲在CMakeFiles里:
修改tests目录下的CMakeLists.txt,添加这段配置:
# 先把测试可执行文件的输出目录统一到build/tests/bin(可选,让结构更清晰) set_target_properties(test_app PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests/bin" ) # 配置编译参数,强制覆盖率文件生成到指定目录 target_compile_options(test_app PRIVATE --coverage -fprofile-dir=${CMAKE_BINARY_DIR}/tests/coverage ) target_link_options(test_app PRIVATE --coverage )
这样.gcda文件会直接生成到build/tests/coverage目录下,VSCode的测试扩展默认就能扫描到,不用额外设置。
方案3:用Post-Test任务自动复制覆盖率文件
如果上面两种方法都不生效,还可以在测试跑完后,自动把CMakeFiles里的覆盖率文件复制到扩展能找到的地方:
- 在VSCode的
.vscode/tasks.json里创建一个复制任务:
{ "version": "2.0.0", "tasks": [ { "label": "copy-coverage-files", "type": "shell", "command": "find ${workspaceFolder}/build -name '*.gcda' -o -name '*.gcno' | xargs cp -t ${workspaceFolder}/build/coverage 2>/dev/null || true", "problemMatcher": [], "runOptions": { "runOn": "folderOpen" } } ] }
- 然后在
settings.json里配置测试扩展的后置任务:
"testing.postTestTask": "copy-coverage-files"
这样每次点击「Run Tests with Coverage」按钮后,系统会自动把所有覆盖率文件复制到build/coverage目录,扩展就能顺利扫描到了。
最后,如果你还是不确定问题出在哪,可以看VSCode输出面板里的「Testing」日志,里面会详细显示扩展搜索覆盖率文件的路径,能帮你快速定位问题~
内容来源于stack exchange
相关产品推荐
相关产品推荐

