Catch2 с CMake и Visual Studio

Я пытаюсь настроить тестовый фреймворк 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 просто тестируем факториальную функцию, определенную на примере.

Мой файл 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. Когда я нажимаю на Build в Visual Studio, тесты запускаются как часть сборки.

  2. (Необязательно), чтобы Visual Studio могла обнаруживать тесты.

0 ответов

Наконец удалось заставить Catch2 работать с Visual Studio.

Сначала я загрузил выпуск Catch2 с их GitHub и установил его на свой компьютер с помощью (это фактически описано здесь).

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.

тест не завершается неудачно, несмотря на утверждение, что Factorial(0) == 0

Вы должны утверждать, что истинно / ожидаемо. Тогда, если ваш написанный код неверен, он не сработает.

REQUIRE( Factorial(0) == 1 ); (не == 0)

Когда я нажимаю Build в Visual Studio, тесты запускаются как часть сборки.

В среде IDE Visual Studio сборка и запуск - это два отдельных этапа. Если вы хотите упорядочить его автоматически, напишите простой.bat сценарий, который сначала строит, а затем запускает.

(Необязательно), чтобы Visual Studio могла обнаруживать тесты.

Catch2 имеет интеграцию CMake, которая содержит сценарии CMake для автоматической регистрацииTEST_CASEs в CTest.

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.

Другие вопросы по тегам