关于Visual Studio:如何通过CLI通过CMake / CTest / Catch2运行使用VisualStudio构建的测试?

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

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

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

尽管一切似乎都可以进行,但我无法像我希望的那样自动运行测试。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,则会得到:

1
2
3
4
5
L:\\scratch>ctest
*********************************
No test configuration file found!
*********************************
...

要么

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

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

因此,这里的建议似乎是我应该使用ALL_TESTS的构建目标,但这对我没有帮助。

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

当然,我可以运行测试:

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

我希望自己做了些小巧的事,但我很有可能在这里完全犯错了!


我相信问题的根本原因是缺少调试/发布配置信息,而在使用Visual Studio进行配置时,cmake需要此信息。 尝试:

1
ctest -C Debug

例如。


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

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

1
2
3
4
cmake -S . -B BUILD
cmake --build BUILD
cd BUILD
ctest

我在此答案中发现的不太明显的部分是:https://stackoverflow.com/a/13551858/11603085。
即,enable_testing()调用需要位于顶层CMakeLists.txt中,而不是真正构建该库的下一层。