@Before, @BeforeClass, @BeforeEach ve @BeforeAll arasındaki fark


432

Arasındaki temel fark nedir

  • @Before ve @BeforeClass
    • JUnit 5 @BeforeEachve@BeforeAll
  • @After ve @AfterClass

JUnit Api'ye göre @Beforeaşağıdaki durumda kullanılır:

Testleri yazarken, birkaç testin çalıştırılmadan önce benzer nesnelere ihtiyaç duyduğunu bulmak yaygındır.

Halbuki @BeforeClassbir veritabanı bağlantısı kurmak için kullanılabilir. Ama @Beforeaynı şeyi yapamadı mı?

Yanıtlar:


623

İşaretli kod @Beforeher testten önce yürütülürken @BeforeClass, tüm test fikstüründen önce bir kez çalışır. Test sınıfınızda on test varsa, @Beforekod on kez yürütülür, ancak @BeforeClassyalnızca bir kez yürütülür.

Genel olarak, @BeforeClassbirden fazla testin aynı hesaplamalı pahalı kurulum kodunu paylaşması gerektiğinde kullanılır . Veritabanı bağlantısı kurmak bu kategoriye girer. Sen kodunu taşıyabilirsiniz @BeforeClassiçine @Beforeancak test çalıştırması uzun sürebilir. İşaretli kodun @BeforeClassstatik başlatıcı olarak çalıştırıldığını unutmayın , bu nedenle test fikstürünüzün sınıf örneği oluşturulmadan önce çalışacaktır.

In JUnit 5 , etiketler @BeforeEachve @BeforeAlleşdeğerleri vardır @Beforeve @BeforeClassJUnit 4. İsimleri gevşek yorumlanır, onlar çalıştırdığınızda biraz daha göstergesidir: 'bir kez tüm tetkiklerden önce' 'her tetkiklerden önce' ve.


4
Ah, şimdi DB bağlantısı ile örnek mantıklı. Teşekkür ederim!
user1170330

6
@pacoverflow @BeforeClasstatiktir. Test sınıfı örnekleri oluşturulmadan önce çalışır.
dasblinkenlight

1
@BeforeClass kullandığınızda yönteminizin / parametrenizin statik olması gerektiğini unutmayın
tiagocarvalho92

Doğrudan ilgili değildir, ancak bu 'Kategoriye Göre Testler' sayacını hesaplamanın bir yoludur .
Bsquare

Ben sadece @BeforeAllstatik olmayan ve her yeni test örneği çalıştırmak çağrısı ekleyeceğiz . İlgili cevaba bakınız stackoverflow.com/a/55720750/1477873
Sergey

124

Her ek açıklama arasındaki fark:

+-------------------------------------------------------------------------------------------------------+
¦                                       Feature                            ¦   Junit 4    ¦   Junit 5   ¦
¦--------------------------------------------------------------------------+--------------+-------------¦
¦ Execute before all test methods of the class are executed.               ¦ @BeforeClass ¦ @BeforeAll  ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some initialization code          ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after all test methods in the current class.                     ¦ @AfterClass  ¦ @AfterAll   ¦
¦ Used with static method.                                                 ¦              ¦             ¦
¦ For example, This method could contain some cleanup code.                ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute before each test method.                                         ¦ @Before      ¦ @BeforeEach ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to reinitialize some class attributes used by the methods.  ¦              ¦             ¦
¦-------------------------------------------------------------------------------------------------------¦
¦ Execute after each test method.                                          ¦ @After       ¦ @AfterEach  ¦
¦ Used with non-static method.                                             ¦              ¦             ¦
¦ For example, to roll back database modifications.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

Her iki sürümdeki ek açıklamaların çoğu aynıdır, ancak çok azı farklıdır.

Referans

Yürütme Sırası.

Kesik çizgili kutu -> isteğe bağlı ek açıklama.

resim açıklamasını buraya girin


10

JUnit dersinden önce ve önce

İşlev @Beforeaçıklaması, sınıflandırmadaki sınıftaki her test fonksiyonundan önce yürütülür, @Testancak ile fonksiyon @BeforeClass, sınıftaki tüm test fonksiyonlarından sadece bir kez önce yürütülür.

Benzer şekilde, @Afteraçıklama içeren fonksiyon, sınıflandırmadaki sınıftaki her test fonksiyonundan sonra yürütülür, @Testancak ile fonksiyon @AfterClass, sınıftaki tüm test fonksiyonlarından sadece bir kez sonra yürütülür.

SampleClass

public class SampleClass {
    public String initializeData(){
        return "Initialize";
    }

    public String processDate(){
        return "Process";
    }
 }

Örnek test

public class SampleTest {

    private SampleClass sampleClass;

    @BeforeClass
    public static void beforeClassFunction(){
        System.out.println("Before Class");
    }

    @Before
    public void beforeFunction(){
        sampleClass=new SampleClass();
        System.out.println("Before Function");
    }

    @After
    public void afterFunction(){
        System.out.println("After Function");
    }

    @AfterClass
    public static void afterClassFunction(){
        System.out.println("After Class");
    }

    @Test
    public void initializeTest(){
        Assert.assertEquals("Initailization check", "Initialize", sampleClass.initializeData() );
    }

    @Test
    public void processTest(){
        Assert.assertEquals("Process check", "Process", sampleClass.processDate() );
    }

}

Çıktı

Before Class
Before Function
After Function
Before Function
After Function
After Class

5 Haziran'da

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll

1
Çok İyi Bir Örnek.
kanaparthikiran

2
import org.junit.Assert
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test

class FeatureTest {
    companion object {
        private lateinit var heavyFeature: HeavyFeature
        @BeforeClass
        @JvmStatic
        fun beforeHeavy() {
            heavyFeature = HeavyFeature()
        }
    }

    private lateinit var feature: Feature

    @Before
    fun before() {
        feature = Feature()
    }

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}

İle aynı

import org.junit.Assert
import org.junit.Test

 class FeatureTest {
    companion object {
        private val heavyFeature = HeavyFeature()
    }

    private val feature = Feature()

    @Test
    fun testCool() {
        Assert.assertTrue(heavyFeature.cool())
        Assert.assertTrue(feature.cool())
    }

    @Test
    fun testWow() {
        Assert.assertTrue(heavyFeature.wow())
        Assert.assertTrue(feature.wow())
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.