Введение
C++ — мощный язык, но слабо оснащён встроенными средствами тестирования. К счастью, существует множество сторонних фреймворков, упрощающих написание и выполнение тестов. Они различаются по стилю, функциональности, сложности и скорости.
В этой статье мы сравним наиболее популярные фреймворки:
- Google Test (GTest)
- Catch2
- Doctest
- Boost.Test
- QTest
Критерии сравнения
| Критерий | Описание |
|---|---|
| Простота использования | Насколько легко начать работу |
| Стиль синтаксиса | Макросы, декларативность, BDD |
| Поддержка моков/шпионов | Возможность подменять объекты |
| Поддержка параметризованных тестов | Передача разных значений |
| Интеграция с CMake/qmake | Удобство включения в проект |
| Поддержка CI | Вывод в форматах для CI |
| Производительность компиляции | Время сборки больших тестов |
| Размер библиотеки | Заголовочная/собираемая |
1. Google Test (GTest)
Обзор:
Самый популярный фреймворк для C++. Поддерживает мок-объекты (через Google Mock), параметризованные тесты, проверки исключений, фикстуры.
Пример:
TEST(MathTest, Sum) {
EXPECT_EQ(2 + 2, 4);
}
Особенности:
✅ Поддержка моков (Google Mock)
✅ Сильная типизация
✅ Поддержка исключений
✅ Параметризованные тесты
⛔ Требует компиляции (.a/.so)
⛔ Не заголовочный — нужно подключать к CMake
2. Catch2
Обзор:
Заголовочная библиотека в стиле «включи и пиши». Поддерживает BDD-стиль, прост в использовании. Очень популярен в open-source.
Пример:
TEST_CASE("Factorial") {
REQUIRE(factorial(3) == 6);
}
Особенности:
✅ Один заголовок (catch.hpp)
✅ Отлично работает в CMake
✅ Удобный стиль тестов (REQUIRE, CHECK)
✅ Поддержка BDD (SCENARIO, GIVEN)
⛔ Нет встроенной поддержки моков
⛔ Немного медленнее по времени выполнения, чем doctest
3. Doctest
Обзор:
Лёгкая заголовочная библиотека, вдохновлённая Catch2, но оптимизированная под скорость компиляции. Отлично подходит для TDD.
Пример:
TEST_CASE("Sum test") {
CHECK(1 + 2 == 3);
}
Особенности:
✅ Быстрее всего компилируется
✅ Один файл (doctest.h)
✅ Стиль как у Catch2
✅ Удобен для встраивания в библиотеки
⛔ Нет моков
⛔ Немного менее популярен
4. Boost.Test
Обзор:
Часть библиотеки Boost. Очень мощный и гибкий, но требует времени на освоение.
Пример:
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(my_test) {
BOOST_CHECK(2 + 2 == 4);
}
Особенности:
✅ Мощный (много макросов, модули, фикстуры)
✅ Часть Boost — удобно для тех, кто уже использует Boost
⛔ Сложный синтаксис
⛔ Более тяжелая интеграция
⛔ Требует сборки Boost, может усложнить CI
5. QTest (Qt Test)
Обзор:
Фреймворк для тестирования Qt-приложений, встроен в Qt. Поддерживает GUI-тестирование, сигналы/слоты и события.
Пример:
QCOMPARE(add(2, 2), 4); QVERIFY(myWidget->isVisible());
Особенности:
✅ Поддержка GUI и сигналов/слотов
✅ Интеграция с Qt Creator
✅ Поддержка XML и TAP форматов
⛔ Только для Qt-проектов
⛔ Нет моков
⛔ Неудобен для не-GUI кода
Сравнительная таблица
| Фреймворк | Заголовочная? | Моки | GUI | BDD | Простота | Скорость сборки | Подходит для |
|---|---|---|---|---|---|---|---|
| Google Test | ❌ | ✅ | ❌ | ❌ | ⭐⭐⭐ | ⭐⭐ | Бизнес-логика, моки |
| Catch2 | ✅ | ❌ | ❌ | ✅ | ⭐⭐⭐⭐ | ⭐⭐⭐ | Простые проекты, TDD |
| Doctest | ✅ | ❌ | ❌ | ❌ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Библиотеки, TDD |
| Boost.Test | ❌ | ❌ | ❌ | ❌ | ⭐ | ⭐ | Большие системы |
| QTest | ❌ | ❌ | ✅ | ❌ | ⭐⭐⭐ | ⭐⭐ | Qt-проекты, GUI |
Что выбрать?
| Сценарий | Рекомендуемый фреймворк |
|---|---|
| Проект на Qt | QTest |
| Нужно много моков и стабов | Google Test + Google Mock |
| Минимальная зависимость и легкость | Catch2 или Doctest |
| Большая система с Boost | Boost.Test |
| Нужно BDD-подобное поведение | Catch2 |
| Высокая скорость компиляции | Doctest |
Заключение
Все современные проекты на C++ должны использовать тесты. К счастью, вы можете выбрать подходящий фреймворк в зависимости от:
- Стиля команды
- Сложности проекта
- Наличия Qt
- Необходимости моков
