單元測試第三彈——使用JUnit進行單元測試

單元測試第三彈——使用JUnit進行單元測試

上一彈中介紹了單元測試以及單元測試框架,這一彈主要來介紹一下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也有一樣的功能)
單元測試第三彈——使用JUnit進行單元測試框架

生成後的測試代碼和被測代碼所處路徑以下:
單元測試第三彈——使用JUnit進行單元測試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

這個類提供了一系列的編寫測試的有用的聲明方法。只有失敗的聲明方法纔會被記錄。

  • void assertEquals(boolean expected, boolean actual)
  • 檢查兩個變量或者等式是否平衡
  • void assertFalse(boolean condition)
  • 檢查條件是假的
  • void assertNotNull(Object object)
  • 檢查對象不是空的
  • void assertNull(Object object)
  • 檢查對象是空的
  • void assertTrue(boolean condition)
  • 檢查條件爲真
  • void fail()
  • 在沒有報告的狀況下使測試不經過
    這些方法我就不一一介紹了,相信個人讀者們都能看懂並在平時開發中用的到,仍是比較容易理解的。

Assert能夠用來判斷方法的真是結果和預期結果是否同樣。是咱們在寫單元測試中用到最多的一個api。

JUnit中的註解


  • @BeforeClass:針對全部測試,只執行一次,且必須爲static void

  • @Before:初始化方法

  • @Test:測試方法,在這裏能夠測試指望異常和超時時間

  • @After:釋放資源

  • @AfterClass:針對全部測試,只執行一次,且必須爲static void

@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集合到一塊兒。

相關推薦
無單測、不編碼——寫單元測試的重要性
單元測試第一彈——從軟件開發生命週期談單元測試
單元測試第二彈——單元測試與單元測試框架
單元測試第三彈——使用JUnit進行單元測試

相關文章
相關標籤/搜索