You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CMake项目时在Visual Studio中发现Catch2测试的问题

解决VS2019 CMake项目中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:32:36