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.

  • 🔘 Amaç: Birden fazla sınıfa ait testleri, her test sınıfını ayrı ayrı çalıştırmak yerine tek bir çalıştırılabilir birim halinde gruplandırın.
  • ☑️ Ek açıklamalar: @RunWith(Suite.class) yürütmeyi devretmeyi sağlar, @SuiteClasses ise paketin çalıştırması gereken her sınıfı listeler.
  • Adımlar: Test sınıflarını yazın, her iki ek açıklamayı da içeren bir tutucu sınıf ekleyin, ardından onu çalıştırın. JUnitAna koşucu.
  • 🧪 Örnek: JunitTest.java, SuiteTest1 ve SuiteTest2'yi gruplandırıyor ve konsol üç testin başarılı olduğunu bildiriyor.
  • JUnit 5: Jupiter, platform paketi motorunda çalıştırıcıyı @Suite artı @SelectClasses veya @SelectPackages ile değiştirir.
  • 📌 Tuzaklar: Boş test paketleri, eksik içe aktarmalar ve kendi @Test yöntemlerini içeren bir test paketi sınıfı, çoğu hataya neden olur.

Bir oluşturma JUnit @RunWith ve @SuiteClasses ek açıklamalarıyla test paketi

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:

  1. @RunWith(Suite.class)
  2. @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:

MyFirstClassTest sınıfında Eclipse @Test ek açıklamasıyla myFirstMethod'u tanımlıyorum.

) 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:

MySecondClassTest sınıfında Eclipse @Test ek açıklamasıyla mySecondMethod'u tanımlıyorum.

) 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:

@RunWith(Suite.class) ve @SuiteClasses ile işaretlenmiş TestSuiteExample, MyFirstClassTest ve MySecondClassTest adlarını 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:

Test çalıştırıcı sınıf çağrısı JUnitTestSuiteExample üzerinde Core.runClasses'ı çalıştırıp hata listesini yazdırıyoruz.

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:

Eclipse JUnit TestSuiteExample için 2/2 çalıştırmada sıfır hata ve sıfır başarısızlık ile raporlamayı görüntüle

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:

Eclipse JUnit testi bittikten sonra her iki test sınıfından da yazdırılan mesajları gösteren konsol.

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:

Eclipse JUnit Raporlama görünümü: SuiteTest1 ve SuiteTest2 genişletilmiş halde JunitTest için 3/3 yeşil sonuç.

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.

SSS

Bu kod paketi, sınıfları listelendikleri sırayla yürütür, ancak JUnit Her sınıf içindeki metotların sırası konusunda hiçbir garanti vermez. Önceki bir testin çalışmasına bağlı olan testler kırılgandır ve bağımsız olarak çalışacak şekilde yeniden yazılmalıdır.

Evet. Bir suite sınıfı, çalıştırıcı açısından sıradan bir sınıftır, bu nedenle onu başka bir @SuiteClasses listesinin içine adlandırmak suite'leri iç içe yerleştirir. İç içe yerleştirme, daha küçük modül suite'lerinden oluşturulmuş üst düzey bir regresyon suite'i için kullanışlıdır.

Yapay zekâ asistanları, diskteki test sınıflarını okur, bunları @SuiteClasses listesiyle karşılaştırır ve hiç eklenmemiş sınıfları işaretler. Ayrıca tekrarlanan hataları da kümelendirirler. tracBu yöntem, temel nedene odaklanarak, bir ekip aynı anda çok sayıda kırmızı alarm bildirdiğinde triyaj sürecini kısaltır.

Yardımcı pilot Açıklama çiftini hızlıca yazıyor, ancak sık sık karıştırıyor. JUnit 4 ve JUnit Aynı dosyada 5 adet içe aktarma işlemi var. org.junit.runners.Suite ve org.junit.platform.suite.api.Suite'in asla birlikte görünmemesine dikkat edin, çünkü bunlardan yalnızca biri çalıştırıcınızla eşleşiyor.

Test kapsamına `junit-platform-suite-engine`'i ekleyin. `@Suite` ve `@SelectClasses` ek açıklamaları, bu motor bileşeninin dolaylı olarak çektiği `junit-platform-suite-api`'de bulunur, bu nedenle genellikle tek bir bağımlılık yeterlidir.

Genellikle hayır. Surefire ve Gradle Test görevi, adlandırma kalıbına göre test sınıflarını zaten keşfeder ve hepsini çalıştırır. Tam çalıştırmadan daha küçük, örneğin bir "smoke set" gibi adlandırılmış bir alt küme istediğinizde bir test paketi yazmak faydalıdır.

Çalıştırıcı, çalıştırılabilir yöntem bulunamadığını belirterek o üye için bir başlatma hatası bildiriyor ve tüm test paketi başarısız olarak işaretleniyor. Girişi kaldırın veya sınıfa bir @Test yöntemi ekleyin.

Tek bir seçici listesinin içinde değil. Şunu koruyun: JUnit Klasik motorda 4 sınıf bulunmaktadır ve bunlardan birini seçin. JUnit Paket başına 5 süit, yani her iki motor da aynı şekilde çalışıyor. JUnit Platform lansmanı, ek açıklama aileleri karıştırılmadan gerçekleştirildi.

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