C++ Academy · Урок

Проверки и сопоставители

Пишите выразительные проверки

Урок 2 из 413 шагов

«Проверки и сопоставители» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Проверки выражают ожидаемые результаты

Проверки GTest проверяют условия внутри теста. Они бывают двух уровней строгости.

  • EXPECT_*: сбой фиксируется, но тест продолжается
  • ASSERT_*: сбой немедленно останавливает текущий тест

EXPECT и ASSERT

Используйте ASSERT_*, если продолжение может привести к аварийному завершению (например, после проверки на null), а в остальных случаях — EXPECT_*, чтобы сразу увидеть все сбои.

#include <gtest/gtest.h>

TEST(Demo, MixedChecks) {
    int* p = new int(5);
    ASSERT_NE(p, nullptr);
    EXPECT_EQ(*p, 5);
    delete p;
}

Проверки сравнений

Основные макросы сравнения:

  • EXPECT_EQ, EXPECT_NE
  • EXPECT_LT, EXPECT_LE
  • EXPECT_GT, EXPECT_GE
#include <gtest/gtest.h>

TEST(Compare, Numbers) {
    EXPECT_LT(2, 3);
    EXPECT_GE(5, 5);
}

Проверки логических значений

EXPECT_TRUE и EXPECT_FALSE напрямую проверяют логические условия.

#include <gtest/gtest.h>

bool is_even(int n) { return n % 2 == 0; }

TEST(Bool, Even) {
    EXPECT_TRUE(is_even(4));
    EXPECT_FALSE(is_even(3));
}

Сравнение чисел с плавающей точкой

Никогда не используйте EXPECT_EQ для чисел с плавающей точкой. Используйте EXPECT_FLOAT_EQ, EXPECT_DOUBLE_EQ или EXPECT_NEAR с заданной погрешностью.

#include <gtest/gtest.h>

TEST(Floats, Approx) {
    EXPECT_DOUBLE_EQ(0.1 + 0.2, 0.3);
    EXPECT_NEAR(3.14159, 3.14, 0.01);
}

Проверки строк

Для строк C используйте EXPECT_STREQ / EXPECT_STRNE. Для std::string подходит EXPECT_EQ, поскольку он сравнивает значения.

#include <gtest/gtest.h>
#include <string>

TEST(Strings, Compare) {
    EXPECT_STREQ("hi", "hi");
    EXPECT_EQ(std::string("ok"), "ok");
}

Проверки исключений

Убедитесь, что код выбрасывает ожидаемое исключение.

#include <gtest/gtest.h>
#include <stdexcept>

void check(int n) {
    if (n < 0) throw std::runtime_error("neg");
}

TEST(Throws, Negative) {
    EXPECT_THROW(check(-1), std::runtime_error);
    EXPECT_NO_THROW(check(1));
}

Пользовательские сообщения об ошибках

Добавляйте дополнительный контекст к проверке с помощью <<, чтобы упростить диагностику сбоев.

#include <gtest/gtest.h>

TEST(Message, WithContext) {
    int x = 7;
    EXPECT_EQ(x, 7) << "x had unexpected value " << x;
}

Сопоставители GMock с EXPECT_THAT

EXPECT_THAT объединяет значение с сопоставителем для наглядных проверок, например EXPECT_THAT(v, ElementsAre(1, 2, 3)).

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>
using ::testing::ElementsAre;

TEST(Matchers, Vector) {
    std::vector<int> v{1, 2, 3};
    EXPECT_THAT(v, ElementsAre(1, 2, 3));
}

Полезные сопоставители

К распространённым сопоставителям относятся:

  • Eq, Ne, Gt, Lt
  • Contains, ElementsAre, UnorderedElementsAre
  • HasSubstr, StartsWith, EndsWith

Выбор подходящей проверки

Предпочитайте наиболее конкретную проверку: она формирует более понятные сообщения о сбоях, чем универсальная EXPECT_TRUE. EXPECT_EQ(a, b) выводит оба значения, а EXPECT_TRUE(a == b) — нет.

Быстрая проверка

Вспомните разницу между EXPECT и ASSERT.

Итоги

Вы изучили проверки GTest.

  • EXPECT_* продолжает выполнение, а ASSERT_* прерывает тест
  • Макросы для сравнений, логических значений, чисел с плавающей точкой, строк и исключений
  • Добавление дополнительного контекста с помощью <<
  • EXPECT_THAT и сопоставители для наглядных проверок
Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Проверки и сопоставители» бесплатный?

Да — полный текст урока «Проверки и сопоставители» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Проверки и сопоставители»?

Пишите выразительные проверки Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Проверки и сопоставители»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка GTest
  2. Проверки и сопоставители
  3. Фикстуры и настройка
  4. Имитация с GMock
← Назад к C++ Academy