如何通过 CLI CMake/CTest/Catch2 使用 VisualStudio 构建 运行 测试?

How do I run tests built using VisualStudio, via CMake/CTest/Catch2 from the CLI?

我正在尝试同时学习几件事(可以说是我的第一个问题...),即:使用 Catch2 进行单元测试并使用 CMake 进行构建。

在我的调查过程中,CTest 作为在 CMake 中管理测试的预烘焙方式出现在雷达上,并且似乎 'support' Catch2。

虽然事情似乎进展顺利,但我无法 运行 我的测试像我希望的那样自动进行。

具体来说,我有一个源代码树,它在某些时候包含我正在测试的库,我希望能够坐在树的顶部并执行某种 'run my tests' 命令(理想情况下 运行 它们作为完整构建的一部分,但那是另一天)。

所以这是我感兴趣的库的 CMakeLists.txt 文件 (L:\scratch\shared\testeroolib\CMakeLists.txt):

cmake_minimum_required(VERSION 3.5)
project(testeroolib)

add_library(${PROJECT_NAME} STATIC src/testeroolib.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC include)

set(PROJECT_TEST ${PROJECT_NAME}_test)

add_executable(${PROJECT_TEST} test/catch2_main.cpp)
target_link_libraries(${PROJECT_TEST} PRIVATE Catch)
target_link_libraries(${PROJECT_TEST} PRIVATE ${PROJECT_NAME})

enable_testing()
add_test(NAME TesterooLibTest COMMAND ${PROJECT_TEST})

如果我做天真的事情并且 运行 从与 运行 cmake 相同的位置进行 ctest,我得到:

L:\scratch>ctest
*********************************
No test configuration file found!
*********************************
...

L:\scratch>ctest .
Test project L:/scratch
No tests were found!!!

根据我在其他地方读到的内容,make test 可以使用 GCC 和朋友来解决问题,但我使用的是 VS。

所以这里的建议似乎是我应该使用 ALL_TESTS 的构建目标,但这对我来说并不奏效。

L:\scratch>cmake --build BUILD --target ALL_TESTS
...
MSBUILD : error MSB1009: Project file does not exist.
Switch: ALL_TESTS.vcxproj

当然,我可以只是运行测试:

L:\scratch>BUILD\shared\testeroolib\Debug\testeroolib_test.exe
===============================================================================
All tests passed (1 assertion in 1 test case)

我希望我犯了一些小错误,但很有可能我完全弄错了方向!

我相信我已经找到了(两部分)答案。

第一部分是,运行从顶层进行 ctest 是不好的,您需要从 build 文件夹中 运行 它。事后看来,这很明显:(

cmake -S . -B BUILD
cmake --build BUILD
cd BUILD
ctest

我在这个答案中发现的不太明显的部分:。 也就是说,enable_testing() 调用需要在顶层 CMakeLists.txt,而不是实际构建库的更下层。

我认为您问题的根本原因是缺少 Debug/Release 配置信息,cmake 需要这些信息使用 Visual Studio 配置。尝试:

ctest -C Debug

例如。