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 |
| Используется Boost | Boost.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.
