Шаблон CMake-проекта с переключениями библиотеками тестирования

Автор: | 20 июня, 2025

Этот шаблон проекта позволяет легко переключаться между различными фреймворками тестирования в C++/Qt:

  • QTest
  • Google Test
  • Catch2
  • Doctest

Структура проекта (предполагаемая)

project/
├── CMakeLists.txt
├── src/
│   └── myclass.cpp
│   └── myclass.h
├── tests/
│   └── test_qtest.cpp
│   └── test_gtest.cpp
│   └── test_catch2.cpp
│   └── test_doctest.cpp

Шаблон

cmake_minimum_required(VERSION 3.16)
project(QtTestFrameworkSwitch LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Опции для выбора тестового фреймворка
option(USE_QTEST     "Use QTest for unit tests" ON)
option(USE_GTEST     "Use GoogleTest for unit tests" OFF)
option(USE_CATCH2    "Use Catch2 for unit tests" OFF)
option(USE_DOCTEST   "Use Doctest for unit tests" OFF)

# Qt
find_package(Qt5 REQUIRED COMPONENTS Core Test)

# Исходники
add_library(core STATIC src/myclass.cpp src/myclass.h)
target_link_libraries(core PUBLIC Qt5::Core)

# Тесты
if(USE_QTEST)
    message(STATUS "Using QTest")
    add_executable(test_runner tests/test_qtest.cpp)
    target_link_libraries(test_runner PRIVATE core Qt5::Test)
    add_test(NAME QTestRunner COMMAND test_runner)

elseif(USE_GTEST)
    message(STATUS "Using GoogleTest")
    include(FetchContent)
    FetchContent_Declare(
        googletest
        GIT_REPOSITORY https://github.com/google/googletest.git
        GIT_TAG        release-1.12.1
    )
    FetchContent_MakeAvailable(googletest)
    enable_testing()
    add_executable(test_runner tests/test_gtest.cpp)
    target_link_libraries(test_runner PRIVATE core gtest gtest_main Qt5::Core)
    add_test(NAME GTestRunner COMMAND test_runner)

elseif(USE_CATCH2)
    message(STATUS "Using Catch2")
    include(FetchContent)
    FetchContent_Declare(
        catch2
        GIT_REPOSITORY https://github.com/catchorg/Catch2.git
        GIT_TAG        v3.5.2
    )
    FetchContent_MakeAvailable(catch2)
    add_executable(test_runner tests/test_catch2.cpp)
    target_link_libraries(test_runner PRIVATE core Catch2::Catch2WithMain Qt5::Core)
    include(CTest)
    include(Catch)
    catch_discover_tests(test_runner)

elseif(USE_DOCTEST)
    message(STATUS "Using Doctest")
    include(FetchContent)
    FetchContent_Declare(
        doctest
        GIT_REPOSITORY https://github.com/doctest/doctest.git
        GIT_TAG        v2.4.11
    )
    FetchContent_MakeAvailable(doctest)
    add_executable(test_runner tests/test_doctest.cpp)
    target_link_libraries(test_runner PRIVATE core doctest Qt5::Core)
    add_test(NAME DoctestRunner COMMAND test_runner)

else()
    message(FATAL_ERROR "No test framework selected.")
endif()

Как собрать

mkdir build && cd build

# Для QTest (по умолчанию):
cmake .. -DUSE_QTEST=ON

# Для Google Test:
cmake .. -DUSE_QTEST=OFF -DUSE_GTEST=ON

# Для Catch2:
cmake .. -DUSE_QTEST=OFF -DUSE_CATCH2=ON

# Для Doctest:
cmake .. -DUSE_QTEST=OFF -DUSE_DOCTEST=ON

make
ctest