JUnit Örnekle Ek Açıklamalar Eğitimi: @Test ve @After Nedir?

⚡ Akıllı Özet

JUnit Ek açıklamalar, metne eklenen bir tür sözdizimsel meta veridir. Java Test çalıştırıcısının hangi yöntemleri yürüteceğini, ne zaman çalıştıracağını ve her birinin ne kadar süreceğini bilmesi için kaynak kod.

  • 🔘 @Test: Herkese açık, geçersiz bir metodu işaretler. JUnit Tek bir test senaryosu olarak yürütülür.
  • ☑️ Yaşam döngüsü: @Before ve @After her testi kapsarken, @BeforeClass ve @AfterClass sınıfı kapsar.
  • Kontrol: @Ignore bir testi atlar, @Test(timeout) çalışma süresini sınırlar, @Test(expected) ise fırlatılan bir istisnayı doğrular.
  • 🧪 iddialar: org.junit.Assert, assertEquals, assertTrue, assertNull, assertSame ve fail() yöntemlerini sağlar.
  • Eski: TestCase, TestResult ve TestSuite, daha eski olan junit.framework paketine aittir.
  • 📊 JUnit 5: Jupiter bunları @BeforeEach, @AfterEach, @BeforeAll, @AfterAll ve @Disabled olarak yeniden adlandırıyor.

JUnit @Test, @Before ve @After ek açıklamalarını kapsayan eğitim

Nedir? JUnit Ek açıklamalar?

JUnit ek açıklamalar Bunlar, eklenebilen özel bir sözdizimsel meta veri biçimidir. Java Daha iyi kod okunabilirliği ve yapısı için kaynak kodu. Değişkenler, parametreler, paketler, yöntemler ve sınıflar açıklanabilir. Açıklamalar JUnit 4, bu da yapar Java Kodu daha okunabilir ve basit hale getiriyor. Aradaki en büyük fark bu. JUnit 3 ve JUnit 4: JUnit 4 açıklama tabanlıdır.

Bu ek açıklamalar hakkında temel bilgiye sahip olan biri, kolayca öğrenip uygulayabilir. JUnit Ölçek. Aşağıda önemli ve sık kullanılanlar yer almaktadır JUnit ek açıklamalar listesi ile JUnit Her birinin yanında 5 (Jüpiter) eşdeğeri bulunmaktadır:

S.No. Açıklamalar Açıklama JUnit 5 eşdeğer
1. @Ölçek Bu açıklama, `junit.framework.TestCase`'in yerine geçer ve eklendiği genel void metodun bir test durumu olarak çalıştırılabileceğini gösterir. @Test (org.junit.jupiter.api)
2. @Önce Bu ek açıklama, her test senaryosundan önce önkoşullar gibi bazı ifadeleri yürütmek istiyorsanız kullanılır. @BeforeEach
3. @Dersten önce Bu açıklama, tüm test senaryolarından önce bazı ifadeleri çalıştırmak istediğinizde kullanılır; örneğin, tüm test senaryolarından önce açılması gereken bir test bağlantısı gibi. @BeforeAll
4. @Sonrasında Her bir ifadeden sonra bazı ifadeleri yürütmek istiyorsanız bu açıklama kullanılabilir. Test DurumuÖrneğin, değişkenleri sıfırlamak veya geçici dosyaları silmek gibi. @Her birinden sonra
5. @Dersten sonra Bu açıklama, tüm test senaryoları tamamlandıktan sonra bazı ifadeleri çalıştırmak istediğinizde kullanılabilir; örneğin, tüm test senaryoları çalıştırıldıktan sonra kaynakları serbest bırakmak gibi. @Nihayet
6. @Görmezden gelmek Bu açıklama, test yürütme sırasında bazı ifadeleri yok saymak istediğinizde, örneğin test yürütme sırasında bazı test durumlarını devre dışı bırakmak istediğinizde kullanılabilir. @Engelli
7. @Test(zaman aşımı=500) Bu açıklama, örneğin bir SLA (hizmet seviyesi anlaşması) kapsamında çalışıyorsanız ve testlerin belirli bir süre içinde tamamlanması gerekiyorsa, test yürütme sırasında bir zaman aşımı belirlemek istediğinizde kullanılabilir. @Timeout veya assertTimeout
8. @Test(beklenen=IllegalArgumentException.class) Bu açıklama, test yürütme sırasında bazı istisnaları ele almak istediğinizde kullanılabilir. Örneğin, belirli bir yöntemin belirtilen bir istisnayı fırlatıp fırlatmadığını kontrol etmek istiyorsanız. assertTrows

JUnit Ek Açıklamalar Örneği

Önemli konuları kapsayan bir sınıf oluşturalım JUnit basit print ifadeleriyle ek açıklamalar ekleyin ve bunu bir test çalıştırıcısı sınıfıyla yürütün:

) 1 Adım Aşağıdakileri dikkate alın. Java Yukarıda listelenen ek açıklamalara bağlı çeşitli yöntemlere sahip sınıf:

JunitAçıklamalarıÖrnek.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

) 2 Adım Yukarıdaki testi çalıştırmak için bir test çalıştırıcı sınıfı oluşturalım:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Beklenen Sonuç

  • Tüm test senaryoları tek tek yürütülecek ve tüm yazdırma ifadeleri konsolda görülebilecek.
  • Yukarıdaki tabloda tartışıldığı gibi, @Before ve @BeforeClass JUnit [ m2() ve m1() yöntemleri sırasıyla her test senaryosundan önce ve tüm test senaryolarından önce çalıştırılacaktır.
  • Aynı şekilde @After ve @AfterClass'ta da durum böyledir. JUnit (m4() ve m3() metotları sırasıyla her test senaryosundan sonra ve tüm test senaryolarından sonra çalıştırılacaktır. @Ignore (m6() metodu) testi yok saymak olarak değerlendirilecektir.

Yukarıda kullanılan test senaryolarını inceleyelim. Java ayrıntılı olarak sınıf:

  1. Aşağıda verilen m5() yöntemini inceleyin:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Yukarıdaki yöntemde, "liste" değişkenine bir dize ekliyorsunuz:

  • liste boş() false değerini döndürecektir.
  • iddiaFalse(list.isEmpty()) doğruya dönmelidir.
  • Sonuç olarak, test senaryosu geçmek.

Listeye yalnızca bir dize eklediğiniz için boyutu birdir.

  • liste.size() "1" tamsayı değerini döndürmelidir.
  • So iddiaEquals(1, liste.size()) doğruya dönmelidir.
  • Sonuç olarak, test senaryosu geçmek.
  1. Aşağıda verilen m7() yöntemini inceleyin:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Yukarıda tartışıldığı gibi, @Test(zaman aşımı = 10) Bu, test senaryosunda zaman aşımını zorlamak için kullanılır. Değer milisaniye cinsindendir, bu nedenle m7() 10 milisaniye içinde tamamlanmalıdır.

  1. Aşağıda verilen m8() yöntemini inceleyin:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Yukarıda tartışıldığı gibi, @Test(beklenen) Belirtilen istisna, yürütülmesi sırasında kontrol edilecektir; bu nedenle m8() metodu "Böyle Bir Metot Yok İstisnası" fırlatacaktır. Sonuç olarak, test bir istisna ile yürütülecektir.

Doğruluk notu: m8() yalnızca bir satır yazdırır, bu nedenle tanımlanan istisna aslında hiçbir zaman fırlatılmaz ve JUnit 4 numaralı rapor, testin başarısız olduğunu bildiriyor. Beklenen türü, yöntemin gerçekten fırlattığı türle eşleştirin. JUnit 5 bunu şu şekilde yazıyor: assertTrows.

Tüm test senaryoları geçildiğinden bu, testin başarılı bir şekilde yürütülmesiyle sonuçlanır.

Gerçek sonuç

Yukarıdaki örnekte üç test senaryosu bulunduğundan, tüm test senaryoları tek tek yürütülecektir. Aşağıdaki konsol ekran görüntüsüne bakın:

Eclipse @BeforeClass, @Before, @After ve @AfterClass yazdırma ifadelerini gösteren konsol çıktısı
JunitAnnotationsExample tarafından üretilen konsol çıktısı

Konsolda görülebilecek aşağıdaki yazdırma ifadelerine bakın:

@BeforeClass kullanımı, tüm test senaryolarından önce yürütülür

Her test senaryosundan önce yürütülen @Before ek açıklamalarını kullanma

Her test senaryosundan sonra yürütülen @After kullanımı

Her test senaryosundan önce yürütülen @Before ek açıklamalarını kullanma

@Test(timeout) kullanılarak, zaman aşımını zorlamak için kullanılabilir. JUnit4 test durumu

Her test senaryosundan sonra yürütülen @After kullanımı

Her test senaryosundan önce yürütülen @Before ek açıklamalarını kullanma

@Test(expected) işlevini kullanarak, yürütme sırasında belirtilen istisnayı kontrol edecektir.

Her test senaryosundan sonra yürütülen @After kullanımı

Tüm test senaryolarından sonra yürütülen @AfterClass kullanımı

JUnit Sınıf İddiası

Ek açıklamalar bir metodun ne zaman çalışacağına karar verir; doğrulama metotları ise başarılı olup olmayacağına karar verir.

Bu sınıf, test senaryosu yazımında faydalı olan bir dizi doğrulama yöntemi sunar. Tüm doğrulama ifadeleri başarılı olursa, test sonuçları başarılı olur. Herhangi bir doğrulama ifadesi başarısız olursa, test sonuçları başarısız olur. Özel olarak tasarlanmış bölüm JUnit ileri sürmek Bu eğitim videosu her yöntemi ayrıntılı olarak ele almaktadır.

Daha önce de gördüğünüz gibi, aşağıdaki tabloda önemli Assert yöntemleri ve açıklamaları yer almaktadır:

S.No. Yöntem Açıklama
1. void iddiaEquals(beklenen boole, gerçek boolean) Bu, Object sınıfının equals metoduna benzer şekilde, iki değerin eşit olup olmadığını kontrol eder.
2. voidassertFalse(boole koşulu) İşlevsellik, bir koşulun yanlış olup olmadığını kontrol etmektir.
3. voidassertNotNull(Nesne nesnesi) “assertNotNull” işlevi bir nesnenin null olup olmadığını kontrol etmektir.
4. voidassertNull(Nesne nesnesi) “assertNull” işlevi bir nesnenin boş olup olmadığını kontrol etmektir.
5. voidassertTrue(boolean koşulu) “assertTrue” işlevi bir koşulun doğru olup olmadığını kontrol etmektir.
6. geçersiz başarısızlık () Bir doğrulama hatası fırlatmak istiyorsanız, `fail()` her zaman başarısız bir sonuç verir.
7. voidasserSame([Dize mesajı] “assertSame” işlevi, iki nesnenin aynı nesneye başvurup başvurmadığını kontrol etmektir.
8. voidassertNotSame([Dize mesajı] “assertNotSame” işlevi, iki nesnenin aynı nesneye gönderme yapıp yapmadığını kontrol etmektir.

JUnit Test Senaryoları Sınıfı

Birden fazla test çalıştırmak için TestCase sınıfı mevcuttur. JUnit çerçevesi paket. @Test ek açıklaması şunu belirtir: JUnit Bu, kendisine bağlı olan bu genel void metodun (burada bir test durumu) bir test durumu olarak çalıştırılabileceği anlamına gelir.

Sürüm notu: Test durumu, Test sonucu hem de Test odası mirasa ait JUnit çerçevesi paketinden JUnit 3. Hala JUnit 4.x yapıtı içerisinde gönderiliyorlar, ancak ek açıklama tabanlı testler TestCase'i genişletmiyor.

Aşağıdaki tabloda mevcut olan bazı önemli yöntemler gösterilmektedir. JUnit.Çerçeve.TestCase sınıf:

S.No. Yöntem Açıklama
1. int countTestCases() Bu yöntem, kaç test senaryosunun yürütüldüğünü saymak için kullanılır. run(TestResult tr) yöntemi.
2. TestResult createResult() Bu yöntem bir oluşturmak için kullanılır. Test sonucu nesne.
3. Dize getName() Bu yöntem bir dizeden başka bir şey olmayan bir dize döndürür. Test durumu adı.
4. TestSonucu çalıştırması() Bu yöntem, bir test çalıştırmak için kullanılır ve test sonucunda bir değer döndürür. Test sonucu nesne.
5. geçersiz çalıştırma (TestResult sonucu) Bu yöntem, bir testi yürütmek için kullanılır. Test sonucu Hiçbir şey döndürmeyen bir nesne.
6. void setName(Dize adı) Bu yöntem, bir öğenin adını belirlemek için kullanılır. Test durumu.
7. geçersiz kurulum () Bu yöntem, örneğin veritabanı bağlantısı oluşturmak gibi kaynak ilişkilendirme kodunu yazmak için kullanılır.
8. void gözyaşıDown() Bu yöntem, kaynak serbest bırakma kodunu yazmak için kullanılır; örneğin, bir işlem gerçekleştirildikten sonra veritabanı bağlantısını serbest bırakmak gibi.

JUnit TestSonucu Sınıfı

Bir testi çalıştırdığınızda, bir sonuç döndürür (şu biçimde: Test sonucu Bu TestResult nesnesi, sonuç nesnesini analiz etmek için kullanılabilir. Bu test sonucu ya başarısızlık ya da başarı olabilir.

Aşağıdaki tabloda, `junit.framework.TestResult` sınıfında kullanılan önemli yöntemleri görebilirsiniz:

S.No. Yöntem Açıklama
1. void addError(Test testi, Atılabilir t) Bu yöntem, teste bir hata eklemeniz gerektiğinde kullanılır.
2. void addFailure(Test testi, AssertionFailedError t) Bu yöntem, arıza listesine bir arıza daha eklemeniz gerektiğinde kullanılır.
3. void endTest(Test testi) Bu yöntem, bir testin yapıldığını (tamamlandığını) bildirmek için kullanılır.
4. int errorCount() Bu yöntem, test yürütülmesi sırasında tespit edilen hataları almak için kullanılır.
5. Numaralandırma hatalar() Bu yöntem basitçe bir hata koleksiyonu (burada bir Numaralandırma) döndürür.
6. int başarısızlıkSayısı() Bu yöntem, test yürütülmesi sırasında tespit edilen hataların sayısını elde etmek için kullanılır.
7. geçersiz çalıştırma (TestCase testi) Bu yöntem bir test senaryosunu yürütmek için kullanılır.
8. int runCount() Bu yöntem, yürütülen testlerin sayısını basitçe sayar.
9. void startTest(Test testi) Bu yöntem bir testin başlatıldığını bildirmek için kullanılır.
10 geçersiz durdurma() Bu yöntem, test çalışmasını durdurmak için kullanılır.

JUnit Test Paketi Sınıfı

Birden fazla testi belirli bir sırayla çalıştırmak istiyorsanız, tüm testleri tek bir yerde birleştirerek bunu yapabilirsiniz. Bu yere test paketi denir ve JUnit test odası Bu eğitim videosu, eksiksiz bir örnek üzerinden ilerlemektedir.

Aşağıdaki tabloda kullanılan önemli yöntemler yer almaktadır. JUnit.Çerçeve.TestSuite sınıf:

S.No. Yöntem Açıklama
1. void addTest(Test testi) Pakete bir test eklemek istiyorsanız bu yöntem kullanılır.
2. void addTestSuite(Sınıf testSınıfı) Pakete test eklerken sınıfı belirtmek istiyorsanız bu yöntem kullanılır.
3. int countTestCases() Test senaryolarının sayısını saymak istiyorsanız bu yöntem kullanılır.
4. Dize getName() Bu yöntem test paketinin adını almak için kullanılır.
5. geçersiz çalıştırma (TestResult sonucu) Bu yöntem, bir testi çalıştırmak ve test sonucunu toplamak için kullanılır. Test sonucu nesne.
6. void setName(Dize adı) Bu yöntem, adını ayarlamak için kullanılır. Test odası.
7. Test testAt(int indeksi) Bu yöntem, belirtilen dizindeki testi döndürmek istediğinizde kullanılır.
8. int testCount() Bu yöntem, test paketindeki test sayısını döndürmek istediğinizde kullanılır.
9. Statik Test uyarısı (Dize mesajı) Bu yöntem başarısız olacak bir test döndürür ve bir uyarı mesajı günlüğe kaydeder.

SSS

Evet. Bir metot genellikle @Test ile birlikte @Ignore veya hem zaman aşımı hem de beklenen istisna ile birlikte @Test içerir. @Before ve @After gibi iki yaşam döngüsü ek açıklamasını tek bir metotta üst üste kullanamazsınız.

@Ignore yalnızca bir yöntemi engeller. JUnit Zaten bir test olarak tanınıyor. Yanında @Test olmadan, çalıştırıcı yöntemi asla toplamaz, bu nedenle ne çalıştırılır ne de atlananlar listesine eklenir.

JUnit Bu yöntem ayrı bir iş parçacığında çalıştırılır ve bütçe dolduğunda TestTimedOutException hatasıyla başarısız olur. İş parçacığı sonlandırılmaz, kesintiye uğratılır; bu nedenle engelleme yapan bir çağrı çalışmaya devam edebilir.

Sadece vintage motor aracılığıyla. JUnit-vintage-engine eklemek, şunları sağlar: JUnit Platform, mevcut org.junit testlerini değiştirmeden çalıştırır, ancak Jupiter testlerinin org.junit.jupiter.api'yi içe aktarması gerekir. İki içe aktarma kümesini aynı sınıfta karıştırmak başarısız olur.

Sadece bakım amaçlıdır. TestCase'i genişleten ve TestSuite nesneleri oluşturan eski test paketleri, eski kod tabanlarında yaygın olarak bulunur, bu nedenle API'yi tanımak faydalıdır. Yeni testler ek açıklamalara dayalı olmalıdır.

JUnit Her test metodu için test sınıfının yeni bir örneğini oluşturur, bu nedenle sınıf düzeyinde kurulum çalıştırılması gerektiğinde hiçbir örnek mevcut olmaz. Statik bir metodun örneğe ihtiyacı yoktur ve JUnit Statik olmayan bir bildirimi reddeder.

Yapay zekâ asistanları, test edilen metodu okur ve kurulumun @Before veya @BeforeClass içinde mi olması gerektiğini ve bir hata yolunun @Test(expected) veya assertThrows gerektirip gerektirmediğini önerir. Her öneriyi bir taslak olarak değerlendirin.

GitHub Yardımcı Pilotu Genellikle kurulum ve söküm işlemlerini doğru yapar, ancak sıklıkla karışıklık yaratır. JUnit 4 ve Jupiter tek bir dosyada içe aktarılıyor. Paketi çalıştırmadan önce içe aktarma bloğunu kontrol edin.

Bu yazıyı şu şekilde özetleyin: