web-dev-qa-db-ja.com

@Before、@BeforeClass、@BeforeEach、および@BeforeAllの違い

主な違いは何ですか

  • @Before@BeforeClass
    • そしてJUnit 5では@BeforeEach@BeforeAll
  • @After@AfterClass

JUnit Apiによると@Beforeは以下の場合に使用されます。

テストを書くとき、いくつかのテストがそれらが実行されることができる前に作成された同様のオブジェクトを必要とすることを見つけるのは一般的です。

一方、@BeforeClassはデータベース接続を確立するために使用できます。しかし、@Beforeも同じことができませんでしたか?

370
user1170330

@Beforeとマークされたコードは各テストの前に実行され、@BeforeClassはテストフィクスチャ全体の前に1回実行されます。テストクラスに10個のテストがある場合、@Beforeコードは10回実行されますが、@BeforeClassは一度だけ実行されます。

一般に、複数のテストが同じ計算コストの高いセットアップコードを共有する必要がある場合は、@BeforeClassを使用します。データベース接続の確立はこのカテゴリに分類されます。コードを@BeforeClassから@Beforeに移動することはできますが、テストの実行にはもっと時間がかかります。 @BeforeClassとマークされたコードは静的初期化子として実行されるので、テストフィクスチャのクラスインスタンスが作成される前に実行されることに注意してください。

JUnit 5 では、タグ@BeforeEach@BeforeAllは、JUnit 4の@Before@BeforeClassと同等です。それらの名前は、いつ実行されるかを少しわかりやすくしたものです。 '。

547
dasblinkenlight

各注釈の違いは次のとおりです。

+-------------------------------------------------------------------------------------------------------+
¦                                       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.                        ¦              ¦             ¦
+-------------------------------------------------------------------------------------------------------+

両方のバージョンの注釈の大部分は同じですが、異なる点はほとんどありません。

参照

実行順序

破線のボックス - >オプションの注釈。

enter image description here

103

JUnitのBeforeとBeforeClass

@Beforeアノテーションを持つクラスの各テスト関数の前に、関数@Testアノテーションが実行されますが、@BeforeClassを持つ関数は、クラス内のすべてのテスト関数の前に1回だけ実行されます。

同様に@Afterアノテーションを持つ関数は、@Testアノテーションを持つクラスの各テスト関数の後に実行されますが、@AfterClassを持つ関数はクラス内のすべてのテスト関数の後に一度だけ実行されます。

SampleClass

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

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

SampleTest

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() );
    }

}

出力

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

6月5日 -

@Before = @BeforeEach
@BeforeClass = @BeforeAll
@After = @AfterEach
@AfterClass = @AfterAll
4
Dhyan Mohandas
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())
    }
}

と同じ

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())
    }
}
0
kreker