4.1 @Devre Dışı
Şimdi JUnit çerçevesinin bazı çok kullanışlı ve popüler ek açıklamalarına bakalım. İlk ek açıklama, JUnit'in onu çağırmaması için belirli bir testi kapatmanıza izin verir. Testin düzgün çalışmadığını fark ettiğinizde veya kodu değiştirdiğinizde testin yanlışlıkla bozulduğu durumlarda gereklidir.
Daha önce yazdığım gibi, testlerin% 99'u kimse tarafından desteklenmiyor, bu nedenle er ya da geç hepsi devre dışı bırakılıyor. Bu nedenle, bu ek açıklama yararlı olanlar listesinde ilk sırada yer almaktadır.
Onun örneğini düşünün:
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")));
}
}
Yukarıdaki örnekte, yöntem testOnDev()
çağrılmayacaktır. Bu arada, ek açıklama, @Disabled
sınıf bildiriminden hemen önce yazılabilir, ardından tüm yöntemleri göz ardı edilir.
@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 @İç içe
JUnit, iç içe geçmiş sınıflarda test yöntemlerini çağırmanıza izin verir. İç içe test sınıflarını kastediyorum. Bunlarla sık sık karşılaşacağınız bir gerçek değil ama böyle bir olasılık var, bu yüzden ne olduğunu anlamanız gerekiyor.
İç içe geçmiş bir sınıfın yöntemlerini bildiriminden önce çağırmak için bir ek açıklama yazmanız gerekir @Nested
. Örnek:
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")));
}
}
}
Daha fazla ayrıntı resmi belgelerde bulunabilir .
4.3 @ExtendWith
Bir başka yararlı not da @ExtendWith
. Muhtemelen onunla çok sık karşılaşacaksınız, o yüzden ona daha detaylı bakalım.
JUnit, çalışmanızın esnek bir şekilde özelleştirilmesi için çeşitli eklentiler (uzantılar) yazmanıza izin veren güçlü bir çerçevedir. Bazı uzantılar testlerle ilgili istatistikleri toplayabilir, diğerleri bir bellek içi dosya sistemini taklit edebilir, diğerleri bir web sunucusunda çalışmayı taklit edebilir vb.
Kodunuz bir çerçeve içinde çalışıyorsa (örneğin, Spring), o zaman neredeyse her zaman bu çerçeve, kodunuzdaki nesnelerin oluşturulmasını ve yapılandırılmasını yönetir . Bu nedenle özel bir test eklentisi olmazsa olmazdır. Örnekler:
Örnek 1. Uzantı, düzgün çalışması için WebServerExtension
çağrılan test yöntemine geçer .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());
}
Testler genellikle Spring çerçevesiyle çalışan kodu test etmeye şu şekilde başlar:
@ExtendWith(SpringExtension.class)
@ExtendWith(MockitoExtension.class)
class TestServiceTest {
@MockBean
TestService service;
@Test
void test() {
assertNotNull(service); // Test succeeds
}
}
SpringExtension
Spring çerçevesinin test sürümünü oluşturur, ancak MockitoExtention
sahte nesneler oluşturmanıza izin verir. Sahte nesneler çok ilginç bir konu, buna mutlaka değineceğiz ama biraz sonra.
4.4 @Zaman Aşımı
Bu dersi küçük ve ilginç bir notla bitirelim @Timeout
. Testi çalıştırmak için zamanı ayarlamanızı sağlar. Test, ek açıklamada belirtilenden daha uzun sürdüyse, başarısız sayılır.
class TimeoutDemo {
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void failsIfExecutionTimeExceeds100Milliseconds() {
// test will fail if it takes more than 100 milliseconds
}
}
Bu dersimizi sonlandırıyor.