Подключение популярных фреймворков тестирования к Qt-проекту

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

Qt поддерживает встроенное тестирование через QTest, но при разработке на C++ часто возникает необходимость использовать внешние фреймворки: Google Test, Catch2, Doctest, Boost.Test. В этой статье сравниваются и описываются способы их подключения к проекту на Qt (с использованием CMake и qmake).

Общие условия

Для всех фреймворков тестирования предполагается:

  • Qt ≥ 5.12
  • Используется CMake (в новых проектах Qt 6 это основной выбор)
    (отдельно даны примеры для qmake, где возможно)

1. QTest — встроенный фреймворк Qt

Подключение:

qmake:

QT += testlib

CMake:

find_package(Qt5 REQUIRED COMPONENTS Test)

target_link_libraries(mytest PRIVATE Qt5::Test)

Пример:

#include <QtTest>

class TestExample : public QObject {
    Q_OBJECT
private slots:
    void testAddition() {
        QCOMPARE(2 + 2, 4);
    }
};

QTEST_MAIN(TestExample)
#include "test_example.moc"

2. Google Test (GTest)

Установка:

Рекомендуется подключать GTest как внешнюю зависимость:

git clone https://github.com/google/googletest.git

Подключение в CMake:

add_subdirectory(googletest)
enable_testing()

add_executable(mytest test.cpp)
target_link_libraries(mytest gtest gtest_main Qt5::Core)

Используйте Qt5::Core или другие модули, если в тестах участвуют объекты Qt.

Пример:

#include <gtest/gtest.h>

TEST(MathTest, BasicAddition) {
    EXPECT_EQ(2 + 2, 4);
}

3. Catch2

Установка:

git clone https://github.com/catchorg/Catch2.git

Подключение в CMake:

add_subdirectory(Catch2)
add_executable(mytest test.cpp)
target_link_libraries(mytest Catch2::Catch2WithMain Qt5::Core)

Или используйте catch_amalgamated.hpp как единственный файл.

#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>

TEST_CASE("Addition works") {
    REQUIRE(2 + 2 == 4);
}

4. Doctest

Установка:

Просто скачайте doctest.h с https://github.com/doctest/doctest

Подключение:

add_executable(mytest test.cpp)
target_link_libraries(mytest Qt5::Core)

или используйте CMake FetchContent:

include(FetchContent)
FetchContent_Declare(
  doctest
  GIT_REPOSITORY https://github.com/doctest/doctest.git
  GIT_TAG        v2.4.11
)
FetchContent_MakeAvailable(doctest)

target_link_libraries(mytest doctest Qt5::Core)

Пример:

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"

TEST_CASE("Addition") {
    CHECK(2 + 2 == 4);
}

5. Boost.Test

Установка:

Убедитесь, что установлен Boost с поддержкой unit_test_framework.

Подключение в CMake:

find_package(Boost REQUIRED COMPONENTS unit_test_framework)
add_executable(mytest test.cpp)
target_link_libraries(mytest Boost::unit_test_framework Qt5::Core)

Пример:

#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(AdditionTest) {
    BOOST_CHECK_EQUAL(2 + 2, 4);
}

Сравнение подходов

ФреймворкИнтеграция с QtЛёгкость настройкиАсинхронностьДокументация/сообщество
QTest✅ Полная✅ Простая✅ Поддержка событий Qt🟡 Умеренное
Google Test🟡 Частичная🟠 Требует CMake❌ Нет событий Qt✅ Очень большое
Catch2🟡 Частичная✅ Простой заголовок❌ Нет событий Qt✅ Активное
Doctest🟡 Частичная✅ Самый лёгкий❌ Нет событий Qt🟡 Меньше
Boost.Test🟠 Сложная🔴 Трудная настройка❌ Нет событий Qt✅ Большое

Рекомендации

ЦельЛучший выбор
Полная Qt-интеграция, сигнал/слотыQTest
Лёгкий запуск, компактные тестыDoctest, Catch2
Большие проекты, CI, сложные проверкиGoogle Test
Используется BoostBoost.Test

Пример структуры проекта с CMake

project/
├── CMakeLists.txt
├── src/
│   └── main.cpp
├── tests/
│   ├── test_example.cpp
│   └── CMakeLists.txt
├── extern/
│   └── googletest/

Заключение

В зависимости от ваших целей и предпочтений вы можете выбрать наиболее подходящий фреймворк:

  • QTest — лучше всего интегрируется с объектами QObject, сигналами и GUI.
  • Google Test — мощный фреймворк для комплексных проверок.
  • Catch2 / Doctest — лёгкие, простые в подключении и читаемые.
  • Boost.Test — если уже используете Boost.