Catch2 with CMake and Visual Studio

Catch2 with CMake and Visual Studio

本文关键字:Visual Studio and CMake with Catch2      更新时间:2023-10-16

我正在尝试为我构建的库设置 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.hSUT.cppSUTTest.cpp只是在测试基于这个例子定义的阶乘函数。

我的 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 不会发现 tests 文件夹中的测试。我想要实现的是:

  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)

终于设法让 Catch2 与 Visual Studio 配合使用。

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

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

这将在 C:\Program Files (x86(\Catch2 中安装 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集成的人都有帮助。

尽管断言阶乘(0( == 0,但测试并未失败

你应该断言什么是真实的/预期的。然后,如果你编写的代码是错误的,它就会失败。

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

当我单击"在Visual Studio中构建"时,要运行的测试将作为 构建。

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

(可选(以便 Visual Studio 能够发现测试。

Catch2 具有 CMake 集成,其中包含用于在 CTest 中自动注册TEST_CASE的 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 集成。