0Pricing
C++ Academy · Урок

Фикстуры и настройка

Используйте общую настройку тестов

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

Общая настройка для нескольких тестов

Если нескольким тестам нужны одни и те же объекты, фикстура позволяет определить такую настройку один раз. Фикстура — это класс, производный от ::testing::Test.

Определение фикстуры

Члены фикстуры доступны в каждом использующем её тесте. SetUp() выполняется перед каждым тестом, а TearDown() — после него.

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

class VectorTest : public ::testing::Test {
protected:
    std::vector<int> v;
    void SetUp() override { v = {1, 2, 3}; }
};

Использование TEST_F

Тесты, использующие фикстуру, записываются с помощью TEST_F; первым аргументом передаётся имя класса фикстуры.

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

class VectorTest : public ::testing::Test {
protected:
    std::vector<int> v{1, 2, 3};
};

TEST_F(VectorTest, HasThree) {
    EXPECT_EQ(v.size(), 3u);
}

TEST_F(VectorTest, FirstIsOne) {
    EXPECT_EQ(v.front(), 1);
}

Новый экземпляр для каждого теста

GTest создаёт новый объект фикстуры для каждого теста. Тесты никогда не используют общее изменяемое состояние, поэтому остаются независимыми, а порядок их выполнения не имеет значения.

SetUp и конструктор

Члены можно инициализировать в конструкторе или в SetUp(). Используйте SetUp(), если инициализация может выбросить исключение или если нужно безопасно вызывать виртуальные методы.

#include <gtest/gtest.h>

class Resource : public ::testing::Test {
protected:
    int* data = nullptr;
    void SetUp() override { data = new int(10); }
    void TearDown() override { delete data; }
};

TEST_F(Resource, HasTen) {
    EXPECT_EQ(*data, 10);
}

TearDown для очистки

TearDown() освобождает ресурсы, полученные в SetUp(). Если используются члены с RAII, деструктор часто выполняет эту работу автоматически, и TearDown() может вообще не понадобиться.

Настройка на уровне набора

Для дорогостоящих общих ресурсов используйте статические SetUpTestSuite() и TearDownTestSuite(). Они выполняются один раз для каждого набора, а не для каждого теста.

#include <gtest/gtest.h>

class DbTest : public ::testing::Test {
protected:
    static void SetUpTestSuite() { /* open shared connection */ }
    static void TearDownTestSuite() { /* close it */ }
};

Для каждого теста и для всего набора

Выбирайте внимательно.

  • SetUp/TearDown: для каждого теста, изолированно и безопасно
  • SetUpTestSuite/TearDownTestSuite: для всего набора, совместно и быстрее, но тесты могут влиять друг на друга

Вспомогательные методы

Фикстуры могут содержать вспомогательные методы, используемые несколькими тестами, чтобы каждый тест был сосредоточен на своих проверках.

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

class ParserTest : public ::testing::Test {
protected:
    int parse(const std::string& s) { return std::stoi(s); }
};

TEST_F(ParserTest, ParsesNumber) {
    EXPECT_EQ(parse("42"), 42);
}

Глобальное окружение

Для настройки на уровне всего процесса (однократного запуска перед любым тестом) зарегистрируйте ::testing::Environment с помощью AddGlobalTestEnvironment. Это полезно для ведения журнала или инициализации фреймворка.

Сохранение независимости тестов

Поскольку каждый TEST_F получает новую фикстуру, никогда не полагайтесь на побочные эффекты другого теста. Независимость упрощает диагностику сбоев и делает тесты безопасными для параллельного запуска.

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

Вспомните жизненный цикл фикстуры.

Итоги

Вы изучили фикстуры.

  • Наследуйтесь от ::testing::Test и используйте TEST_F
  • SetUp/TearDown выполняются для каждого теста, каждый раз создаётся новый объект
  • Используйте SetUpTestSuite для общих ресурсов, создаваемых один раз на набор
  • Вспомогательные методы и глобальные окружения помогают работать с большими наборами тестов

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

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

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

Чему я научусь в уроке «Фикстуры и настройка»?

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

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

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

Сколько времени занимает урок «Фикстуры и настройка»?

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

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

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

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

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