上一彈中介紹了單元測試以及單元測試框架,這一彈主要來介紹一下JUnit這個目前比較流行的單測框架。java
JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個迴歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,由於程序員知道被測試的軟件如何(How)完成功能和完成什麼樣(What)的功能。Junit是一套框架,繼承TestCase類,就能夠用Junit進行自動測試了。程序員
如今不少IDE中都已經集成了JUnit,當咱們在建立maven項目的時候,通常在pom文件中也會自動增長junit的依賴。編程
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> <version>4.4</version> </dependency>
注意上面的maven的依賴中的scope,由於junit只在測試代碼中會被用到,這裏scope指定未test便可。咱們直接使用和介紹JUnit4。api
上手JUnit
要測試,要先有被測代碼(固然,基於測試編程能夠先有測試代碼)。先來看咱們想要測試的代碼:markdown
public class CaculateService { public float divide(float divisor, float dividend) { return divisor / dividend; } }
咱們想要測試這個類,那麼如何使用Junit進行測試呢?先來寫一個測試類。若是你使用的是IntelliJ+Mac,那麼能夠在類名上使用快捷鍵option+enter直接生成測試類,這樣IDE會幫忙生成一個對應的測試類。(其餘操做系統和IDE也有一樣的功能)框架
生成後的測試代碼和被測代碼所處路徑以下:maven
能夠看到,通常的maven項目中,會在src/main下面有兩個目錄,java和test,java目錄中放的是源碼,test目錄中放的是測試代碼。測試代碼和測試代碼的包名保持一致便可。ide
測試代碼以下:單元測試
public class CaculateServiceTest { CaculateService caculateService = new CaculateService(); @Test public void testDivide() throws Exception { Assert.assertEquals(caculateService.divide(2, 1), 2.0); } }
而後執行該方法就能夠了,先無論Assert.assertEquals的用法及結果,這裏總結下使用JUnit寫測試代碼的簡單步驟:測試
建立一個名爲 CaculateServiceTest.java 的測試類。
向測試類中添加名爲 testDivide() 的方法。
向方法中添加 Annotaion @Test。
執行測試條件而且應用 Junit 的 assertEquals API 來檢查。
JUnit中的Assert
public class Assert extends java.lang.Object
這個類提供了一系列的編寫測試的有用的聲明方法。只有失敗的聲明方法纔會被記錄。
Assert能夠用來判斷方法的真是結果和預期結果是否同樣。是咱們在寫單元測試中用到最多的一個api。
@BeforeClass:針對全部測試,只執行一次,且必須爲static void
@Before:初始化方法
@Test:測試方法,在這裏能夠測試指望異常和超時時間
@After:釋放資源
@Ignore:忽略的測試方法
一個單元測試類執行順序爲:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每個測試方法的調用順序爲:
@Before –> @Test –> @After
時間測試
若是一個測試用例比起指定的毫秒數花費了更多的時間,那麼 Junit 將自動將它標記爲失敗。timeout 參數和 @Test 註釋一塊兒使用。如今讓咱們看看活動中的 @test(timeout)。
@Test(timeout = 1000) public void testTimeoutSuccess() { // do nothing }
異常測試
你能夠測試代碼是否它拋出了想要獲得的異常。expected 參數和 @Test 註釋一塊兒使用。如今讓咱們看看活動中的 @Test(expected)。
@Test(expected = NullPointerException.class) public void testException() { throw new NullPointerException(); }
全部測試代碼
代碼地址
package com.hollischuang.effective.unitest.service; import org.junit.*; /** * @author Hollis 17/1/7. */ public class JUnitTest { /** * 只執行一次,在整個類執行以前執行 */ @BeforeClass public static void beforeClass() { System.out.println("in before class"); } /** * 只執行一次,在整個類執行以後執行 */ @AfterClass public static void afterClass() { System.out.println("in after class"); } /** * 每一個測試方法被執行前都被執行一次 */ @Before public void before() { System.out.println("in before"); } /** * 每一個測試方法被執行後都被執行一次 */ @After public void after() { System.out.println("in after"); } // test case 1 @Test public void testCase1() { System.out.println("in test case 1"); } // test case 2 @Test public void testCase2() { System.out.println("in test case 2"); } /** * 測試assertEquals */ @Test public void testEquals() { Assert.assertEquals(1 + 2, 3); } /** * 測試assertTrue */ @Test public void testTrue() { Assert.assertTrue(1 + 2 == 3); } /** * 測試assertFalse */ @Test public void testFals() { Assert.assertFalse(1 + 2 == 4); } /** * 測試assertNotNull */ @Test public void assertNotNull() { Assert.assertNotNull("not null"); } /** * 測試assertNull */ @Test public void assertNull() { Assert.assertNull(null); } /** * 測試fail和Ignore */ @Test @Ignore public void assertFail() { Assert.fail(); } /** * 測試異常 */ @Test(expected = NullPointerException.class) public void testException() { throw new NullPointerException(); } /** * 測試時間 */ @Test(timeout = 1000) public void testTimeoutSuccess() { // do nothing } /** * 測試時間 */ @Test(timeout = 1000) public void testTimeoutFailed() { while (true) { } } }
本文主要介紹了JUnit的常見用法,後面會專門寫一篇文章介紹如何將JUnit和Spring集合到一塊兒。
相關推薦
無單測、不編碼——寫單元測試的重要性
單元測試第一彈——從軟件開發生命週期談單元測試
單元測試第二彈——單元測試與單元測試框架