我有一个结构如下的项目:
|--assets/
|--core/
|--deps/
|--Catch2/
|--win32/
|--# Have Catch2 library installed here
|--include/
|--# Nothing here
|--src/
|--sample.cpp # No content in this file
|--tests/
|--test.cpp
|--CMakeLists.txt
|--main.cpp
|--CMakeLists.txt
顶级CMakeLists.txt内容是:
cmake_minimum_required (VERSION 3.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
project("My.Project")
add_executable(MyProject main.cpp)
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR>)
endforeach()
else(APPLE)
endif()
add_subdirectory(core)
target_link_libraries(MyProject MyLib)
“核心”文件夹中的 CMakeLists.txt 文件是:
file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp")
add_library(MyLib ${HEADER_FILES} ${SOURCE_FILES} ${TEST_FILES})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR_CORE POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR_CORE>)
endforeach()
else(APPLE)
endif()
# Catch2 stuff:
if(WIN32)
find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/win32")
target_link_libraries(MyLib Catch2::Catch2)
endif()
include(CTest)
include(Catch)
catch_discover_tests(MyLib)
我的 test.cpp
内容(来自 Catch2 文档,此测试应该会失败):
#define CATCH_CONFIG_MAIN
#include "catch2/catch.hpp"
unsigned int Factorial(unsigned int number)
{
return number <= 1 ? number : Factorial(number - 1)*number;
}
TEST_CASE("Factorials are computed", "[factorial]")
{
REQUIRE(Factorial(1) == 2); // Should fail here.
REQUIRE(Factorial(2) == 2);
REQUIRE(Factorial(3) == 6);
REQUIRE(Factorial(10) == 3628800);
}
当我使用 cmake -G "Visual Studio 15"生成 Visual Studio 文件时。 -B .\build
,通常,当发现测试时,我会看到一个项目分组在“CMakePredefinedTargets”下,名为“RUN_TESTS”。但是,我再也看不到这个项目了。
此外,当我构建项目(使用 Visual Studio 2017)时,测试没有运行。请帮忙。谢谢。
最佳答案
根据@Stephen Newell 和@squareskittles 的评论,我最终修改的工作 CMakeLists.txt 文件如下。
我在根文件中添加了 enable_testing()
。这使得 RUN_TESTS 项目在 Visual Studio 中可见。当我想运行测试时,我构建了这个项目:
cmake_minimum_required (VERSION 3.8)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
project("My.Project")
enable_testing()
add_executable(MyProject main.cpp)
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR>)
endforeach()
else(APPLE)
endif()
add_subdirectory(core)
target_link_libraries(MyProject MyLib)
但是,仅添加此行仍然存在一个问题,即使 RUN_TESTS 存在,它也没有发现单元测试,因为 CMake-Catch2 集成需要一个可执行文件,而不是一个库来运行测试。因此,我在核心文件夹中的 CMakeLists.txt 文件中添加了一个单独的目标:
file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(MyLib ${HEADER_FILES} ${SOURCE_FILES})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
# Copy all DLLs if windows:
if(WIN32)
file(GLOB_RECURSE DYNAMIC_LIBS "${CMAKE_CURRENT_SOURCE_DIR}/*.dll")
foreach(dll ${DYNAMIC_LIBS})
add_custom_command(TARGET AZTEC_EDITOR_CORE POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${dll} $<TARGET_FILE_DIR:AZTEC_EDITOR_CORE>)
endforeach()
else(APPLE)
endif()
# Catch2 stuff:
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp")
add_executable(MyLibTests ${TEST_FILES})
if(WIN32)
find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/win32")
target_link_libraries(MyLibTests Catch2::Catch2)
endif()
include(CTest)
include(Catch)
catch_discover_tests(MyLibTests)
由于 Catch2 文档中给出的示例相当少,希望这将有助于尝试将 Catch2 与更复杂的项目结构集成的人。感谢评论员的所有帮助。
关于c++ - Catch2 单元测试未与 CMake 项目一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944208/