JUnitタグ実行順序解析


一.基礎知識


JUnit 4はJava 5の注記(annotation)を使用し、以下はJUnit 4でよく使われるいくつかのannotation:@Before:初期化メソッドは、各テストメソッドに対して1回実行されます(BeforeClassと区別され、後者はすべてのメソッドに対して1回実行されます)@After:リソースの解放は、各テストメソッドに対して1回実行されます(AfterClassと区別され、後者はすべてのメソッドに対して1回実行されます)@Test:テストメソッド、ここでは、期待異常およびタイムアウト時間@Test(expected=ArithmeticException.class)をテストして、ArithmeticException異常@Ignore:無視されたテスト方法@BeforeClass:すべてのテストに対して1回のみ実行し、static void@AfterClass:すべてのテストに対して1回のみ実行し、また、static voidの1つのJUnit 4のユニットテスト用例の実行順序は、@BeforeClass->@Before->@Test->@After->@AfterClass;各試験方法の呼び出し順序は,@Before->@Test->@After;

二.≪インスタンス|Instance|emdw≫

package com.bijian.study;  

import org.junit.After;  
import org.junit.AfterClass;  
import org.junit.Assert;  
import org.junit.Before;  
import org.junit.BeforeClass;  
import org.junit.Ignore;  
import org.junit.Test;  

public class JUnit4Test {  

    @Before  
    public void before() {  
        System.out.println("@Before");  
    }  

    @Test  
    /** *Mark your test cases with @Test annotations. *You don’t need to prefix your test cases with “test”. *tested class does not need to extend from “TestCase” class. */  
    public void test() {  
        System.out.println("@Test");  
        Assert.assertEquals(5 + 5, 10);  
    }  

    @Ignore  
    @Test  
    public void testIgnore() {  
        System.out.println("@Ignore");  
    }  

    @Test(timeout = 50)  
    public void testTimeout() {  
        System.out.println("@Test(timeout = 50)");  
        Assert.assertEquals(5 + 5, 10);  
    }  

    @Test(expected = ArithmeticException.class)  
    public void testExpected() {  
        System.out.println("@Test(expected = Exception.class)");  
        throw new ArithmeticException();  
    }  

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

    @BeforeClass  
    public static void beforeClass() {  
        System.out.println("@BeforeClass");  
    };  

    @AfterClass  
    public static void afterClass() {  
        System.out.println("@AfterClass");  
    };  
}  

結果:
@BeforeClass  
@Before  
@Test(timeout = 50)  
@After  
@Before  
@Test(expected = Exception.class)  
@After  
@Before  
@Test  
@After  
@AfterClass 

三.@BeforeClass,@AfterClassと@Before,@Afterの対比:


@BeforeClass and @AfterClass
@Before and @After
1つのクラスに1回しか現れません
1つのクラスに複数回、すなわち複数のメソッドの宣言の前にこの2つのAnnotaionラベルを付けることができ、実行順序が不確定である.
メソッド名に制限はありません
メソッド名に制限はありません
クラスで1回のみ実行
各テストメソッドの前または後に1回実行
@BeforeClass親クラスでAnnotationを識別するメソッドは、現在のクラスでAnnotationを識別するメソッドよりも先に実行されます.@AfterClass親クラスでAnnotationを識別するメソッドは、現在のクラスでAnnotationを識別するメソッドの後に実行されます.
@Before親クラスでAnnotationを識別するメソッドは、現在のクラスでAnnotationを識別するメソッドよりも先に実行されます.@After親クラスでAnnotationを識別するメソッドは、現在のクラスでAnnotationを識別するメソッドの後に実行されます.
public staticとして宣言する必要があります
publicと宣言し、staticでない必要があります.
@AfterClassとして識別されたメソッドはすべて必ず実行され、@BeforeClassとして識別されたメソッドが異常を投げ出した場合でも同様に実行されます.
@Afterとして識別されたメソッドはすべて必ず実行され、@Beforeまたは@Testとして識別されたメソッドが異常を投げ出した場合でも同様に実行されます.

詳細:


1.@BeforeClassおよび@AfterClassは、クラスで1回しか実行されないため、「高価」なリソースの割り当てまたは解放に有効です.それに比べて、@Beforeと@Afterを使用することは、実行前に初期化する必要があるか、実行後にクリーンアップする必要があるリソースに対しても賢明な選択です.
2.クラスに@Beforeと@Afterを注釈する方法が複数ある場合、それらの実行順序は未知である.
3.@BeforeClass@AfterClass注記はjunitが提供する他の2つの注記で、public静的メソッドの上に設定する必要があります.classのロード前に実行することを示します.このように設定したメソッドは1回しか実行されませんが、@Before@Afterはtestの前/後に実行されます.
4.JUnit 4でテストクラスがTestCaseクラスを継承している場合、すべてのAnnotationは機能しません.

ルール:


BeforeClass->ベースクラスのBeforeClassを先に実行し、次に現在のクラスのBeforeClassを実行します.AfterClass->現在のクラスのAfterClassを先に実行し、ベースクラスのAfterClassを実行します.Constructor->Constructorは、BeforeClassの後、Beforeの前に実行されます.@TestごとにConstructorが実行されます.つまり、@Testごとに使用されるメンバー変数が再構築されます.Before,After->この3つのラベルは1つのクラスに複数回現れてはいけません(エラーが報告されます)、古い方法をリロードしたり書き直したりするしかありません.@Test->実行順は,サブクラスの@Testを先に実行し,ベースクラスの@Testを実行する.ベースクラスの@Testが実行されると,@Beforeと@Afterは現在のサブクラス定義に準ずる.(前条参照)@Suite->@Suiteは@BeforeClassと@AfterClassラベルのみを含むことを許可し、実行順序は上記を参照してください.
転載先:JUnit 4中@AfterClass@BeforeClass@after@beforeの違いJUnitラベル実行順序解析