JUnit 標籤執行順序解析
一.基礎知識
JUnit4使用Java5中的註解(annotation),以下是JUnit4常用的幾個annotation:
@Before:初始化方法 對於每一個測試方法都要執行一次(注意與BeforeClass區別,後者是對於所有方法執行一次)
@After:釋放資源 對於每一個測試方法都要執行一次(注意與AfterClass區別,後者是對於所有方法執行一次)
@Test:測試方法,在這裡可以測試期望異常和超時時間
@Test(expected=ArithmeticException.class)檢查被測方法是否丟擲ArithmeticException異常
@Ignore:忽略的測試方法
@BeforeClass:針對所有測試,只執行一次,且必須為static void
@AfterClass:針對所有測試,只執行一次,且必須為static void
一個JUnit4的單元測試用例執行順序為:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一個測試方法的呼叫順序為:
@Before -> @Test -> @After;
二.例項
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 |
---|---|
在一個類中只可以出現一次 | 在一個類中可以出現多次,即可以在多個方法的宣告前加上這兩個Annotaion標籤,執行順序不確定 |
方法名不做限制 | 方法名不做限制 |
在類中只執行一次 | 在每個測試方法之前或者之後都會執行一次 |
@BeforeClass父類中標識了該Annotation的方法將會先於當前類中標識了該Annotation的方法執行。 @AfterClass 父類中標識了該Annotation的方法將會在當前類中標識了該Annotation的方法之後執行 |
@Before父類中標識了該Annotation的方法將會先於當前類中標識了該Annotation的方法執行。 @After父類中標識了該Annotation的方法將會在當前類中標識了該Annotation的方法之後執行 |
必須宣告為public static | 必須宣告為public 並且非static |
所有標識為@AfterClass的方法都一定會被執行,即使在標識為@BeforeClass的方法丟擲異常的的情況下也一樣會。 | 所有標識為@After 的方法都一定會被執行,即使在標識為 @Before 或者 @Test 的方法丟擲異常的的情況下也一樣會。 |
特別說明:
1.@BeforeClass 和 @AfterClass 對於那些比較“昂貴”的資源的分配或者釋放來說是很有效的,因為他們只會在類中被執行一次。相比之下對於那些需要在每次執行之前都要初始化或者在執行之後 都需要被清理的資源來說使用@Before和@After同樣是一個比較明智的選擇;
2.如果類裡面可以有多個註解過@Before和@After的方法,它們的執行順序是未知的;
3.@BeforeClass @AfterClass註解是junit提供的另外的兩個註解,必須設定在public 靜態方法之上,表示在class載入之前執行,這樣設定的方法只會執行一次,而@Before @After則會再每次test之前/之後執行;
4.在JUnit4中,如果測試類繼承了TestCase類,那麼所有的Annotation都不會起作用。
規則:
BeforeClass -> 先執行基類的BeforeClass, 然後執行當前類的BeforeClass。
AfterClass -> 先執行當前類的AfterClass, 然後執行基類的AfterClass。
Constructor -> Constructor會在BeforeClass之後,Before之前執行。對於每個@Test,Constructor都會被執行,也就是說,每一個單獨的@Test所使用的成員變數都會被重新構造一次。
Before,After -> 這三個標籤是不可以多次出現在一個類裡面的(會報錯),只能過載或者複寫舊的方法。
@Test -> 執行順序是先執行子類的@Test,再執行基類的@Test。當執行基類的@Test時,@Before和@After以當前子類定義為準。(參考上一條)
@Suite -> @Suite只允許含有@BeforeClass和@AfterClass標籤,執行順序參考上述。
轉載自:
JUnit4中@AfterClass @BeforeClass @after @before的區別對比
JUnit標籤執行順序解析
相關文章
- 類script標籤,非同步載入,順序執行非同步
- 標準的 SQL 解析順序SQL
- js——<script>標籤的載入順序JS
- Sql執行順序SQL
- SQL 查詢語句的執行順序解析SQL
- SQL Server中SELECT語句執行順序解析SQLServer
- 【實驗】where子句的解析順序及執行效率
- JavaScript執行順序分析JavaScript
- 任務執行順序
- for語句執行順序
- JavaScript的執行順序JavaScript
- laravel Event執行順序Laravel
- mySQL 執行語句執行順序MySql
- Oracle SQL語句執行流程與順序原理解析OracleSQL
- 09 Windows批處理之標籤和無序執行Windows
- sql mysql 執行順序 (4)MySql
- SQL語句執行順序SQL
- js執行順序Event LoopJSOOP
- JavaScript for迴圈 執行順序JavaScript
- JavaScript 執行順序淺析JavaScript
- Linux c多執行緒執行順序Linux執行緒
- 關於 Promise 的執行順序Promise
- Spring Aop的執行順序Spring
- js解惑-函式執行順序JS函式
- SQL 語句的執行順序SQL
- Select語句執行順序
- 命令執行順序控制與管道
- java執行緒優先順序Java執行緒
- CSS規則的執行順序CSS
- Java類的基本執行順序Java
- SQL 執行順序 你懂的SQL
- pipeline的執行順序
- mysql 語句的執行順序MySql
- 執行緒執行順序——CountDownLatch、CyclicBarrier 、join()、執行緒池執行緒CountDownLatch
- HTML 標籤參考無極3註冊按字母順序排列 HTML 641480標籤HTML
- Java中如何保證執行緒順序執行Java執行緒
- javascript執行機制之執行順序詳解JavaScript
- Pytest 順序執行,依賴執行,引數化執行