4.1 @Забранено
Сега нека да разгледаме някои много полезни и популярни анотации на рамката JUnit. Първата анотация ви позволява да изключите конкретен тест, така че JUnit да не го извиква. Необходим е в случаите, когато забележите, че тестът не работи правилно, or промените codeа и тестът случайно се повреди.
Както писах по-рано, 99% от тестовете не се поддържат от никого, така че всички те рано or късно се оказват деактивирани. Следователно тази анотация е първата в списъка с полезни.
Помислете за нейния пример:
public class AppTest {
@Disabled("Test is temporarily disabled. True, true")
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
В горния пример методът testOnDev()
няма да бъде извикан. Между другото, анотацията @Disabled
може да бъде написана непосредствено преди декларацията на класа, тогава всички нейни методи ще бъдат игнорирани.
@Disabled("Temporarily turned off the test, we will fix it by May 2001")
public class AppTest {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
4.2 @Вложени
JUnit ви позволява да извиквате тестови методи на вложени класове. Имам предвид вложени тестови класове. Не е факт, че често ще ги срещате, но има такава възможност, така че трябва да разберете Howво е това.
За да извикате методите на вложен клас преди неговата декларация, трябва да напишете анотация @Nested
. Пример:
public class AppTest {
@Nested
public class DevStagingEnvironment {
@Test
void testOnDev(){
System.setProperty("ENV", "DEV");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
@Nested
public class ProductionEnvironment {
@Test
void testOnProd(){
System.setProperty("ENV", "PROD");
Assumptions.assumeFalse("DEV".equals(System.getProperty("ENV")));
}
}
}
Повече подробности можете да намерите в официалната documentация .
4.3 @ExtendWith
Друга полезна анотация е @ExtendWith
. Най-вероятно ще я срещате много често, така че нека я разгледаме по-подробно.
JUnit е мощна рамка, която ви позволява да пишете различни добавки (разширения) за гъвкаво персонализиране на вашата работа. Някои разширения могат да събират статистически данни за тестове, други могат да емулират файлова система в паметта, трети могат да емулират работа в уеб сървър и т.н.
Ако вашият code се изпълнява в рамка (например Spring), тогава почти винаги тази рамка управлява създаването и конфигурацията на обекти във вашия code . Следователно, специален тестов плъгин е незаменим. Примери:
Пример 1. Разширението WebServerExtension
преминава към извикания тестов метод, URL
за да работи правилно.
@Test
@ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
WebClient webClient = new WebClient();
// Use WebClient to connect to web server using serverUrl and verify response
assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}
Ето How тестовете обикновено започват да тестват code, който работи с Spring framework:
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {
@MockBean
TestService service;
@Test
void test() {
assertNotNull(service); // Test succeeds
}
}
SpringExtension
създава тестова version на рамката Spring, но MockitoExtention
ви позволява да създавате фалшиви обекти. Фалшивите предмети са много интересна тема, определено ще я засегнем, но малко по-късно.
4.4 @Изчакване
Нека завършим тази лекция с малка и интересна анотация @Timeout
. Позволява ви да зададете времето за провеждане на теста. Ако тестът отне повече време от посоченото в анотацията, тогава се счита за неуспешен.
class TimeoutDemo {
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// test will fail if it takes more than 100 milliseconds
}
}
С това нашата лекция приключва.
GO TO FULL VERSION