Когато пишете модулен тестов пакет, може да има някои дейности, несвързани с тестове, които трябва да извършите. Тези дейности могат да приемат всякаква форма. Може да се наложи да се свържете с база данни или да съберете ресурси, преди да извършите тест. След изпълнението на всеки тестов случай може да се наложи да освободите някои ресурси.
Извършването на която и да е от тези несвързани с тест дейности извън обхвата на единичен тестов клас може да бъде досадно, ако не и невъзможно. Успешното изпълнение на вашия тестов клас може да зависи от тези дейности, така че JUnit предоставя две двойки анотации за справяне с този проблем.
Анотацията @BeforeAll
Един тестов клас JUnit може да има един или повече тестови методи. Анотацията @BeforeAll сигнализира, че определен метод трябва да се изпълни преди всички тестови методи в тестов клас. Методът, свързан с тази анотация, се изпълнява само веднъж (в началото на теста), независимо от броя на тестовите методи в тестовия клас.
Всеки метод, който използва анотацията @BeforeAll, трябва да следва няколко условия. Тези методи трябва да имат тип връщане void, трябва да са публични и не трябва да са частни. Анотацията @BeforeAll е идеална за установяване на a
връзка към база данни или създаване на нов файл. Тази статия използва тестов клас на калкулатор, за да покаже как можете да използвате анотацията @BeforeAll.Класът калкулатор
пакет com.app;
публиченкласКалкулатор{
публиченстатиченвътрдобавете(вътр номер1, вътр номер2){
връщане num1 + num2;
}
публиченстатиченвътризваждам(вътр номер1, вътр номер2){
връщане num1 - num2;
}
публиченстатиченвътрумножават се(вътр номер1, вътр номер2){
връщане num1 * num2;
}
публиченстатиченвътрразделям(вътр номер1, вътр номер2){
връщане num1 / num2;
}
}
Класът CalculatorTest
импортиранестатиченорг.junit.юпитер.api.Твърдения.*;
импортиранеорг.junit.юпитер.api.BeforeAll;
импортиранеорг.junit.юпитер.api.Тест;
импортиранеорг.junit.юпитер.api.Показвано име;@DisplayName("Тест клас, демонстриращ как да използване на предиислед анотации.")
класКалкулаторТест{
@BeforeAll
публиченстатиченневалиденpowerOnCalculator(){
System.out.println("Калкулаторът е включен");
}@Тест
@Показвано име("Метод на тестване, който добавя две цели числа.")
публиченневалиденtestAdd(){
assertEquals(7, Калкулатор.добавете(3, 4));
}@Тест
@Показвано име("Метод на тестване, който изважда едно цяло число от друго.")
публиченневалиденtestSubtract(){
assertEquals(6, Калкулатор.изваждане(9, 3));
}@Тест
@Показвано име("Метод на тестване, който умножава две цели числа")
публиченневалиденtestMultiply(){
assertEquals(10, Калкулатор.умножавам(5, 2));
}
@Тест
@Показвано име("Метод на тестване, който разделя едно цяло число на друго")
публиченневалиденtestDivide(){
assertEquals(2, Калкулатор.разделям(4, 2));
}
}
В този клас анотацията @BeforeAll работи с метода powerOnCalculator(), който отпечатва „Калкулаторът е включен“ преди всяко тестово изпълнение. Успешното изпълнение на теста отпечатва следния тестов отчет:
Както можете да видите, методът, свързан с анотацията @BeforeAll, не се появява в отчета за теста. Въпреки това, ако има грешка в метода за анотация @BeforeAll, резултатите от тестовия отчет ще посочат това с грешка.
Анотацията @BeforeEach
Подобно на анотирания метод @BeforeAll, анотираният метод @BeforeEach няма да се появи в отчета за теста. Анотираният метод @BeforeEach се изпълнява преди всеки тестов метод в тестов клас. Така че, ако един тестов клас съдържа два тестови метода, тогава анотацията @BeforeEach ще се изпълни два пъти.
импортиранестатиченорг.junit.юпитер.api.Твърдения.*;
импортиранеорг.junit.юпитер.api.BeforeAll;
импортиранеорг.junit.юпитер.api.BeforeEach;
импортиранеорг.junit.юпитер.api.Тест;
@DisplayName("Тест клас, демонстриращ как да използване на предиислед анотации.")
класКалкулаторТест{
@BeforeAll
публиченстатиченневалиденpowerOnCalculator(){
System.out.println("Калкулаторът е включен");
}
@BeforeEach
публиченневалиденclearCalculator(){
System.out.println("Калкулаторът е готов");
}
@Тест
@Показвано име("Метод на тестване, който добавя две цели числа.")
публиченневалиденtestAdd(){
assertEquals(7, Калкулатор.добавете(3, 4));
}
@Тест
@Показвано име("Метод на тестване, който изважда едно цяло число от друго.")
публиченневалиденtestSubtract(){
assertEquals(6, Калкулатор.изваждане(9, 3));
}
@Тест
@Показвано име("Метод на тестване, който умножава две цели числа")
публиченневалиденtestMultiply(){
assertEquals(10, Калкулатор.умножавам(5, 2));
}
@Тест
@Показвано име("Метод на тестване, който разделя едно цяло число на друго")
публиченневалиденtestDivide(){
assertEquals(2, Калкулатор.разделям(4, 2));
}
}
Добавянето на анотацията @BeforeEach към класа CalculatorTest води до следния резултат:
Методът, свързан с анотацията @BeforeEach, се изпълнява четири пъти, веднъж преди всеки тестов метод. Трябва да имате предвид, че методът @BeforeEach не е статичен, има невалиден тип връщане и не е частен, тъй като това са задължителни условия. Също така е важно да се отбележи, че методът, свързан с анотацията @BeforeEach, се изпълнява след метода @BeforeAll.
Анотацията @AfterAll
Метод с анотацията @AfterAll ще се изпълни, след като всички тестови методи в тестовия клас завършат своето изпълнение. Анотацията @AfterAll е идеална за основни файлови операции, като затваряне на файл или прекъсване на връзката с база данни. Анотацията @AfterAll е противоположна на анотацията @BeforeAll. Подобно на анотацията @BeforeAll, анотацията @AfterAll трябва да е статична, трябва да връща void и много да не е частна.
@След всичко
публиченстатиченневалиденpowerOffCalculator(){
System.out.println("Калкулаторът е изключен");
}
Добавянето на анотирания метод @AfterAll към съществуващия клас CalculatorTest отпечатва следния изход към конзолата:
Имайте предвид, че методът powerOffCalculator(), който използва анотацията @AfterAll, се отпечатва в края на тестовия клас, след като всички тестови методи се изпълнят.
Анотацията @AfterEach
Анотацията @AfterEach е противоположна на анотацията @BeforeEach. Те имат същите задължителни условия, които са малко по-различни от тези на анотациите @BeforeAll и @AfterAll. Това, което отличава анотацията @AfterEach от анотацията @BeforeEach (с изключение на техните имена), е, че методът @AfterEach се изпълнява след всеки тестов метод.
@AfterEach
публиченневалиденreturnResults(){
System.out.println("Резултатите са готови");
}
Изпълнението на класа CalculatorTest отпечатва следния изход към конзолата:
Резултатът показва, че методът, свързан с анотацията @AfterEach (returnResults), се отпечатва четири пъти. Всяко изпълнение на метода returnResults() се случва само след изпълнението на всеки единичен тест. Това е очевидно от факта, че изходът на метода returnResults() се появява след всеки изход от метода, свързан с анотацията @BeforeEach.
Усъвършенствайте вашите тестови пакети с помощта на анотации
JUnit ви позволява да управлявате процеси, които не са свързани с тестове, като използвате поясненията за двойки преди и след. Тези четири анотации принадлежат към списък с няколко други анотации, които добавят стойност към вашите тестове. Друга анотация на JUnit е @DisplayName.
Двата примера на код, които показват пълния клас CalculatorTest, използват анотацията @DisplayName. Анотацията @DisplayName ви помага да създадете по-смислени имена за вашите тестови класове и тестови методи.