GoogleTest: первые автоматические тесты C++
💻 Информатика · 10 класс
TEST, EXPECT_EQ и ASSERT: проверка функции, выбор случаев и чтение результата.

Что проверяет тест
GoogleTest — библиотека для автоматической проверки программ C++. Тест вызывает код на выбранных данных и сравнивает результат с ожидаемым. Это позволяет повторять проверку после изменения программы. Но успешный запуск доказывает только прохождение выбранных сценариев, а не отсутствие любых возможных ошибок.
Для первого примера проверим функцию, которая ограничивает число снизу нулём. Значимые случаи — отрицательное число, сама граница 0 и положительное число. Три одинаковых положительных входа дали бы меньше информации, чем такие три разных класса.
Код функции и теста
#include <gtest/gtest.h>
int nonnegative(int value)
{
return value < 0 ? 0 : value;
}
TEST(NonnegativeTest, HandlesBoundaryAndSides)
{
EXPECT_EQ(nonnegative(-3), 0);
EXPECT_EQ(nonnegative(0), 0);
EXPECT_EQ(nonnegative(8), 8);
}Первый аргумент TEST задаёт имя набора тестов, второй — отдельного теста. Имена должны быть понятными и не содержать подчёркиваний согласно рекомендациям GoogleTest. Тело состоит из обычного C++ и проверок библиотеки. В примере три ожидания относятся к одной простой функции.
EXPECT и ASSERT
EXPECT_EQ проверяет равенство и при неудаче сообщает ошибку, позволяя продолжить текущую функцию теста. ASSERT_EQ при неудаче немедленно завершает текущую функцию. Он нужен, если продолжение небезопасно или бессмысленно: например, перед доступом к элементам сначала проверяют необходимый размер.
ASSERT не является командой остановить весь процесс тестирования. Другие тесты могут выполняться дальше. Утверждение с EXPECT тоже делает весь тест неуспешным, если обнаружено несовпадение: продолжение не означает, что ошибка игнорируется.
Как запустить
Нужно настроить сборку C++ с доступными заголовками и библиотеками GoogleTest. Один вариант — официальный пример проекта CMake: подключить библиотеку, создать исполняемую цель тестов и связать её с gtest_main. Эта цель предоставляет готовую точку входа; тогда писать собственный main в тестовом файле не требуется.
Универсальная команда компиляции без настройки путей не работает во всех системах. Используйте официальный quickstart для выбранного сборщика и поддерживаемую версию компилятора. Само подключение заголовка не означает, что компоновщик уже знает, где находится библиотека.
Разобранная ошибка
Представим, что разработчик ошибочно вернул 1 для всех неположительных чисел. Первые две проверки обнаружат несовпадение, третья может пройти. Если оставить только вход 8, этот дефект останется незамеченным. Поэтому качество теста определяется выбором условий и ожидаемых результатов, а не числом зелёных строк.
Что ещё важно
Тесты должны быть воспроизводимыми и независимыми. Не заставляйте один тест рассчитывать на то, что другой уже изменил общую переменную. Для вещественных вычислений существуют специальные проверки с учётом точности; прямое равенство подходит не всегда. Сравнение C-строк тоже требует подходящего средства, а не бездумного сравнения адресов.
Практика
- Какой результат ожидается для nonnegative(-10)?
- Остановит ли неудачный EXPECT_EQ текущую функцию немедленно?
- Зачем проверять 0 отдельно от 8?
Ответы
1. 0, по контракту функции. 2. Нет: будет зарегистрирована ошибка, выполнение продолжится. 3. Ноль — граница, где часто возникает ошибка сравнения < вместо <= или неверный специальный случай. Ожидание должно исходить из требования, а не копировать ошибочный код.