使用CMake项目时在Visual Studio中发现Catch2测试的问题
我之前在VS2019里配置Catch2测试的时候,也碰到过完全一样的情况——构建运行都正常,但测试资源管理器就是找不到测试,折腾了好几个小时才搞定,给你分享几个亲测有效的排查和解决方向:
1. 确认Catch2版本与Test Adapter的兼容性
Catch2 v2和v3的Test Adapter是不通用的,如果你用的是Catch2 v3,一定要安装支持v3版本的Catch2 Test Adapter(在VS扩展市场里找最新版的,一般标题会标注支持v3);如果是v2,就安装对应v2的Adapter版本。别搞错了,这是很多人踩的第一个坑。
2. 检查.runsettings文件的配置细节
你已经加了.runsettings,但要确保配置路径完全正确,不然Adapter找不到测试程序。给你一个标准的配置模板,你可以对照修改:
<RunSettings> <Catch2Adapter> <!-- 指定测试程序的路径,**表示递归查找所有exe --> <TestAssemblyPaths> <Path>$(SolutionDir)bin\$(Configuration)\**\*.exe</Path> </TestAssemblyPaths> <!-- 如果是手动引入的Catch2库,指定其根路径;用NuGet的话可以注释掉这行 --> <Catch2Path>$(SolutionDir)third_party\catch2\</Catch2Path> <!-- 可选:启用详细日志,方便排查问题 --> <VerboseLogging>True</VerboseLogging> </Catch2Adapter> </RunSettings>
另外别忘了在VS里选中这个.runsettings文件:点击顶部菜单栏的「测试」→「测试设置」→「选择测试设置文件」,选你配置好的那个。
3. 检查CMakeLists.txt的测试配置
CMake这边必须正确生成VS能识别的测试目标,不然Adapter也抓不到。确保你的CMakeLists里有这些关键配置:
# 找到Catch2库(如果是NuGet安装的,会自动识别;手动的话要指定CMAKE_PREFIX_PATH) find_package(Catch2 REQUIRED) # 生成测试可执行文件 add_executable(MyProjectTests test_case1.cpp test_case2.cpp) # 链接Catch2库(v3的话可能需要Catch2::Catch2WithMain,如果你没自己写main函数) target_link_libraries(MyProjectTests PRIVATE Catch2::Catch2) # 这两行是关键!让CMake自动发现测试并生成VS兼容的测试目标 include(CTest) include(Catch) catch_discover_tests(MyProjectTests)
还要确保你在CMake里开启了BUILD_TESTING,可以在顶层CMakeLists里加option(BUILD_TESTING "Build tests" ON)。
4. 手动验证测试程序是否正常
先脱离VS,手动运行测试程序,比如打开命令行到测试exe的目录,执行:
MyProjectTests.exe --list-tests
如果能正常列出所有测试用例,说明测试程序本身没问题,问题出在VS Adapter的配置上;如果不能,那先检查测试程序的编译逻辑(比如有没有正确包含Catch2的头文件,有没有写TEST_CASE宏)。
5. 清理VS缓存并刷新测试资源管理器
VS有时候会有缓存问题,导致测试不更新:
- 先执行「生成」→「清理解决方案」,然后重新构建整个项目
- 右键测试资源管理器的空白处,选择「刷新」
- 如果还是不行,可以试试关闭VS,删除
.vs目录(隐藏目录,在解决方案根目录下),然后重新打开VS
6. 更新VS2019到最新补丁
VS2019的旧版本(比如16.8及以前)和Catch2 Adapter的兼容性不太好,建议把VS2019更新到最新的16.11.x版本(VS2019的最终稳定版),很多兼容性问题都会随之解决。
我当时的问题是.runsettings里的TestAssemblyPaths路径写错了,把$(SolutionDir)写成了$(ProjectDir),导致Adapter找不到测试程序,改完之后刷新一下就正常识别了。你可以按照上面的步骤一步步排查,应该能解决问题。
内容的提问来源于stack exchange,提问作者wookie

