JUnit Test Durumları @Before @BeforeClass Ek Açıklaması

⚡ Akıllı Özet

JUnit en yaygın kullanılan birim test çerçevesidir. JavaAyrıca, test fikstürü ek açıklamaları, bir test sınıfı içindeki her test yönteminin çalıştırılmasından önce ve sonra tam olarak ne olacağını kontrol eder.

  • 🔘 Fikstür: Test fikstürü, bir test senaryosunun çalıştığı nesnelerin ve kaynakların sabit bağlamıdır.
  • ☑️ Kurmak: @Before her test metodundan önce çalışırken, @BeforeClass tüm sınıftan önce bir kez çalışır.
  • Sökmek: @After, test hata verse veya bir doğrulama başarısız olsa bile, her testten sonra çalışır.
  • 🧪 Sipariş: Önce üst sınıf @Before çalışır, ardından alt sınıf @Before, @Test ve son olarak her bir @After çalışır.
  • Runner: JUnitCore.runClasses() test sınıflarını çalıştırır ve her başarısızlığı içeren bir Result nesnesi döndürür.
  • 📊 JUnit 5: @Before, @After, @BeforeClass ve @AfterClass, sırasıyla @BeforeEach, @AfterEach, @BeforeAll ve @AfterAll olarak değiştirilir.

JUnit @Before ve @BeforeClass ek açıklamalarıyla test düzeneği

JUnit en popüler birimdir Test yapmak çerçeve Java. Açıkça tavsiye edilir Birim Testi. JUnit Web uygulamasını test etmek için sunucuya ihtiyaç duymadığı için test süreci hızlıdır.

MKS JUnit çerçeve aynı zamanda test senaryolarının ve test verilerinin hızlı ve kolay bir şekilde oluşturulmasına olanak tanır. org.junit Bu paket, birçok arayüz ve sınıftan oluşmaktadır. JUnit Test etme, Assert, After ve Before gibi test etme yöntemleri. Daha geniş anlamda JUnit Aile de aynı temel taşlar üzerine kuruludur.

Test düzeneği nedir?

Test düzeneğinin ne olduğunu anlamadan önce, aşağıdaki koda bakalım.

Bu kod, basit bir dosya üzerinde iki test senaryosunu yürütmek için tasarlanmıştır.

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

Burada birkaç sorun var

  • Kod okunabilir değil.
  • Kodun bakımı kolay değildir.
  • Test takımı karmaşık olduğunda kod mantıksal sorunlar içerebilir.

Aynı kodu kullanarak karşılaştırın JUnit.

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

Kod çok daha okunabilir ve bakımı daha kolaydır. Yukarıdaki kod yapısı şöyledir: test fikstürü.

Bir test fikstürü, bir JUnit Test Durumu koşar. Tipik olarak test fikstürleri şunları içerir:

  • Herhangi bir test senaryosu için kullanılabilen nesneler veya kaynaklar.
  • Bu nesnelerin ve kaynakların kullanılabilir hale getirilmesini gerektiren faaliyetler.
  • Bu faaliyetler
    1. paylaştırma (kurulum)
    2. tahsisin kaldırılması (söküm).

Kurulum ve Sökme

Armatürler önemlidir çünkü JUnit Bu kancaları her testin etrafına yerleştirir.

  • Genellikle her test senaryosundan önce yapılması gereken bazı tekrarlanan görevler vardır. Örnek: bir veritabanı bağlantısı oluşturun.
  • Aynı şekilde her test senaryosunun sonunda tekrarlanan bazı görevler olabilir. Örnek: test yürütmesi bittiğinde temizlemek için.
  • JUnit Kurulum ve kaldırma işlemlerine yardımcı olan açıklamalar sağlar. Kaynakların serbest bırakılmasını ve test sisteminin bir sonraki test senaryosu için hazır durumda olmasını sağlar.

Bunlar JUnit Aşağıda açıklamalar ele alınmaktadır.

Kurmak

@Önce ek açıklama JUnit içeren bir yöntemde kullanılır Java Her test senaryosundan önce çalıştırılacak kod, yani her test yürütülmesinden önce çalışır.

Yıkım (karar ne olursa olsun)

@Sonrasında ek açıklama içeren bir yöntemde kullanılır Java Her test senaryosundan sonra çalıştırılacak kod. Bu yöntemler, test senaryosunda veya onaylama hataları durumunda herhangi bir istisna atılsa bile çalışacaktır.

Not:

  • Yukarıda listelenen herhangi bir sayıda ek açıklamaya sahip olunmasına izin verilir.
  • Açıklamalı tüm yöntemler @Önce in JUnit her test senaryosundan önce çalıştırılacaktır ancak herhangi bir sırayla çalıştırılabilirler.
  • Üst sınıftan `@Before` ve `@After` metotlarını miras alabilirsiniz. Çalıştırma aşağıdaki gibidir ve standart bir çalıştırma sürecidir. JUnit.
  1. Uygula JUnit @Before süper sınıftaki yöntemler
  2. Bu sınıfta @Before yöntemlerini yürütün
  3. Bu sınıfta bir @Test yöntemini yürütün
  4. Bu sınıfta @After yöntemlerini yürütün
  5. Üst sınıfta @After yöntemlerini yürütün

JUnit 5 notu: Bu açıklamalar şunlardır: JUnit 4 (org.junit). JUnit 5'i onları yeniden adlandırdı. org.junit.jupiter.api, Ve JUnit Aşağıdaki 4 kod, eski model motorda hala çalışıyor.

JUnit 4 ek açıklaması JUnit 5 (Jüpiter) eşdeğeri Runs
@Önce @BeforeEach Her test yönteminden önce
@Sonrasında @Her birinden sonra Her test yönteminden sonra
@Dersten önce @BeforeAll Bir keresinde tüm sınıfın önünde
@Dersten sonra @Nihayet Tüm sınıfın ardından bir kez
@Görmezden gelmek @Engelli Açıklamalı testi atlar

Örnek: Test verisi olarak dosya içeren bir sınıf oluşturma

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

Yukarıdaki örnekte, yürütme zinciri aşağıdaki gibi olacaktır. Şema tracHer test yöntemi için bir oluşturma-test etme-silme döngüsü.

JUnit @Before ve @After, iki test metodu etrafında bir yürütme zinciri oluşturuyor.

  1. createOutputFile()
  2. testDosyası1()
  3. deleteOutputFile()
  4. createOutputFile()
  5. testDosyası2()
  6. deleteOutputFile()

Varsayım:

testFile1() fonksiyonu testFile2() fonksiyonundan önce çalışır, bu da garanti edilmez.

Tek seferlik kurulum

  • Testlerden herhangi biri yürütülmeden önce ve herhangi bir test yürütülmeden önce, tüm test sınıfı için bir yöntemi yalnızca bir kez çalıştırmak mümkündür. @Önce yöntem(ler).
  • "Tek seferlik kurulum" sunucuları başlatmak, iletişimi açmak ve benzeri işler için kullanışlıdır. Her test için kaynakları kapatıp yeniden açmak zaman alıcıdır.
  • Bu, ek açıklama kullanılarak yapılabilir @Dersten önce in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

Yöntem şu olmalıdır: genel statik boşlukÇünkü, JUnit Test örneği oluşturulmadan önce bu çağrıyı yapar.

Sadece bir kez yıkmak

  • Tek seferlik kurulum yöntemine benzer şekilde, tek seferlik temizleme yöntemi de mevcuttur. Bu yöntem, tüm test senaryosu yöntemlerinden sonra çalışır ve @Sonrasında açıklamalar gerçekleştirildi.
  • Durdurmak için faydalıdır.ping sunucular ve iletişim bağlantılarının kapatılması.
  • Bu, kullanılarak yapılabilir @Dersten sonra Ek açıklama.
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit Test Paketleri

Planlanan testler tamamlandıktan sonra, ilgili test sınıfları genellikle gruplandırılarak birlikte başlatılır.

Birden fazla testi belirli bir sırayla çalıştırmak istiyorsak, tüm testleri tek bir yerde birleştirerek bunu yapabiliriz. Bu yere test paketi denir. Test paketlerinin nasıl çalıştırılacağı ve nasıl kullanılacağına dair daha fazla ayrıntı için ilgili bölüme bakınız. JUnit bu kapsamda ele alınmaktadır. öğretici.

JUnit Test Çalıştırıcısı

JUnit test senaryolarınızın yürütülmesi için bir araç sağlar.

  • JUnitçekirdek Bu testleri yürütmek için sınıf kullanılır.
  • Bir yöntem adı verildi runClasses tarafından sağlanan org.junit.runner.JUnitçekirdek bir veya daha fazla test sınıfını çalıştırmak için kullanılır.
  • Bu metodun dönüş tipi Sonuç nesne (org.junit.runner.SonuçBu, testlerle ilgili bilgilere erişmek için kullanılır. Daha fazla açıklık için aşağıdaki kod örneğine bakın.
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

Yukarıdaki kodda, yürüttüğümüz test senaryolarının başarısız ve başarılı sonuçlarını elde etmek için "result" nesnesi işlenir. Yardımcı fonksiyonlar, iddiaEşittir bu başarısızlıkları gündeme getirirken @Görmezden gelmek Bir testi atlıyor.

JUnit 5 notu: JUnitçekirdek olduğunu JUnit 4 koşucu. JUnit 5, bunun yerine şunu koyar: JUnit Platform fırlatıcı API, normalde IDE tarafından başlatılır, Gradle veya Maven Surefire.

Ad JUnit Programı

SDLC konusunda orta düzeyde bilgi sahibi, Java programlama ve temelleri yazılım testi Bu süreç, bir şeyi anlamaya yardımcı olur. JUnit program, tıpkı nasıl yapılacağını bilmek gibi birim testleri Entegrasyon testlerinden farklıdır.

Canlı bir örnek kullanarak birim testlerini anlayalım. Bir test metodu içeren ve `@test` ek açıklamasıyla işaretlenmiş bir test sınıfı oluşturmamız gerekiyor. @Ölçek aşağıda verildiği gibi:

MyFirstClassTest.java

package guru99.JUnit;		

import static org.junit.Assert.*;				

import org.junit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

Yukarıdaki test yöntemimizi çalıştırmak için bir test çalıştırıcısı oluşturmamız gerekiyor. Test çalıştırıcısında, test sınıfını parametre olarak eklememiz gerekiyor. JUnitCore'un runClasses() metodu. Testin başarılı olup olmamasına bağlı olarak test sonucunu döndürür.

Bu konuyla ilgili daha fazla ayrıntı için aşağıdaki koda bakın:

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(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

Çıktı

bir Zamanlar TestRunner.java Test yöntemlerimizi çalıştırdığımızda, başarısız veya başarılı şeklinde bir çıktı alıyoruz. Çıktının açıklaması aşağıdadır:

  1. Bu örnekte, yürütüldükten sonra MyFirstClassTest.javaTest başarılı geçti ve sonuç yeşil renkte.
  2. Eğer başarısız olsaydı sonuç kırmızı olarak gösterilirdi ve başarısızlık hata mesajında ​​gözlemlenebilirdi. trace. Bakınız JUnit Aşağıda GUI (grafik kullanıcı arayüzü) bulunmaktadır:

Eclipse JUnit MyFirstClassTest için yeşil bir geçme çubuğu gösteren görünüm

SSS

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 kod çalıştırılması gerektiğinde hiçbir örnek mevcut değildir. Metodu static olarak bildirmek, JUnit Doğrudan çağırın.

Hayır. Yöntem sırası bilerek belirtilmemiştir. JUnit @FixMethodOrder için 4 teklif ve JUnit 5 adet @TestMethodOrder seçeneği sunuluyor, ancak sıralamaya bağlı olarak testler birbirine bağlanıyor.

Test metodu hiçbir zaman çağrılmaz ve bir hata olarak raporlanır, başarısızlık olarak değil. Herhangi bir @After metodu yine de çalışır, bu nedenle temizleme işlemi kısmen oluşturulmuş bir fikstüre tolerans göstermelidir.

Yeni projelere şunlar eklenmelidir: JUnit 5 toplu yapıt org.junit.jupiter:junit-jupiter. Eski sürümleri tutan ekipler JUnit 4 paket, junit-vintage-engine'i ekleyerek her ikisinin de tek bir platformda çalışmasını sağlar.

Bir test ortamını oluşturan tüm hazırlanmış bağlamı, gerçek dosyalar veya bağlantılar da dahil olmak üzere, fikstür (test ortamı) olarak adlandırabiliriz. Bir mock (takla) ise, genellikle fikstür tarafından oluşturulan ve senaryolaştırılmış davranışlara sahip, test ortamının yerine geçen bir işbirlikçidir.

Evet, @BeforeClass aracılığıyla. JUnit 4 veya @BeforeAll içinde JUnit 5. Paylaşımlı bağlantılar daha hızlıdır ancak durum bilgisini sızdırır, bu nedenle bunları pahalı, salt okunur kaynaklar için ayırın.

Yapay zekâ asistanları bir sınıfı okur, ihtiyaç duyduğu işbirlikçileri çıkarır ve eşleşen @After temizliğiyle birlikte @Before kurulumunu taslak haline getirir. Oluşturulan doğrulamaları her zaman kendiniz gözden geçirin.

GitHub Yardımcı Pilotu Bir metot imzasından, yaşam döngüsü ek açıklamaları da dahil olmak üzere, bir test sınıfı oluşturur. Genellikle varsayılan olarak şunlara ayarlanır: JUnit 4 adet ithalat işlemi gerekiyor, bu nedenle paketin motorunuzla uyumlu olduğundan emin olun.

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