Когда вы пишете набор модульных тестов, вам могут потребоваться некоторые действия, не связанные с тестированием. Эти действия могут принимать любую форму. Перед выполнением теста может потребоваться подключиться к базе данных или собрать ресурсы. После выполнения каждого тестового случая может потребоваться освободить некоторые ресурсы.

Выполнение любого из этих действий, не связанных с тестированием, за пределами класса модульного теста может быть утомительным, если не невозможным. Успешное выполнение вашего тестового класса может зависеть от этих действий, поэтому JUnit предоставляет две пары аннотаций для решения этой проблемы.

Аннотация @BeforeAll

Тестовый класс JUnit может иметь один или несколько тестовых методов. Аннотация @BeforeAll сигнализирует о том, что определенный метод должен выполняться перед всеми тестовыми методами в тестовом классе. Метод, связанный с этой аннотацией, выполняется только один раз (в начале теста) независимо от количества тестовых методов в тестовом классе.

instagram viewer

Любой метод, использующий аннотацию @BeforeAll, должен соответствовать нескольким условиям. Эти методы должны иметь возвращаемый тип void, должны быть общедоступными и не должны быть закрытыми. Аннотация @BeforeAll идеально подходит для создания подключение к базе данных или создание нового файла. В этой статье используется тестовый класс калькулятора, чтобы показать, как можно использовать аннотацию @BeforeAll.

Класс калькулятора

упаковка ком.приложение;
публичныйучебный классКалькулятор{
публичныйстатическийинтдобавлять(инт число1, инт число2){
возвращаться число1 + число2;
}
публичныйстатическийинтвычесть(инт число1, инт число2){
возвращаться число1 - число2;
}
публичныйстатическийинтумножить(инт число1, инт число2){
возвращаться число1 * число2;
}
публичныйстатическийинтразделять(инт число1, инт число2){
возвращаться число1 / число2;
}
}

Класс CalculatorTest

импортстатическийорганизация.junit.Юпитер.апи.Утверждения.*;
импорторганизация.junit.Юпитер.апи.BeforeAll;
импорторганизация.junit.Юпитер.апи.Тест;
импорторганизация.junit.Юпитер.апи.Показать имя;

@DisplayName("Тестовый класс, демонстрирующий, как использовать в доа такжепосле аннотации").
учебный классКалькуляторТест{
@BeforeAll
публичныйстатическийпустотаpowerOnКалькулятор(){
Система.out.println("Калькулятор включен");
}

@Тест
@Показать имя("Метод тестирования, добавляющий два целочисленных значения.")
публичныйпустотатестДобавить(){
Утвердитьравно(7, Калькулятор.добавлять(3, 4));
}

@Тест
@Показать имя("Метод тестирования, который вычитает одно целочисленное значение из другого.")
публичныйпустотатестВычитание(){
Утвердитьравно(6, Калькулятор.вычесть(9, 3));
}

@Тест
@Показать имя("Метод тестирования, умножающий два целых числа")
публичныйпустотатестумножить(){
Утвердитьравно(10, Калькулятор.умножить(5, 2));
}

@Тест
@Показать имя("Метод тестирования, который делит одно целочисленное значение на другое")
публичныйпустотатестРазделить(){
Утвердитьравно(2, Калькулятор.разделять(4, 2));
}
}

В этом классе аннотация @BeforeAll работает с методом powerOnCalculator(), который печатает «Калькулятор включен» перед выполнением любого теста. При успешном выполнении теста печатается следующий тестовый отчет:

Как видите, метод, связанный с аннотацией @BeforeAll, не отображается в отчете о тестировании. Однако, если в методе аннотации @BeforeAll есть ошибка, в результатах тестового отчета это будет указано как сбой.

Аннотация @BeforeEach

Как и аннотированный метод @BeforeAll, аннотированный метод @BeforeEach не будет отображаться в отчете о тестировании. Аннотированный метод @BeforeEach выполняется перед каждым тестовым методом в тестовом классе. Итак, если тестовый класс содержит два тестовых метода, то аннотация @BeforeEach будет выполняться дважды.

импортстатическийорганизация.junit.Юпитер.апи.Утверждения.*;
импорторганизация.junit.Юпитер.апи.BeforeAll;
импорторганизация.junit.Юпитер.апи.BeforeEach;
импорторганизация.junit.Юпитер.апи.Тест;
@DisplayName("Тестовый класс, демонстрирующий, как использовать в доа такжепосле аннотации").
учебный классКалькуляторТест{
@BeforeAll
публичныйстатическийпустотаpowerOnКалькулятор(){
Система.out.println("Калькулятор включен");
}
@BeforeEach
публичныйпустотаочиститьКалькулятор(){
Система.out.println("Калькулятор готов");
}
@Тест
@Показать имя("Метод тестирования, добавляющий два целочисленных значения.")
публичныйпустотатестДобавить(){
Утвердитьравно(7, Калькулятор.добавлять(3, 4));
}
@Тест
@Показать имя("Метод тестирования, который вычитает одно целочисленное значение из другого.")
публичныйпустотатестВычитание(){
Утвердитьравно(6, Калькулятор.вычесть(9, 3));
}
@Тест
@Показать имя("Метод тестирования, умножающий два целых числа")
публичныйпустотатестумножить(){
Утвердитьравно(10, Калькулятор.умножить(5, 2));
}
@Тест
@Показать имя("Метод тестирования, который делит одно целочисленное значение на другое")
публичныйпустотатестРазделить(){
Утвердитьравно(2, Калькулятор.разделять(4, 2));
}
}

Добавление аннотации @BeforeEach к классу CalculatorTest приводит к следующему результату:

Метод, связанный с аннотацией @BeforeEach, выполняется четыре раза, по одному разу перед каждым тестовым методом. Обратите внимание, что метод @BeforeEach не является статическим, имеет возвращаемый тип void и не является приватным, поскольку это обязательные условия. Также важно отметить, что метод, связанный с аннотацией @BeforeEach, запускается после метода @BeforeAll.

Аннотация @AfterAll

Метод с аннотацией @AfterAll будет выполняться после того, как все тестовые методы в тестовом классе завершат свое выполнение. Аннотация @AfterAll идеально подходит для основные операции с файлами, например закрытие файла или отключение от базы данных. Аннотация @AfterAll является аналогом аннотации @BeforeAll. Как и аннотация @BeforeAll, аннотация @AfterAll должна быть статической, должна возвращать значение void и многое другое не должно быть частным.

@После всего
публичныйстатическийпустотаpowerOffКалькулятор(){
Система.out.println("Калькулятор выключен");
}

Добавление аннотированного метода @AfterAll к существующему классу CalculatorTest выводит на консоль следующий вывод:

Обратите внимание, что метод powerOffCalculator(), в котором используется аннотация @AfterAll, печатается в конце тестового класса после выполнения всех тестовых методов.

Аннотация @AfterEach

Аннотация @AfterEach является аналогом аннотации @BeforeEach. У них одинаковые обязательные условия, которые немного отличаются от аннотаций @BeforeAll и @AfterAll. Что отличает аннотацию @AfterEach от аннотации @BeforeEach (кроме их имен), так это то, что метод @AfterEach запускается после каждого метода тестирования.

@AfterEach
публичныйпустотаreturnРезультаты(){
Система.out.println("Результаты готовы");
}

Выполнение класса CalculatorTest выводит на консоль следующий вывод:

Вывод показывает, что метод, связанный с аннотацией @AfterEach (returnResults), печатается четыре раза. Каждое выполнение метода returnResults() происходит только после выполнения каждого модульного теста. Это видно по тому факту, что вывод метода returnResults() появляется после каждого вывода метода, связанного с аннотацией @BeforeEach.

Отшлифуйте свои наборы тестов с помощью аннотаций

JUnit позволяет обрабатывать процессы, не связанные с тестированием, используя парные аннотации до и после. Эти четыре аннотации принадлежат к списку нескольких других аннотаций, которые повышают ценность ваших тестов. Еще одна аннотация JUnit — @DisplayName.

В двух примерах кода, отображающих полный класс CalculatorTest, используется аннотация @DisplayName. Аннотация @DisplayName помогает создавать более понятные имена для ваших тестовых классов и тестовых методов.