我正在尝试同时学习几件事(可以说是我的第一个问题......(,即:使用 Catch2 进行单元测试和使用 CMake 进行构建。
在我的调查过程中,CTest作为管理CMake内部测试的预制方式出现在雷达上,并且似乎"支持"Catch2。
虽然事情似乎进展顺利,但我无法像我希望的那样自动运行我的测试。
具体来说,我有一个源代码树,它在某些时候包含我正在测试的库,我希望能够坐在树的顶部并执行某种"运行我的测试"命令(理想情况下运行它们作为完整构建的一部分,但那是另一天(。
所以这是我感兴趣的库的CMakeLists.txt文件(L:scratchsharedtesteroolibCMakeLists.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>BUILDsharedtesteroolibDebugtesteroolib_test.exe
===============================================================================
All tests passed (1 assertion in 1 test case)
我希望我做了一些小混乱,但很有可能我在这里完全错了棍子的一端!
我相信我已经找到了(两部分(答案。
第一部分是从顶层运行测试不好,你需要从构建文件夹运行它。 事后看来,这是很明显:(
cmake -S . -B BUILD
cmake --build BUILD
cd BUILD
ctest
我在这个答案中发现不太明显的部分是:https://stackoverflow.com/a/13551858/11603085。 也就是说,enable_testing()
调用需要在顶层CMakeLists.txt
,而不是实际构建库的更下方的调用。
我相信问题的根本原因是缺少调试/发布配置信息,cmake
使用Visual Studio进行配置时需要这些信息。尝试:
ctest -C Debug
例如。