JUnit使用入門

簡介

相信大部分新手在測試程序的時候都喜歡在方法中使用System.out.println()方法直接把結果打印出來,看結果是否符合預期。這種方法在測試代碼量很小、邏輯簡單的程序時很方便。但平常工做中的項目中的代碼量大、邏輯複雜,若是仍是在方法中使用System.out.println()來測試,只是輸出結果就使人眼花繚亂。這時候咱們就但願有一個工具是咱們更加方便的在複雜的項目中進行測試。JUnit就是這樣一個工具。api

JUnit是一個Java語言的單元測試框架。它不只能夠根據測試數據來驗證程序的正確性,還將測試代碼與工程代碼分離,此外它還能夠進行批量測試程序,極大的方便了測試工做。JUnit的使用很簡單,只須要在方法上加上@Test註解,JUint就能夠識別到這個測試方法。bash

例子

下面是一個使用JUint小栗子。在這個例子中,咱們建立了一個Calculator類和一個CalculatorTest類。Calculator類中實現了兩個簡單的方法:add()sub(),其中add()方法的邏輯是正確的,其返回值是兩個參數之和;sub()方法的邏輯是錯誤的,返回值是也是兩個參數之和。CalculatorTest類也有兩個方法:addTest()subTest()。其中addTest()用來測試Calculator類中的add方法,subTest()方法用來測試Calculator類中的sub()方法。框架

Step.1 在IDEA中建立一個Maven工程工具

Step.2 在pom.xml文件中添加JUnit的依賴,這樣咱們就可使用JUint啦。這裏使用最新版的JUnit。單元測試

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.5.0-M1</version>
    <scope>test</scope>
</dependency>
複製代碼

Step.3 編寫Calculator類。學習

package com.junit;

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int sub(int a, int b) {
        return a + b;
    }

}
複製代碼

Step.4 編寫CalculatorTest測試類。測試

咱們將使用CalculatorTest類測試Calculator類的正確性。CalculatorTest類中有兩個方法:addTest()subTest(),它們都須要使用@Test解來註明這是一個測試方法。這兩個方法的邏輯大體相同,都是先建立一個Calculator類的對象,調用各自要測試的方法,最後使用Assertions.assertEquals()來讓JUnit判斷程序是否正確。Assertions是JUnit提供的用來驗證程序運行結果的類,這裏咱們使用的Assertions.assertEquals()方法有兩個參數,第一個參數是預期值,第二個參數是程序的運行結果,調用Assertions.assertEquals()方法就可讓JUnit比較預期值和程序運行結果,以驗證程序的正確性。Assertions中提供了不少Assertions.assertEquals()方法的重載方法來比較不一樣類型的數據,以便於使用。ui

package com.junit;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class CalculatorTest {

    @Test
    public void addTest() {
        System.out.println("execute addTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(4, result);
    }

    @Test
    public void subTest() {
        System.out.println("execute subTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(2, result);
    }

}
複製代碼

Step.5 測試結果spa

CalculatorTest類在IDEA的顯示以下圖所示,咱們能夠點擊方法左邊的按鈕運行單個測試方法,也能夠點擊類名左邊的按鈕運行測試類中的全部測試方法。 3d

咱們先試下點擊方法左邊的按鈕運行進行測試。由於 Caluculator類中的 add()方法邏輯是正確的因此測試結果是正確的,在IDEA中的運行結果以下圖所示。
從上圖中咱們能夠很直觀的看到,當測試經過的時候IDEA的運行結果欄會有綠色的對號。那麼當測試不經過過的時候會怎樣呢?接下來,咱們類名左邊的按鈕運行測試類中的全部測試方法。
從上圖中能夠看出兩個測試方法都被調用了。因爲 Calculator類中的 sub()方法的邏輯是錯誤的,因此不會經過測試。從上圖也能夠看出IDEA在輸出欄中報錯了,並打印出指望值是2,實際運行結果是4的錯誤。

@BeforeAll @AfterAll @BeforeEach @AfterEach註解的使用

有些時候咱們須要在測試方法以前和以後作一些工做,例如打開和釋放資源。JUnit提供了一組註解來幫助咱們實現這類操做。

@BeforeAll註解的方法會在測試類的全部測試方法(包括被@BeforeEach註解的方法)執行以前執行。使用@BeforeAll註釋的方法必須爲static方法

@AfterAll會在測試類的全部測試方法(包括被@BeforeEach註解的方法)執行以前執行。使用@AfterAll註釋的方法必須爲static方法

@BeforeEach會在測試類的全部測試方法(除了被@BeforeAll註解的方法)執行以前執行。

@AfterEach會在測試類的全部測試方法(除了被@AfterAll註解的方法)執行以後執行。

爲了進一步瞭解這幾個註解的使用,咱們在CalculatorTest類中添加這幾個註解。

package com.junit;

import org.junit.jupiter.api.*;

public class CalculatorTest {

    @BeforeAll
    public static void beforeAll() {
        System.out.println("beforeAll");
    }

    @BeforeEach
    public void beforeEach() {
        System.out.println("beforeEach");
    }

    @AfterAll
    public static void afterAll() {
        System.out.println("afterAll");
    }

    @AfterEach
    public void afterEach() {
        System.out.println("afterEach");
    }

    @Test
    public void addTest() {
        System.out.println("execute addTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(4, result);
    }

    @Test
    public void subTest() {
        System.out.println("execute subTest");
        Calculator calculator = new Calculator();
        int result = calculator.add(1, 3);
        Assertions.assertEquals(2, result);
    }

}
複製代碼

運行結果以下圖所示

從運行結果中能夠看出,使用 @BeforeAll註解的方法在全部測試方法被執行以前執行,使用 @AfterAll註解的方法在全部測試方法被執行以後執行,它們都只被執行了一次。使用 @BeforeEach在測試類的除了被 @BeforeAll註解的方法的全部測試方法執行以前被執行。使用 @AfterEach會在測試類的除了被 @AfterAll註解的方法全部測試方法執行以後執行,它們都被執行了兩次。

JUnit使用入門的介紹到此結束,對JUnit有興趣的同窗能夠進行更深刻的學習。

相關文章
相關標籤/搜索