Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

GoogleTest: первые автоматические тесты C++

💻 Информатика · 10 класс

TEST, EXPECT_EQ и ASSERT: проверка функции, выбор случаев и чтение результата.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Что проверяет тест

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-строк тоже требует подходящего средства, а не бездумного сравнения адресов.

Практика

  1. Какой результат ожидается для nonnegative(-10)?
  2. Остановит ли неудачный EXPECT_EQ текущую функцию немедленно?
  3. Зачем проверять 0 отдельно от 8?

Ответы

1. 0, по контракту функции. 2. Нет: будет зарегистрирована ошибка, выполнение продолжится. 3. Ноль — граница, где часто возникает ошибка сравнения < вместо <= или неверный специальный случай. Ожидание должно исходить из требования, а не копировать ошибочный код.

Связанные материалы

Источники и материалы