主な違いは何ですか
@Before
と@BeforeClass
@BeforeEach
と@BeforeAll
@After
と@AfterClass
JUnit Apiによると@Before
は以下の場合に使用されます。
テストを書くとき、いくつかのテストがそれらが実行されることができる前に作成された同様のオブジェクトを必要とすることを見つけるのは一般的です。
一方、@BeforeClass
はデータベース接続を確立するために使用できます。しかし、@Before
も同じことができませんでしたか?
@Before
とマークされたコードは各テストの前に実行され、@BeforeClass
はテストフィクスチャ全体の前に1回実行されます。テストクラスに10個のテストがある場合、@Before
コードは10回実行されますが、@BeforeClass
は一度だけ実行されます。
一般に、複数のテストが同じ計算コストの高いセットアップコードを共有する必要がある場合は、@BeforeClass
を使用します。データベース接続の確立はこのカテゴリに分類されます。コードを@BeforeClass
から@Before
に移動することはできますが、テストの実行にはもっと時間がかかります。 @BeforeClass
とマークされたコードは静的初期化子として実行されるので、テストフィクスチャのクラスインスタンスが作成される前に実行されることに注意してください。
JUnit 5 では、タグ@BeforeEach
と@BeforeAll
は、JUnit 4の@Before
と@BeforeClass
と同等です。それらの名前は、いつ実行されるかを少しわかりやすくしたものです。 '。
各注釈の違いは次のとおりです。
+-------------------------------------------------------------------------------------------------------+
¦ 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. ¦ ¦ ¦
+-------------------------------------------------------------------------------------------------------+
両方のバージョンの注釈の大部分は同じですが、異なる点はほとんどありません。
実行順序
破線のボックス - >オプションの注釈。
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
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())
}
}