Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何从CLI通过CMake/CTest/Catch2运行使用VisualStudio构建的测试?_Visual Studio_Cmake_Ctest_Catch2 - Fatal编程技术网

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

Visual studio 如何从CLI通过CMake/CTest/Catch2运行使用VisualStudio构建的测试?,visual-studio,cmake,ctest,catch2,Visual Studio,Cmake,Ctest,Catch2,我试图同时学习几件事(可以说是我的第一个问题…),即:使用Catch2进行单元测试和使用CMake进行构建 在我的调查过程中,CTest作为CMake内部管理测试的一种预烘焙方式出现在雷达上,似乎“支持”了Catch2 虽然事情似乎进展顺利,但我不能像我希望的那样自动运行测试 具体地说,我有一个源代码树,它在某个时候包含我正在测试的库,我希望能够坐在树的顶部,执行某种“运行我的测试”命令(理想情况下,将它们作为完整构建的一部分运行,但这是另一天的事情) 下面是我感兴趣的库的CMakeLists.

我试图同时学习几件事(可以说是我的第一个问题…),即:使用Catch2进行单元测试和使用CMake进行构建

在我的调查过程中,CTest作为CMake内部管理测试的一种预烘焙方式出现在雷达上,似乎“支持”了Catch2

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

具体地说,我有一个源代码树,它在某个时候包含我正在测试的库,我希望能够坐在树的顶部,执行某种“运行我的测试”命令(理想情况下,将它们作为完整构建的一部分运行,但这是另一天的事情)

下面是我感兴趣的库的CMakeLists.txt文件(
L:\scratch\shared\testerolib\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!
*********************************
...

从我在别处读到的内容来看,
maketest
可以与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文件夹运行它。事后来看,这是很明显的:(

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

我相信我已经找到了(由两部分组成的)答案

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

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

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

ctest -C Debug

例如。

我认为问题的根本原因是缺少调试/发布配置信息,当您使用Visual Studio进行配置时,
cmake
需要这些信息。请尝试:

ctest -C Debug

例如。

我不确定这是否是根本原因,但这肯定是一个很好的观点,谢谢。FWIW,在使用VS(支持多种构建风格)时,您似乎需要此标志,但在使用MinGW(例如)时则不需要此标志一次只支持味道。另外,它是大C,而不是小C。我不确定这是根本原因,但这肯定是一个很好的观点,谢谢。FWIW,看起来你在使用VS(支持多种构建风格)时需要这个标志,但在使用MinGW(比如)时不需要这个标志一次只支持味道。而且,它是大C,而不是小C
ctest -C Debug