Проверки и сопоставители
Пишите выразительные проверки
«Проверки и сопоставители» — бесплатный урок 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_NEEXPECT_LT,EXPECT_LEEXPECT_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,LtContains,ElementsAre,UnorderedElementsAreHasSubstr,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 — локальная установка не требуется.
Все уроки этого курса
- Настройка GTest
- Проверки и сопоставители
- Фикстуры и настройка
- Имитация с GMock