天天看點

在 Maven 項目中運作 JUnit 5 測試用例

在 Maven 項目中運作 JUnit 5 測試用例

鏡像下載下傳、域名解析、時間同步請點選

阿裡巴巴開源鏡像站

一、編寫JUnit 5測試用例

如果你是Java開發者,那麼對于JUnit應該就不陌生。JUnit是Java單元測試的基礎工具。

JUnit目前最新的版本是JUnit 5.x,為了幫助廣大的Java開發者使用最新版JUnit,接下來将為大家講解如何編寫JUnit 5測試用例。

1. 引入JUnit 5依賴

相比較JUnit 4而言,JUnit 5一個比較大的改變是JUnit 5擁有與JUnit 4不同的全新的API。JUnit 5分成了三部分:

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage           
  • JUnit Platform是在JVM上啟動測試架構的基礎。 它還定義了TestEngine API,用于開發在平台上運作的測試架構。 此外,該JUnit Platform還提供了一個控制台啟動器(用于從指令行啟動該平台)和一個基于JUnit 4的運作器,用于在基于JUnit 4的環境中在該平台上運作任何TestEngine。 流行的IDE(IntelliJ IDEA,Eclipse,NetBeans和Visual Studio Code等)和建構工具(Gradle,Maven和Ant等)中也存在對JUnit平台的一流支援。
  • JUnit Jupiter是新程式設計模型和擴充模型的組合,用于在JUnit 5中編寫測試和擴充。Jupiter子項目提供了一個TestEngine,用于在平台上運作基于Jupiter的測試。
  • JUnit Vintage提供了一個TestEngine,用于在平台上運作基于JUnit 3和基于JUnit 4的測試。

是以,在Maven中,JUnit 5分子產品的,意味着你可以按需引入上面定義的任意子產品。這使得引入JUnit 5依賴就有了多個選擇。

一般而言,力求省事,就可以通過引入junit-jupiter依賴。junit-jupiter就是常用JUnit 5子產品的聚合包。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>${junit-jupiter.version}</version>
    <scope>test</scope>
</dependency>           

2. 編寫測試用例

下面是一段簡單的Java程式:

/**
 * Welcome to https://waylau.com
 */
package com.waylau.java.demo;
/**
 * Hello World.
 * 
 * @since 1.0.0 2020年4月12日
 * @author <a href="https://waylau.com">Way Lau</a>
 */
public class HelloWorld {
    private String words;
    public HelloWorld(String words) {
        this.words = words;
    }
    
    public String getWords() {
        return words;
    }
}           

按照管理,我們會在Maven工程的test目錄,建立一個與之對應的單元測試用例:

/**
 * Welcome to https://waylau.com
 */
package com.waylau.java.demo;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
 * HelloWorld Test.
 * 
 * @since 1.0.0 2020年4月12日
 * @author <a href="https://waylau.com">Way Lau</a>
 */
class HelloWorldTests {
    @Test
    void testGetWords() {
        var words = "Hello World";
        var hello = new HelloWorld(words);
        
        assertEquals(words, hello.getWords());
    }
}           

上述用例非常簡單,就是想測試下,HelloWorld的getWords方法,是否與預期的一緻。

這裡需要強調的是JUnit 5和JUnit 4的不同點:

  • JUnit 5使用的API是

    org.junit.jupiter.api.*

    包下
  • 測試方法(比如上例testGetWords),可以不加

    public

二、運作JUnit 5測試用例

上如上文所講,在大多數主流的IDE中,都提供了對JUnit 5的支援。是以可以選擇在IDE中運作,也可以通過Maven執行測試。

1. 在IDE中運作

以Eclipse IDE為例,右鍵類或者方法,選擇“Run As -> JUnit Test”即可。如下圖所示。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-tONJQN3t-1587044607054)(../images/post/20200412-ide.jpg)]

2. 通過Maven執行測試

在Maven中執行測試用例的指令如下:

mvn test           

如果你執行了上述指令,會得到下面的測試結果

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.waylau.java.demo.HelloWorldTests
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.983 s
[INFO] Finished at: 2020-04-12T11:22:16+08:00
[INFO] ------------------------------------------------------------------------           

上面結果沒有失敗的用例,但同時你也發現了沒有成功的用例。因為根本沒有執行測試用例。

這是因為,在Maven中并不能直接識别JUnit 5測試用例。如何解決?此時,還需要額外加多Maven Surefire或Maven Failsafe兩個插件。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>${maven-failsafe-plugin.version}</version>
        </plugin>
    </plugins>
</build>           

在Maven中再次執行測試用例,會得到下面的測試結果:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.waylau.java.demo.HelloWorldTests
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 s - in com.waylau.java.demo.HelloWorldTests
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.116 s
[INFO] Finished at: 2020-04-12T11:30:29+08:00
[INFO] ------------------------------------------------------------------------           

可以看到,HelloWorldTests類已經得到了測試執行。

提供全面,高效和穩定的鏡像下載下傳服務。釘釘搜尋 ' 21746399 ‘ 加入鏡像站官方使用者交流群。”

繼續閱讀