Назад к вопросам
Junior
124
questionbank

Что такое фикстуры?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Фикстуры (fixtures) в контексте тестирования, особенно в Java с использованием фреймворков типа JUnit или TestNG, — это состояние тестовой среды, которое готовится до выполнения тестовых методов и очищается после их завершения.

Они используются для:

  • Установки начальных условий: Создание необходимых объектов, подключение к базам данных, настройка моков и т.д.
  • Поддержания изоляции: Гарантия того, что каждый тест выполняется в чистой и предсказуемой среде, не зависящей от других тестов.
  • Экономии времени: Избегание дублирования кода для подготовки среды в каждом тесте.

JUnit предлагает аннотации для управления фикстурами:

  • @BeforeAll (или @BeforeClass в JUnit 4): Выполняется один раз перед всеми тестовыми методами в классе. Используется для настройки ресурсов, требующих значительных затрат (например, создание подключения к базе данных).
  • @BeforeEach (или @Before в JUnit 4): Выполняется перед каждым тестовым тестовым методом. Используется для создания объектов, специфичных для конкретного теста.
  • @AfterEach (или @After в JUnit 4): Выполняется после каждого тестового метода. Используется для очистки ресурсов после теста.
  • @AfterAll (или @AfterClass в JUnit 4): Выполняется один раз после всех тестовых методов в классе. Используется для закрытия ресурсов, открытых в @BeforeAll.

Пример использования в JUnit 5:

// import'ы

class MyServiceTest {

    private MyService myService;
    private Connection dbConnection;

    @BeforeAll
    static void setupDatabaseConnection() {
        // Установить соединение с базой данных один раз
        // dbConnection = DriverManager.getConnection("jdbc:...");
        System.out.println("Database connection established.");
    }

    @AfterAll
    static void closeDatabaseConnection() {
        // Закрыть соединение с базой данных один раз
        // if (dbConnection != null) dbConnection.close();
        System.out.println("Database connection closed.");
    }

    @BeforeEach
    void setUpEachTest() {
        // Создать новый экземпляр сервиса перед каждым тестом
        myService = new MyService(/* dependency injection */);
        System.out.println("MyService instance created.");
    }

    @AfterEach
    void tearDownEachTest() {
        // Очистить состояние или сбросить моки после каждого теста
        myService = null;
        System.out.println("MyService instance cleared.");
    }

    @Test
    void testMethod1() {
        // Тестовая логика, использующая myService
        System.out.println("Executing testMethod1");
    }

    @Test
    void testMethod2() {
        // Тестовая логика, использующая myService
        System.out.println("Executing testMethod2");
    }
}