@ Before、@ BeforeClass、@ BeforeEach、@ BeforeAllの違い


432

主な違いは何ですか

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

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

テストを作成する場合、いくつかのテストを実行するには、類似のオブジェクトを作成する必要があることがよくあります。

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

回答:


623

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

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

ではJUnitの5、タグ@BeforeEach@BeforeAllの等価物である@Before@BeforeClass彼らの名前が緩く解釈し、それが実行したときの、もう少し指標であるJUnitの中に4:「各テストの前に」と「すべてのテストの前に一度」。


4
ああ、DB接続の例は理にかなっています。ありがとうございました!
user1170330

6
@pacoverflow @BeforeClasは静的です。テストクラスインスタンスが作成される前に実行されます。
dasblinkenlight 2015年

1
@BeforeClassを使用する場合、メソッド/パラメーターは静的である必要があることに注意してください
tiagocarvalho92

直接関係はありませんが、これは「カテゴリ別のテスト」カウンター計算する方法です。
Bsquare

@BeforeAll静的でない可能性があることを追加し、新しいテストインスタンスを実行するたびに呼び出します。対応する回答を見るstackoverflow.com/a/55720750/1477873
セルゲイ

124

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

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

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

参照

実行の順序。

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

ここに画像の説明を入力してください


10

JUnitのBeforeおよびBeforeClass

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

同様に、@Afterアノテーション付きの関数は、@Testアノテーションが付けられたクラスの各テスト関数の後に実行されますが、クラス内の@AfterClassすべてのテスト関数の後に1回だけ実行されます。

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

JUnit 5内

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

1
非常に良い例。
カナパルティキラン2018

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

と同じ

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())
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.