2016-11-03 32 views
1

AFAIK在任何方法之前,構造函數方法由JRE運行。 但在我的情況下,構造函數在測試方法之後運行。junit構造函數運行後測試方法

import org.junit.*; 
public class CourseTest { 

    public CourseTest(){ 
     System.out.println("Constructor"); 
    } 

    @BeforeClass 
    public static void beforeClassTest() throws Exception{ 
     System.out.println("beforeClassTest"); 
    } 

    @AfterClass 
    public static void afterClassTest() throws Exception{ 
     System.out.println("afterClassTest"); 
    } 

    @Before 
    public void beforeTest() throws Exception{ 
     System.out.println("beforeTest"); 
    } 

    @After 
    public void afterTest() throws Exception{ 
     System.out.println("afterTest"); 
    } 


    @Test 
    public void getCredit() throws Exception { 
     System.out.println("test 1 is getCredit"); 

    } 

    @Test 
    public void getName() throws Exception { 
     System.out.println("test 2 is getName"); 
    } 
} 

,其結果是:

beforeTest 
test 2 is getName 
afterTest 
beforeTest 
test 1 is getCredit 
afterTest 
beforeClassTest 
Constructor 
Constructor 
afterClassTest 

不僅如此,我的測試案例以相反的順序運行過。 很困惑。 我明白爲什麼構造函數會運行兩次,因爲對於每個測試,都會實例化一個新類。但是如何在構造函數之後運行測試方法?

編輯: 作爲@麥克 - 詹金斯建議,我調試測試類,並在這個順序運行:

1-beforeClassTest 
2-Constructor 
3-beforeTest 
4-test 2 is getName 
5-afterTest 
6-Constructor 
7-beforeTest 
8-test 1 is getCredit 
9-afterTest 
10-afterClassTest 
+0

可能無法保證測試的順序,在任何情況下,每個測試用例都應該是獨立的(FIRST原則),所以順序應該不重要。 – MikeJ

+0

JUnit的生命週期方法應該以生殖方式執行。你如何執行你的課程? – davidxxx

+0

這可能只是失序的輸出,它是否總是相同的結果,以及如果爲每個方法添加Thread.sleep會發生什麼? –

回答

3

JUnit測試的執行順序並不保證是JUnit框架管理(內部)並行運行測試。 這是爲了使測試執行更快,這對於在CI(連續集成)環境中構建應用程序時尤其有用,因爲在這種環境中必須爲整個應用程序運行數千次測試。

如果你想控制的執行順序,可以使用如下@FixMethodOrder註釋:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class MyTest { 
    //your test code here 
} 

一個類中的JUnit測試執行的默認順序是 確定性,但不可預測的。執行的順序是不 保證對Java 7(和一些以前的版本),並且可以從運行甚至 變化來運行,所以執行的順序變更爲 確定性(使用JUnit 4.11)

您可以看看here

由於有多個測試用例,構造函數將被多次調用(由JUnit框架創建的不同線程並行執行它們)。因爲多線程正在運行,構造函數的System.out.prinln()(實際上是任何日誌)不能保證它總是首先被打印(即使它已被首先調用)。總之,在多線程環境中,不能預測日誌和System.out.println()語句的順序。

+0

好的,這對測試訂單來說是一個很好的答案,但測試方法之後運行的構造函數怎麼樣? –

+2

這只是爲了測試,這個問題也是關於爲什麼構造函數似乎運行兩次,以及測試後的BeforeClass等。 –

+2

構造函數應該在這種情況下運行兩次,每個測試用例運行一次。排序與我運行時的預期相同,這讓我覺得它可能只是關閉 – MikeJ