在編碼的過程當中,須要單元測試,寫測試用例,junit就能派上用場。我如今把一個測試方法看成一個測試用例。
java
在早期junit3中,須要繼承junit.framework.TestCase,這裏有諸多限制:好比測試的方法名必須以test開頭,setUp、tearDown方法名也是固定的。setUp、tearDown的用途就是統一給多個測試方法準備數據、清理現場,減小了重複工做,在測試術語中他們叫測試夾具。一個完整的測試用例:先執行setUp,再執行測試方法,最後執行tearDown。各個測試用例之間是沒有順序的。
spring
在如今的junit4中,擴展了幾個註解,不須要繼承junit.framework.TestCase:單元測試
一、@BeforeClass:放在一個public static void方法上,這個方法最早執行,並且只執行一次。能夠用於加載一些靜態配置文件,環境設置等。測試
二、@AfterClass:放在一個public static void方法上,這個方法最後執行,並且只執行一次。可用於清理數據、環境等。在某些狀況下,環境的設置與清理只須要執行一次,能夠考慮使用@BeforeClass、@AfterClass,相對與@Before、@After來講,效率有所提升。ui
三、@Before:放在一個public void方法上,在每一個測試方法執行以前執行。通常的用途爲測試方法準備測試數據。編碼
四、@After:放在一個public void方法上,在每一個測試方法執行以後執行。通常的用途爲清理現場,不干擾下一個測試方法的執行。spa
五、@Test:放在一個public void方法上,這是執行測試的方法,是測試主體。
.net
六、@Ignore:能夠放在測試方法上,忽略該測試方法不執行;也能夠放在測試類上,整個測試類的全部測試方法將會忽略掉,不執行。code
七、@FixMethodOrder:放在測試類上。某些狀況下,若是須要測試方法按照必定的順序執行,能夠加上他。通常來講,測試方法之間是相互獨立的,沒有執行順序的要求。blog
八、@Parameters:放在一個public static方法上,並返回測試數據集合。在參數化測試中用到這個註解,配合@RunWith(Parameterized.class)一塊兒使用。詳細介紹見 junit4 測試參數化
九、@SuiteClasses:放在測試類上。這裏的測試類用於組合其餘多個測試類一塊兒執行,好比如今有10個測試類,咱們想執行其中的3個測試類,這個註解就能夠知足咱們的要求。配合@RunWith(Suite.class)一塊兒使用。
十、@Category:放在測試方法或測試測試類上,配合@RunWith(Categories.class)、@SuiteClasses一塊兒使用;Categories也是一個Suite。和註解@SuiteClasses相似,不過@Category能夠更細粒度的控制組合,能夠按測試方法組合在一塊兒:好比A測試類有5個測試方法,B測試類有3個測試方法,@Category能夠組合A中的兩個方法、B中的一個方法。
十一、@RunWith:放在測試類上。通常咱們要用到junit的一些增強功能,須要用到他:好比組合測試@RunWith(Suite.class)、參數化測試@RunWith(Parameterized.class)、集成spring測試@RunWith(SpringJUnit4ClassRunner.class)等等。
十二、@Rule:規則註解,放在public屬性上,而且直接或者間接實現了org.junit.rules.TestRule,能夠靈活的定義一些規則:好比:org.junit.rules.ExpectedException可用於異常測試。詳細介紹見 junit4 測試異常
雖然加註解的方法名能夠任意寫其餘合法的方法名,但最好仍是表意,便於閱讀理解。
package cn.wonhigh.o2o.test; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Ignore; import org.junit.Test; import org.junit.runners.MethodSorters; // 指定測試方法的執行順序 @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class Junit4Test { // 方法名任意 @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("最早執行"); } // 方法名任意 @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("最後執行"); } // 方法名任意 @Before public void setUp() throws Exception { System.out.println("在測試方法以前執行"); } // 方法名任意 @After public void tearDown() throws Exception { System.out.println("在測試方法以後執行"); } // 方法名任意 @Test public void method1() { System.out.println("測試方法1"); } // 方法名任意 @Test public void method2() { System.out.println("測試方法2"); } // 該方法將被忽略調,不會執行 @Ignore @Test public void method3() { System.out.println("測試方法3"); } }
輸出:
最早執行 在測試方法以前執行 測試方法1 在測試方法以後執行 在測試方法以前執行 測試方法2 在測試方法以後執行 最後執行