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 目錄,分別用于存放項目的服務層代碼和實體類。
并且在對應的測試目錄中,增加該服務層代碼的測試類 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
命令的話,會將整個項目的測試用例全部都執行一遍,這對于我們來說,是有些得不償失的,沒必要因為一處改動,而去測試其他幾十個或者幾百個測試用例。
那我們應該怎么辦呢? 這里我們為了演示,寫了兩個測試類,OrderServiceTest
和OrderService2Test
,其中第一個類中,有兩個測試用例,第二個類中,只有一個測試用例。
這時候,我們修改了第二個類中測試用例對應的方法,需要重新進行單元測試。我們可以直接執行命令: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 輕松的進行自動化測試。