亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Maven 單元測試

在我們平時開發的過程中,測試環節是永遠不能避免的。那我們如何能夠快速的進行單元測試呢,如何更方便的看到測試結果呢?在這個過程中,Maven 也能夠為我們提供幫助,那我們來看看 Maven 如何在測試環節來輔助我們的。

1. 使用 Maven 進行單元測試

1.1 添加測試代碼

這里面我們在 mall-order 模塊中增加生成訂單的方法,這個方法調用后會生成一個 OrderEntity 對象,里面包括訂單編號(orderNuM)和訂單所有者(orderOwner)兩個字段。(這里我們僅僅是用來模擬單元測試,對業務的具體邏輯不做過多糾結)

首先,我們在 mall-order 模塊的 pom.xml 文件中添加需要的依賴。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>

添加依賴后,我們在項目中創建 service 目錄和 entity 目錄,分別用于存放項目的服務層代碼和實體類。

在項目中添加對應的 service 和 entity

并且在對應的測試目錄中,增加該服務層代碼的測試類 OrderServiceTest

完成后,我們可以執行該測試用例,來調試 OrderService 中的 generateOrder 方法。

從調試結果來看,我們的方法被成功調用,并且沒有異常。

1.2 借助 Maven 進行單元測試

后來,隨著我們項目的不斷進行,我們開發的功能也隨之不斷增多,相應的,不同功能的測試用例也在不斷的增多。這個時候,如果單純的靠開發人員手工去點擊每一個測試用例,這顯然是不合理的。

那么我們就可以借助 Maven 來幫助我們做這件事情,來進行自動化的單元測試。

例如在 mall-order 模塊下, 我們想要執行所有的單元測試用例,那么我們只需要進入到該模塊的根目錄下,執行 mvn test 命令即可。

[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mic.tech:mall-order >-----------------------
[INFO] Building mall-order 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mall-order ---
[INFO] Surefire report directory: D:\code\mall-aggregate\mall-order\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mic.tech.OrderServiceTest
...
Results :

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.333 s
[INFO] Finished at: 2020-05-20T23:37:40+08:00
[INFO] ------------------------------------------------------------------------

從執行結果,我們可以看出,一共執行了三個測試用例,沒有失敗,也沒有報錯的情況出現。

2. 跳過測試

2.1 指定測試用例進行測試

其實每一項新的操作一般都會伴隨一些問題產生。例如,我們在實際的開發過程中,有些時候只是改動了一處代碼,但是如果直接執行 mvn test 命令的話,會將整個項目的測試用例全部都執行一遍,這對于我們來說,是有些得不償失的,沒必要因為一處改動,而去測試其他幾十個或者幾百個測試用例。

那我們應該怎么辦呢? 這里我們為了演示,寫了兩個測試類,OrderServiceTestOrderService2Test,其中第一個類中,有兩個測試用例,第二個類中,只有一個測試用例。

這時候,我們修改了第二個類中測試用例對應的方法,需要重新進行單元測試。我們可以直接執行命令:mvn test -Dtest=OrderService2Test

[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mic.tech:mall-order >-----------------------
[INFO] Building mall-order 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ...
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mall-order ---
[INFO] Surefire report directory: D:\code\mall-aggregate\mall-order\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mic.tech.OrderService2Test
...
Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.261 s
[INFO] Finished at: 2020-05-21T22:17:47+08:00
[INFO] ------------------------------------------------------------------------

從結構來看,我們這里只執行了第二個測試類中的測試用例。

2.2 跳過測試

換到另外一個場景,構建項目的時候。在平時的開發過程中,我們經常會使用mvn package構建項目,但是如果這個項目比較龐大,測試用例會非常多,那么執行測試用例的過程就會非常耗時。那怎么辦呢,test 階段在 package 階段之前,如果直接執行 package 階段,test 階段勢必會被執行到。

這個時候我們可以跳過測試來構建項目。(當然,這樣的做法是不被建議的)

在執行構建命令的時候,添加參數來指定跳過測試即可,mvn package -DskipTests 或者 mvn package -Dmaven.test.skip=true。

這兩個命令雖然都能夠在構建項目的時候跳過測試,但還是有些區別的。

  • -DskipTests: 會編譯測試類;
  • -Dmaven.test.skip=true: 不會編譯測試類。

3. 測試報告

Maven 的默認配置中,會在 target\surefire-reports 目錄下生成測試報告。

我們執行 mvn clean test,就可以觀察到該目錄生成。

我們可以在 txt 格式的文檔中看到生成的測試報告。這里的測試報告基本上和控制臺輸出的內容是類似的。

大家可能也注意到了,我們在執行測試用例的時候,同時生成了兩種類型的文件,一種是 txt 格式,另一個則是 XML 格式。

  • txt 格式: 為了讓執行測試用例的開發者更加直觀的看到測試用例的運行結果;
  • XML格式: 更多的是為了支持其他工具的解析。

4. maven-surefire-plugin

說了這么多,其實 Maven 之所以可以幫助我們自動執行測試用例,還是依靠 maven-surefire-plugin 插件來實現的。在學過 Maven 的生命周期之后,我們知道一個插件的功能都是通過目標來實現的,而不同的目標則會和生命周期中的不同階段進行綁定。這里,生命周期中的 test 階段就是和 maven-surefire-plugin 插件的 test 目標進行綁定的。

對于 Maven 來說,我們可以不指定或者顯示的聲明該插件。

在顯示聲明的時候,我可以通過添加 configuration 的方式來實現剛剛執行命令的效果。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.17</version>
            <configuration>
            	<skipTests>true</skipTests>
            </configuration>
        </plugin>
    </plugins>
</build>

例如我們在 configuration 中添加 skipTests 節點,則可以默認跳過測試。當我們再次執行mvn package命令構建項目的時候,test 階段是不會被執行的。

當然,我們也可以在 configuration 中添加 include 節點和 exclude 節點,來控制執行的測試類。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <configuration>
        <includes>
        	<include>**/OrderServiceTest.java</include>
        </includes>
        <excludes>
        	<exclude>**/OrderService2Test.java</exclude>
        </excludes>
    </configuration>
</plugin>

此時,我們再次執行mvn test的時候會發現只有OrderServiceTest.java類中的測試用例被執行了。

5. 小結

在本節的學習中,我們簡單介紹了如何編寫測試用例,Maven 如何自動的執行測試用例,以及在執行測試用例的過程中的一些技巧,比如跳過測試。最后我們還介紹了 maven-surefire-plugin 的簡單使用。通過本節的學習,我們可以使用 Maven 輕松的進行自動化測試。