4.1 @Disabled
Endi biz JUnit framework ning juda foydali va mashhur annotation larini ko'rib chiqamiz. Birinchi annotation ma'lum bir testni o'chirib qo'yish imkonini beradi ki, JUnit uni chaqirmasligi uchun. Bu agar test noto'g'ri ishlayotgani sezilgan bo'lsa yoki kodni o'zgartirsak va test tasodifan buzilsa kerak bo'ladi.
Oldin yozganimdek, 99% testlarga hech kim e'tibor bermaydi, shuning uchun ular oxir-oqibat o'chiriladi. Shuning uchun bu annotation foydali ro'yxatda birinchi.
Misolini ko'rib chiqamiz:
public class AppTest {
@Disabled("Test vaqtinchalik o'chirilgan. Rost, rost") @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")));
}
}
Yuqoridagi misolda testOnDev() metodi chaqirilmaydi. Aytgancha, @Disabled annotatsiyasini darhol klass e'lon qilishidan oldin yozib qo'yish mumkin, unda uning barcha metodlari inkor qilinadi.
@Disabled("Vaqtinchalik o'chirdik testi, 2001 yil may oyiga qadar tuzatamiz")
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 @Nested
JUnit ichki klasslar test metodlarini chaqirishga imkon beradi. Bu degani, ichki test klasslarini chaqirish mumkin. Ehtimol, bu bilan tez-tez to'qnash kelmaysan, lekin bunday ehtimol mavjud, shuning uchun nima ekanligini tushunish kerak.
Ichki klass metodlarini chaqirish uchun, uning e'lon qilishidan oldin @Nested annotation sini yozish kerak. Misol:
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")));
}
}
}
Batafsil ma'lumotni rasmiy dokumentatsiyada o'qish mumkin.
4.3 @ExtendWith
Boshqa bir foydali annotation — @ExtendWith. Ehtimol, uni juda tez-tez uchratib turasan, shuning uchun uni batafsil ko'rib chiqamiz.
JUnit — bu kuchli framework bo'lib, turli xil plaginni (kengaytmalarni) yozishga imkon beradi va bu o'z ishini moslashuvchan sozlash imkonini beradi. Ba'zi kengaytmalar testlar haqida statistikani to'plash mumkin, boshqalar xotirada fayl tizimini emulyatsiya qilishadi, uchinchilar esa web-server ichida ishlashni emulyatsiya qilishadi va hokazo.
Agar sening koding qanaqadir framework ichida ishlayotgan bo'lsa (masalan, Spring), deyarli har doim bu framework sening kodining ob'ektlarini yaratishi va sozlashini boshqaradi. Shuning uchun maxsus test pluginisiz o'tib bo'lmaydi. Misollar:
Misol 1. WebServerExtension kengaytmasi chorlangan test metodiga URL ni uzatadi to'g'ri ishlash uchun.
@Test @ExtendWith(WebServerExtension.class)
void getProductList(@WebServerUrl String serverUrl) {
WebClient webClient = new WebClient();
// WebClient ni ishlatib, web serverga serverUrl ni ishlatib ulanish va javob tekshiriladi
assertEquals(200, webClient.get(serverUrl + "/products").getResponseStatus());
}
Shunday qilib odatda Spring framework bilan ishlovchi kodni test qilish boshlanadi:
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {
@MockBean
TestService service;
@Test
void test() {
assertNotNull(service); // Test muvaffaqiyatli
}
}
SpringExtension Spring framework ning test varianti yaratadi, MockitoExtention esa soxta ob'ektlarni yaratishga imkon beradi. Soxta ob'ektlar juda qiziqarli mavzu, albatta u bilan tanishamiz, lekin biroz keyinroq.
4.4 @Timeout
Bu lektsiyani kichik va qiziqarli @Timeout annotation bilan yakunlaymiz. Bu testni bajarish vaqtini belgilash imkonini beradi. Agar test belgilangan vaqtdan ko'proq bajarilsa, u muvaffaqiyatsiz deb hisoblanadi.
class TimeoutDemo {
@Test @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// test 100 millisekunddan ko'proq vaqt olib turib qolsa muvaffaqiyatsiz bo'ladi
}
}
Shunday qilib, bizning lektsiyamizni yakunlaymiz.
GO TO FULL VERSION