Oluştur JUnit Örnekle Test Paketi: @RunWith @SuiteClasses
⚡ Akıllı Özet
JUnit Test paketleri, @RunWith(Suite.class) ve @SuiteClasses ek açıklamalarıyla yönlendirilen ve sıradan bir test çalıştırıcı sınıfı aracılığıyla başlatılan, birden fazla sınıftan test durumlarını bir araya getirerek tek bir geçişte birlikte çalıştırır.
In JUnitBir test paketi, tümünü bir araya getirmemizi sağlar. test senaryoları Birden fazla sınıftan gelen verileri tek bir yerde toplayıp birlikte çalıştırın.
Test paketini çalıştırmak için, sınıfı aşağıdaki ek açıklamaları kullanarak işaretlemeniz gerekir:
- @RunWith(Suite.class)
- @SuiteClasses(test1.class, test2.class…) veya @Suite.SuiteClasses({test1.class, test2.class…})
Yukarıdaki ek açıklamalarla, test paketindeki tüm test sınıfları tek tek çalıştırılmaya başlayacaktır. Test paketi sınıfının kendisi boş kalır: yalnızca ek açıklamaları tutan bir yapıdır ve çalıştırıcı, neyi çalıştıracağına karar vermek için bu ek açıklamaları okur.
Test Paketi ve Test Çalıştırıcısı Oluşturma Adımları
Aşağıdaki dört adım, gerçekten çalışan en küçük test paketini oluşturur: iki sıradan test sınıfı, bunları adlandıran bir test paketi sınıfı ve test paketini ana yöntemden başlatan bir çalıştırıcı.
) 1 Adım Basit bir test sınıfı oluşturun (örneğin MyFirstClassTest) ve içine @Annotation ile işaretlenmiş bir metot ekleyin. @Ölçek.
İlk sınıf, test paketinin onu algıladığını kanıtlamak için yeterli olan tek bir boş test metodu içerir:
) 2 Adım Ek olarak başka bir test sınıfı oluşturun (örneğin MySecondClassTest) ve @Test ile işaretlenmiş bir metot oluşturun.
İkinci sınıf da tamamen aynı şekle sahip, bu nedenle paket, birleştirilecek iki ayrı sınıfa sahip:
) 3 Adım Bir test paketi oluşturmak için öncelikle sınıfı `@RunWith(Suite.class)` ve `@SuiteClasses(class1.class, class2.class…)` ile işaretlemeniz gerekir.
Dikkat edin, TestSuiteExample sınıfı kendi başına herhangi bir test metodu tanımlamıyor; iki ek açıklama tüm bilgileri içeriyor:
) 4 Adım Aşağıda belirtildiği gibi test paketimizi çalıştırmak için bir Test Runner sınıfı oluşturun:
Koşucu sade biridir. Java Suite sınıfını kendisine ileten ana metoda sahip bir sınıf. JUnitÇekirdek:
Code Açıklama:
- Code Çizgi 8: Test sınıfının çalıştıracağı ana metodu tanımlıyoruz. JUnit testi.
- Code Çizgi 9: Kullanarak test senaryolarını yürütme JUnitCore.runClasses metodu, parametre olarak test sınıfının adını alır (yukarıdaki örnekte, 3. adımda gösterilen TestSuiteExample.class'ı kullanıyorsunuz).
- Code Çizgi 11: Sonucu bir for döngüsü kullanarak işleyip başarısız olan sonucu yazdırıyoruz.
- Code Çizgi 13: Başarılı sonucun yazdırılması.
Çıktı: İşte, herhangi bir hata olmaksızın başarılı bir testi gösteren çıktı. trace, aşağıda verildiği gibidir:
Yeşil çubuk, bir paketin ne için olduğunu doğrular: tek bir başlatma, tek bir sonuç görünümü ve her iki sınıfın da iki ayrı çalıştırmada değil, paket düğümü altında raporlanması.
JUnit Test Paketi Örneği
Daha karmaşık bir örneği ele alalım; bu örnekte, sınıf paketinin içindeki sınıflar aslında... ileri sürmek Boş bir metot tutmak yerine bir şey kullanmak.
JunitTest.java
JunitTest.java, @Junit ile işaretlenmiş basit bir sınıftır. @RunWith hem de @Süit Ek açıklamalar. Aşağıda verildiği gibi, paketteki herhangi bir sayıda sınıfı parametre olarak listeleyebilirsiniz:
package guru99.junit; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ SuiteTest1.class, SuiteTest2.class, }) public class JunitTest { // This class remains empty, it is used only as a holder for the above annotations }
SuiteTest1.java
SuiteTest1.java Aşağıda verilen şekilde bir mesaj yazdıran test metotlarına sahip bir test sınıfıdır. Bu sınıfı, yukarıda bahsedilen sınıfta bir test paketi üyesi olarak kullanacaksınız. adlı bir yardımcı sınıfa bağımlıdır. JUnitAynı paketin başka bir yerinde tanımlanan ve burada tekrar verilmeyen mesaj.
package guru99.junit; import static org.junit.Assert.assertEquals; import org.junit.Test; public class SuiteTest1 { public String message = "Saurabh"; JUnitMessage junitMessage = new JUnitMessage(message); @Test(expected = ArithmeticException.class) public void testJUnitMessage() { System.out.println("Junit Message is printing "); junitMessage.printMessage(); } @Test public void testJUnitHiMessage() { message = "Hi!" + message; System.out.println("Junit Hi Message is printing "); assertEquals(message, junitMessage.printHiMessage()); System.out.println("Suite Test 2 is successful " + message); } }
SuiteTest2.java
SuiteTest2.java Bu da benzer bir başka test sınıfıdır. SuiteTest1.javaAşağıda verilen şekilde bir mesaj yazdırmak için bir test yöntemine sahip olacaksınız. Bu sınıfı, test paketinin bir üyesi olarak kullanacaksınız. JunitTest.java.
package guru99.junit; import org.junit.Assert; import org.junit.Test; public class SuiteTest2 { @Test public void createAndSetName() { String expected = "Y"; String actual = "Y"; Assert.assertEquals(expected, actual); System.out.println("Suite Test 1 is successful " + actual); } }
Çıktı
Çalıştırdıktan sonra Junit Testi.java, içinde bir dizi bileşen barındıran bir dosyadır. SuiteTest1.java hem de SuiteTest2.javaAşağıdaki çıktıyı alacaksınız. Konsol, her iki sınıfın ürettiği mesajları yazdırır:
MKS JUnit View, suite sınıfı altında gruplandırılmış üç başarılı test yönteminin aynı çalıştırma kaydını gösterir:
Not: Bu örnekte konsol etiketleri yer değiştirmiş durumda; SuiteTest1 tarafından yazdırılan dize "Suite Test 2", SuiteTest2 tarafından yazdırılan dize ise "Suite Test 1" şeklindedir. Orijinal listelemeler değiştirilmeden yeniden üretilmiştir, bu nedenle etiketler yazarın yazdığı gibi kalır; sınıf adını okuyun. JUnit Çıktıyı kaynakla eşleştirdiğinizde, basılı etiket yerine görüntüyü inceleyin.
Test Paketi Nasıl Oluşturulur? JUnit 5
JUnit 5. sürüm, çalıştırıcıları tamamen kaldırıyor, bu nedenle org.junit.jupiter paketlerinde @RunWith(Suite.class) mevcut değil. Süitler taşındı. JUnit Platform, bunları ayrı bir yapıt içinde gönderir. JUnit platform paketi motoruBu bağımlılığı ekleyin, ardından bir sınıfı @Suite ve seçici ek açıklamalarından biriyle işaretleyin.
import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.Suite; import org.junit.platform.suite.api.SuiteDisplayName; @Suite @SuiteDisplayName("Guru99 suite") @SelectClasses({ SuiteTest1.class, SuiteTest2.class }) public class JunitTest { // Empty holder, exactly as in JUnit 4 }
Seçici ek açıklamalar, tek bir @SuiteClasses listesini küçük bir seçenek ailesiyle değiştirir:
| not | Seçtiği şey |
| @SınıflarıSeç | @SuiteClasses'ın doğrudan yerine geçen, tek tek adlandırılan bireysel test sınıfları. |
| @SelectPackages | Belirtilen paketteki ve tüm alt paketlerindeki her test sınıfı. |
| @IncludeClassNamePatterns | Seçim üzerine uygulanan bir normal ifade filtresi. |
| @SuiteDisplayName | Rapor içerisinde sınıf adı yerine okunabilir bir isim gösterilecek. |
Pratikte önem taşıyan iki fark daha vardır. A JUnit 5. Suite sınıfı, tüm Suite etrafında bir kez çalışan @BeforeSuite ve @AfterSuite yöntemlerini bildirebilir. JUnit Yukarıdaki 4. örnek hala çalışıyor. JUnit Platform, eski bir oyun motoru üzerinden çalışıyor, bu nedenle bu sayfadaki orijinal kodun çalışmaya devam etmesi için yeniden yazılması gerekmiyor.
Avantajları ve Sınırlamaları JUnit Test Paketleri
Bir süit, bir gruptur.ping mekanizma değil, bir test çerçevesi Kendine özgü bir yapısı vardır ve bu da hem neleri iyi yaptığını hem de ne zaman işe yaramaz hale geldiğini şekillendirir.
Avantajlar
- Bir lansman, birbiriyle ilişkili sınıfları bir arada yürütür; örneğin bir duman seti veya bir gerileme Set işlemi tek bir komutla başlatılır.
- Sonuç görünümü, her sınıfı tek bir paket düğümü altında gruplandırır; bu da ortak bir hatanın tespit edilmesini kolaylaştırır.
- Üyelik listesi kod içinde yer aldığından, diğer kaynak dosyaları gibi incelenir ve sürümlendirilir.
- Aynı sınıf paketi, bir IDE'den veya bir çalıştırıcıdan başlatılabilir. JUnitÇekirdekten veya bir derleme aracından.
Sınırlamalar
- @SuiteClasses, kod içine sabit olarak yazılmış bir listedir; bu nedenle, birisi test paketini düzenleyene kadar yeni bir test sınıfı sessizce dışarıda bırakılır.
- Bu paket, derslerin listelendiği sıranın ötesinde herhangi bir sıralama garantisi vermez.
- Üye sınıflar arasında hiçbir şey paylaşılmamaktadır, bu nedenle bir süit, bir donanım veya temel sınıfın yerine geçmez.
- Derleme araçları, adlandırma kuralına göre test sınıflarını zaten keşfediyor; bu da birçok projede bir test paketini gereksiz kılıyor.
Oluştururken Sık Yapılan Hatalar JUnit Test odası
Çoğu problemde kısa ve yetersiz bir mesaj görüntülenir. Tablo, karşılaşmanız muhtemel mesajları, nedenlerini ve çözümlerini göstermektedir.
| Mesaj veya belirti | Sebeb olmak | sabit |
| Başlatma hatası: Çalıştırılabilir yöntem yok | Bu sınıf sıradan bir test sınıfı gibi çalıştırılır, ancak yalnızca ek açıklamalar içerir. | @RunWith(Suite.class) ekleyerek, varsayılan çalıştırıcı yerine suite çalıştırıcısının devreye girmesini sağlayın. |
| Sembol bulunamadı: sınıf Suite | Suite içe aktarma işlemi eksik. | org.junit.runners.Suite'i org.junit.runner.RunWith ile birlikte içe aktarın. |
| Dersler devam ediyor, ancak bir ders atlanıyor. | Bu sınıf hiçbir zaman @SuiteClasses listesine eklenmedi. | Sınıfı açıkça ekleyin veya @SelectPackages içine taşıyın. JUnit 5. |
| Derleyici sınıf adını kabul etmiyor. | @Runwith veya @suiteClasses yanlış büyük/küçük harf kullanımıyla yazılmış. | Java Ek açıklamalar büyük/küçük harf duyarlıdır: @RunWith ve @SuiteClasses ifadelerini tam olarak yazın. |
| Sınıf paketindeki testler asla çalıştırılmaz. | Test paketine @Test metodu eklendi. | Holder'ı boş bırakın ve test yöntemini bir üye sınıfa taşıyın. |
Süiti bir kez yazıp saklayın.ping Asıl iş doğru olanı bulmaktır. Liste diskteki sınıflardan uzaklaşırsa, paket yeşil renkle rapor verirken, listenin bir kısmı da... ünite testi `set` komutu hiçbir zaman çalıştırılmıyor, bu da en sessiz hata modlarından biri. yazılım testi.







