天天看點

Junit架構學習筆記-- 關于Junit的基本用法

參考教程: junit教程

目錄

      • 概述
      • 環境搭建
      • 基本用法
      • 時間測試 timeout
      • 注解的使用
      • 參數化測試

概述

Junit 是一個常用的Java單元測試架構,所謂的單元測試是對某一個單一實體的測試(比如某個具體的類或者類裡的方法),Junit提供了注釋來識别測試方法,提供了斷言來測試預期結果,提供了測試運作來運作測試。

環境搭建

用Intellij IDEA建立一個maven quickstart項目,方法參考

https://blog.csdn.net/man_zuo/article/details/81316988

然後在pom.xml聲明依賴

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
       <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.2</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.3.2</version>
      <scope>test</scope>
    </dependency>
           

目錄說明

在maven項目裡,項目代碼和測試代碼不是放在同一個地方的,而是用兩個目錄結構相同的檔案夾來分别存放項目代碼和測試代碼。

比如下圖中的main檔案夾是用來存放項目代碼,而test檔案夾(用紅框标注的)是用來存放測試代碼的。

我這裡的包路徑com.test裡含有test可能會引起一些歧義。。并不是說明在這個包下的就是測試檔案,因為包名是可以随意改的(隻是我懶得改了)。

Junit架構學習筆記-- 關于Junit的基本用法

基本用法

main

檔案夾下的 com.test包 建立一個包 JunitTest,在這個包中建立一個 Hello類。

package com.test.JunitTest;

/**
 * Created by IntelliJ IDEA
 *
 * @author manzuo
 * @date 2019/7/4 17:21
 */
public class Hello{
    private String message = "Hello";

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

           

現在就用Junit來測試一下這個Hello類。

将輸入光标移動到類名所在的位置,然後按下快捷鍵

alt + Enter

,選擇

Creat Test

Junit架構學習筆記-- 關于Junit的基本用法
Junit架構學習筆記-- 關于Junit的基本用法

選擇Creat Test之後會彈出一個視窗,你可以設定要生成的測試類的一些屬性,比如類名,包名等,在Member框裡可以選擇你要測試的方法,這裡選擇了getMessage()方法,當然也可以一次性選擇多個方法,然後點選OK确定。

Junit架構學習筆記-- 關于Junit的基本用法

然後IDEA會自動幫你在test中相同的位置 生成一個測試類。

@Test

表明這是一個測試用例。

Junit架構學習筆記-- 關于Junit的基本用法

在getMessage方法裡編寫測試。

Junit架構學習筆記-- 關于Junit的基本用法
Junit架構學習筆記-- 關于Junit的基本用法

asserEquals隻是其中一個測試方法,還有很多其他測試方法,摘抄如下:

(一些參數的說明:

expected 是指期望值,也就是你預期希望得到的值,actual 是指程式運作實質得到的值,condition 是指一個條件表達式,比如 'x>5 '

序号 方法和描述
1

void assertEquals(boolean expected, boolean actual)

檢查兩個變量或者等式是否平衡

2

void assertTrue(boolean expected, boolean actual)

檢查條件為真

3

void assertFalse(boolean condition)

檢查條件為假

4

void assertNotNull(Object object)

檢查對象不為空

5

void assertNull(Object object)

檢查對象為空

6

void assertSame(Object expected,Object actual)

assertSame() 方法檢查兩個相關對象是否指向同一個對象

7

void assertNotSame(Object expected,Object actual)

assertNotSame() 方法檢查兩個相關對象是否不指向同一個對象

8

void assertArrayEquals(expectedArray, resultArray)

assertArrayEquals() 方法檢查兩個數組是否相等(需要兩個數組裡對應的位置的元素都相等)

時間測試 timeout

有時候,處于性能的考慮,我們對方法的執行所需的時間是有要求的,是以必須在規定的時間裡執行完方法。Junit架構也提供了一個選項,

可以規定測試用例運作的最大時間,如果測試用例運作時間超過了規定的最大時間,就會标注為失敗

先修改一下Hello類的getMessage()方法

public String getMessage() throws Exception {
        sleep(2000);//睡眠2秒後執行,該方法需要 import static java.lang.Thread.sleep;
        return message;
    }
           

然後修改一下測試類HelloTest的getMessage()方法

@Test(timeout = 1000)//規定該測試用例必須在1秒内運作完畢
    public void getMessage() throws Exception {
        Hello hello = new Hello();
        assertEquals("Hello",hello.getMessage());
    }
           
Junit架構學習筆記-- 關于Junit的基本用法

注解的使用

序号 注解和描述
1

@Test

這個注解說明依附在 JUnit 的 public void 方法可以作為一個測試案例。

2

@Before

有些測試在運作前需要創造幾個相似的對象。在 public void 方法加該注解可以使該方法需要在 test 方法前運作。

3

@After

如果你将外部資源在 Before 方法中配置設定,那麼你需要在測試運作後釋放他們。在 public void 方法加該注解可以使得該方法需要在 test 方法後運作。

4

@BeforeClass

在 public void 方法加該注解可以使得該方法需要在類中所有方法前運作。

5

@AfterClass

它将會使方法在所有測試結束後執行。這個可以用來進行清理活動。

6

@Ignore

這個注解是用來忽略有關不需要執行的測試的。

稍微修改一下剛剛的HelloTest 方法,來測試這些注解的使用

package com.test.JunitTest;

import org.junit.*;

import static org.junit.Assert.*;

public class HelloTest {
    @BeforeClass
    public static void beforClass(){
        System.out.println("beforClass running");
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("afterClass running");
    }
    @Before
    public void before(){
        System.out.println("before running");
    }
    @After
    public void after(){
        System.out.println("after running");
    }
    @Test
    public void test1(){
        System.out.println("test1 running");
    }
    @Test
    public void test2(){
        System.out.println("test2 running");
    }
    @Ignore
    @Test
    public void test3(){
        System.out.println("test3 running");
    }
}
           
Junit架構學習筆記-- 關于Junit的基本用法

運作結果如下

Junit架構學習筆記-- 關于Junit的基本用法

是以可以得出如下結論:

  • @BeforeClass

    注解的方法首先執行,并且隻執行一次。
  • @AfterClass

    注解的 方法最後執行,并且隻執行一次。
  • @Before()

    注解的方法針對每一個測試用例執行,但是是在執行測試用例之前。
  • @After()

    方法針對每一個測試用例執行,但是是在執行測試用例之後。
  • @Test

    注解每個測試用例
  • @Ignore

    标注的測試用例會被忽略

參數化測試

有時候,我們需要用不同的值去測試同一個方法。Junit4就提供了參數化測試機制,允許我們用不同的值去測試某一個測試用例。

為了使用參數化測試這個用了,我們先寫一個算法,比如判斷某個數是不是素數(除了1和它本身以外不再有其他因數)

package com.test.JunitTest;

/**
 * Created by IntelliJ IDEA
 *
 * @author manzuo
 * @date 2019/7/9 19:27
 */
public class PrimeNumberChecker {
    public boolean isPrimeNumber(int number){
        for (int i = 2; i < (number / 2); i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }
}

           

現在就用不同的值來測試 isPrimeNumber()方法。首先,先用前面的方法,快速生成測試用例

Junit架構學習筆記-- 關于Junit的基本用法

然後通過下面的五個步驟,來修改PrimeNumberCheckerTes測試類,建立參數化測試

  • 用 @RunWith(Parameterized.class) 來注釋 test 類。
  • 建立一個由 @Parameters 注釋的公共的靜态方法,它傳回一個數組來作為測試資料集合。
  • 建立一個公共的構造函數,它接受和一行測試資料相等同的東西。
  • 為每一列測試資料建立一個執行個體變量。
  • 用執行個體變量作為測試資料的來源來建立你的測試用例
package com.test.JunitTest;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.*;

@RunWith(Parameterized.class) //  用 @RunWith(Parameterized.class) 來注釋 test 類
public class PrimeNumberCheckerTest {
    private int number;//測試資料裡的數字
    private boolean expectedResult;//測試資料裡期望的結果
    private PrimeNumberChecker primeNumberChecker;//一個執行個體

    /* 建立一個由 @Parameters 注釋的公共的靜态方法,它傳回一個數組來作為測試資料集合*/
    @Parameterized.Parameters
    public static Collection primeNumbers(){
        Object [][] objects = { //測試資料集合
                { 2, true },// 2是素數
                { 3, true },// 3是素數
                { 9, false },//9不是素數
                { 19, true},
                { 22, false },
                { 23, true }};
        return Arrays.asList(objects);
    }
    /*建立一個公共的構造函數,它接受和一行測試資料相等同的東西。*/
    public PrimeNumberCheckerTest(int number, boolean expectedResult) {
        this.number = number;
        this.expectedResult = expectedResult;
    }
    /*為每一列測試資料建立一個執行個體變量*/
    @Before
    public void initialize() {
        primeNumberChecker = new PrimeNumberChecker();
    }
    /*用執行個體變量作為測試資料的來源來建立你的測試用例*/
    @Test
    public void isPrimeNumber() {
        System.out.println("number = "+ number);
        assertEquals(expectedResult,primeNumberChecker.isPrimeNumber(number));
    }
}
           

運作測試結果如下:

Junit架構學習筆記-- 關于Junit的基本用法