Этот шаблон проекта позволяет легко переключаться между различными фреймворками тестирования в 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
