1. 程式人生 > >JUnit 單元測試

JUnit 單元測試

eas 禁用 not 支付 true 通過 char 建立 功能

(1)什麽是測試?

TDD

TDD是測試編程驅動,編程方法學,
也是一種編程思想,是先寫測試用例再編碼。
特點是:保證了代碼的質量,測試的覆蓋率高,
但是開發效率低。

DDD

領域驅動設計

測試本身也是一套完整學科

單元測試

  • 白盒測試 --- 能看到完整的代碼
  • 黑盒測試 --- 沒有源碼的,也叫功能測試。
  • 灰盒測試

壓力測試

並發數的問題,能承載多少並發

疲勞強度測試

系統長期穩定運行,如果72小時能穩定運行,
說明該系統度過了疲勞強度初步測試,
正常是7

冒煙測試

對一個功能點瘋狂的測試,主要是對流程測試,如支付環節

集成測試

完成功能的測試,最重要的是測試整體業務流程

回歸測試

當其他測試都完成後,當增加一個功能或者修改時,
有可能影響整個系統,這時候就需要回歸測試

自動化測試

需要編碼、模擬場景設計

(2)JUnit 簡介

JUnit 是用於編寫和運行可重復的自動化測試的開源測試框架,這樣可以保證我們的代碼按預期工作。JUnit 可廣泛用於工業和作為支架(從命令行)或IDE(如 IDEA)內單獨的 Java 程序。 JUnit 提供:

  • 斷言測試預期結果。
  • 測試功能共享通用的測試數據。
  • 測試套件輕松地組織和運行測試。
  • 圖形和文本測試運行。
  • JUnit 用於測試:
  • 整個對象
  • 對象的一部分 - 交互的方法或一些方法
  • 幾個對象之間的互動(交互)

JUnit 特點

  • JUnit 是用於編寫和運行測試的開源框架。
  • 提供了註釋,以確定測試方法。
  • 提供斷言測試預期結果。
  • 提供了測試運行的運行測試。
  • JUnit 測試讓您可以更快地編寫代碼,提高質量
  • JUnit 是優雅簡潔。它是不那麽復雜以及不需要花費太多的時間。
  • JUnit 測試可以自動運行,檢查自己的結果,並提供即時反饋。沒有必要通過測試結果報告來手動梳理。
  • JUnit 測試可以組織成測試套件包含測試案例,甚至其他測試套件。
  • Junit 顯示測試進度的,如果測試是沒有問題條形是綠色的,測試失敗則會變成紅色。

(3) JUnit 註解

@Test 
 public void method()
 
//測試註釋指示該公共無效方法它所附著可以作為一個測試用例。
@Before public void method() //Before 註釋表示,該方法必須在類中的每個測試之前執行,以便執行測試某些必要的先決條件。 @BeforeClass public static void method() //BeforeClass 註釋指出這是附著在靜態方法必須執行一次並在類的所有測試之前。發生這種情況時一般是測試計算共享配置方法(如連接到數據庫)。 @After public void method() //After 註釋指示,該方法在執行每項測試後執行(如執行每一個測試後重置某些變量,刪除臨時變量等) @AfterClass public static void method() //當需要執行所有的測試在 JUnit 測試用例類後執行,AfterClass 註解可以使用以清理建立方法,(從數據庫如斷開連接)。註意:附有此批註(類似於 BeforeClass)的方法必須定義為靜態。 @Ignore public static void method() //當想暫時禁用特定的測試執行可以使用忽略註釋。每個被註解為 @Ignore 的方法將不被執行。

(4)第一個 JUnit 單元測試

POM

pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xue</groupId>
    <artifactId>hello-spring</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.17.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

主要增加了 junit:junit 依賴

創建測試類

在測試包下 src/main/test 創建一個名為 MyTest 的測試類,代碼如下:

package com.xue.hello.spring.test;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class MyTest {

    /**
     * 執行測試方法前執行
     */
    @Before
    public void before() {
        System.out.println("執行 before() 方法");
    }

    /**
     * 執行測試方法後執行
     */
    @After
    public void after() {
        System.out.println("執行 after() 方法");
    }

    @Test
    public void testSayHi() {
        System.out.println("Hi Log4j");
    }

    @Test
    public void testSayHello() {
        System.out.println("Hello Log4j");
    }
}

(5)JUnit 斷言

什麽是斷言

斷言是編程術語,表示為一些布爾表達式,程序員相信在程序中的某個特定點該表達式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。同樣,程序投入運行後,最終用戶在遇到問題時可以重新啟用斷言。

使用斷言可以創建更穩定、品質更好且 不易於出錯的代碼。當需要在一個值為 false 時中斷當前操作的話,可以使用斷言。單元測試必須使用斷言(Junit/JunitX)。

常用斷言方法

斷言描述
void assertEquals([String message], expected value, actual value) 斷言兩個值相等。值可能是類型有 int, short, long, byte, char or java.lang.Object. 第一個參數是一個可選的字符串消息
void assertTrue([String message], boolean condition) 斷言一個條件為真
void assertFalse([String message],boolean condition) 斷言一個條件為假
void assertNotNull([String message], java.lang.Object object) 斷言一個對象不為空(null)
void assertNull([String message], java.lang.Object object) 斷言一個對象為空(null)
void assertSame([String message], java.lang.Object expected, java.lang.Object actual) 斷言,兩個對象引用相同的對象
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual) 斷言,兩個對象不是引用同一個對象
void assertArrayEquals([String message], expectedArray, resultArray) 斷言預期數組和結果數組相等。數組的類型可能是 int, long, short, char, byte or java.lang.Object.

註意:==比較的是地址, equals比較的是值

測試斷言效果

在之前的單元測試類中創建一個名為 testAssert 方法來查看斷言效果

/**
 * 測試斷言
 */
@Test
public void testAssert() {
    String obj1 = "junit";
    String obj2 = "junit";
    String obj3 = "test";
    String obj4 = "test";
    String obj5 = null;
    int var1 = 1;
    int var2 = 2;
    int[] arithmetic1 = {1, 2, 3};
    int[] arithmetic2 = {1, 2, 3};
    
    //如果為真往下執行
    assertEquals(obj1, obj2);

    assertSame(obj3, obj4);

    assertNotSame(obj2, obj4);

    assertNotNull(obj1);

    assertNull(obj5);

    assertTrue("為真", var1 == var2);

    assertArrayEquals(arithmetic1, arithmetic2);
}

 

JUnit 單元測試