【问题标题】:Catch2 with CMake and Visual Studio使用 CMake 和 Visual Studio 的 Catch2
【发布时间】:2019-06-01 10:08:42
【问题描述】:

我正在尝试为我构建的库设置Catch2 测试框架。我正在使用 CMake 和 Visual Studio 2017。

我的项目结构是:

executable-project/
|-- library
      |--include/
      |    |--SUT.h 
      |--src/
      |    |--SUT.cpp
      |--tests/
      |    |--catch.hpp
      |    |--SUTTest.cpp
      |CMakeLists.txt
|include/
|src/
| |--main.cpp
|CMakeLists.txt

SUT.h、SUT.cpp 和 SUTTest.cpp 只是测试基于 example 定义的阶乘函数。

我在库中的 CMakeLists.txt 文件是

cmake_minimum_required (VERSION 3.8)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

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(MY_LIBRARY ${HEADER_FILES} ${SOURCE_FILES} ${TEST_FILES})

target_include_directories(MY_LIBRARY PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

source_group("Test Files" FILES ${TEST_FILES})

SUTTest.cpp 文件是:

#define CATCH_CONFIG_MAIN

#include "catch.hpp"
#include "SUT.h"

TEST_CASE("Factorials are computed", "[factorial]")
{
    SUT sut;

    REQUIRE(sut.Factorial(0) == 0);
    REQUIRE(sut.Factorial(1) == 1);
    REQUIRE(sut.Factorial(2) == 2);
    REQUIRE(sut.Factorial(3) == 6);
    REQUIRE(sut.Factorial(10) == 3628800);
}

“可执行项目”只是使用库(它是实际的应用程序)。该项目中的CMakeLists.txt 动态地将库链接到它。

当我在 Visual Studio 中构建此解决方案时,构建工作正常。

但是,尽管断言 Factorial(0) == 0.此外,Visual Studio 没有在测试文件夹中发现测试。我想要实现的是:

  1. 当我在 Visual Studio 中单击构建时,测试将作为构建的一部分运行。

  2. (可选)能够让 Visual Studio 发现测试。

编辑:

cmake_minimum_required (VERSION 3.8)

project("My Project")

file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

add_subdirectory(library)
add_executable(MY_APP main.cpp ${HEADER_FILES} ${SOURCE_FILES})

target_include_directories(MY_APP PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(MY_APP MY_LIBRARY)

【问题讨论】:

  • 请分享您的根级 CMakeLists.txt
  • @ap-osd 我将根级文件添加为编辑。
  • “当我手动测试库的功能时它工作正常”是什么意思?因为您还说“测试没有失败”。
  • @ap-osd 抱歉,这不相关。我已经把它删了。那是在我添加我认为的测试功能之前。请忽略。

标签: c++ visual-studio cmake catch2


【解决方案1】:

终于设法让 Catch2 与 Visual Studio 一起工作。

首先,我从他们的 GitHub 下载了 Catch2 版本,并将其安装在我的计算机上(实际上记录在 here)。

cmake -Bbuild -S. -DBUILD_TESTING=OFF
cmake --build build/ --target install (Need admin rights)

这会将 Catch2 安装在 C:\Program Files (x86)\Catch2 中。然后我将此安装目录中的所有内容复制到我的项目的 deps/Catch2 文件夹中。然后只需将以下内容添加到 CMakeLists.txt:

find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/Catch2")
target_link_libraries(MY_LIBRARY Catch2::Catch2)

include(CTest)
include(Catch)
catch_discover_tests(MY_LIBRARY)

这会将 RUN_TESTS 项目添加到 Visual Studio。当我构建这个项目时,我的单元测试会运行。希望这对任何尝试与 CMake 集成的人有所帮助。

【讨论】:

    【解决方案2】:

    尽管断言 Factorial(0) == 0,但测试并未失败

    你应该断言什么是真实的/预期的。那么如果你写的代码错了,就会失败。

    REQUIRE( Factorial(0) == 1 );(不是== 0)

    当我在 Visual Studio 中单击 Build 时,将作为一部分运行的测试 构建。

    在 Visual Studio IDE 中,构建和运行是两个独立的步骤。如果您想自动对其进行排序,请编写一个简单的.bat 脚本,该脚本首先构建然后运行。

    (可选)让 Visual Studio 能够发现测试。

    Catch2 具有 CMake 集成,包含用于在 CTest 中自动注册 TEST_CASEs 的 CMake 脚本。

    cmake_minimum_required(VERSION 3.5)
    
    project(baz LANGUAGES CXX VERSION 0.0.1)
    
    find_package(Catch2 REQUIRED)
    add_executable(foo test.cpp)
    target_link_libraries(foo Catch2::Catch2)
    
    include(CTest)
    include(Catch)
    catch_discover_tests(foo)
    

    详情请见Catch2 CMake Integration。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多