首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未使用CMake项目运行Catch2单元测试

未使用CMake项目运行Catch2单元测试
EN

Stack Overflow用户
提问于 2019-09-15 20:42:33
回答 1查看 1.6K关注 0票数 0

我有一个结构如下的项目:

代码语言:javascript
复制
|--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内容为:

代码语言:javascript
复制
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文件是:

代码语言:javascript
复制
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文档,此测试应该失败):

代码语言:javascript
复制
#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" . -B .\build生成Visual Studio文件时,通常,当发现测试时,我会看到一个分组在"CMakePredefinedTargets“下的名为"RUN_TESTS”的项目。然而,我再也看不到这个项目了。

此外,当我构建项目时(使用Visual Studio 2017),测试没有运行。请帮帮忙。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-09-16 10:29:03

基于@Stephen Newell和@squareskittle的评论,我最终修改的工作CMakeLists.txt文件如下所示。

我将enable_testing()添加到根文件中。这将使RUN_TESTS项目在Visual Studio中可见。当我想运行测试时,我会构建这个项目:

代码语言:javascript
复制
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文件中添加了一个单独的目标:

代码语言:javascript
复制
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与更复杂的项目结构集成在一起的人。感谢评论员们的帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57944208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档