如何通过 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
例如。
我正在尝试同时学习几件事(可以说是我的第一个问题...),即:使用 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
例如。