Maven 單元測試
在我們平時開發(fā)的過程中,測試環(huán)節(jié)是永遠不能避免的。那我們?nèi)绾文軌蚩焖俚倪M行單元測試呢,如何更方便的看到測試結(jié)果呢?在這個過程中,Maven 也能夠為我們提供幫助,那我們來看看 Maven 如何在測試環(huán)節(jié)來輔助我們的。
1. 使用 Maven 進行單元測試
1.1 添加測試代碼
這里面我們在 mall-order 模塊中增加生成訂單的方法,這個方法調(diào)用后會生成一個 OrderEntity 對象,里面包括訂單編號(orderNuM)和訂單所有者(orderOwner)兩個字段。(這里我們僅僅是用來模擬單元測試,對業(yè)務(wù)的具體邏輯不做過多糾結(jié))
首先,我們在 mall-order 模塊的 pom.xml 文件中添加需要的依賴。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
添加依賴后,我們在項目中創(chuàng)建 service 目錄和 entity 目錄,分別用于存放項目的服務(wù)層代碼和實體類。
并且在對應(yīng)的測試目錄中,增加該服務(wù)層代碼的測試類 OrderServiceTest
。

完成后,我們可以執(zhí)行該測試用例,來調(diào)試 OrderService
中的 generateOrder
方法。
從調(diào)試結(jié)果來看,我們的方法被成功調(diào)用,并且沒有異常。
1.2 借助 Maven 進行單元測試
后來,隨著我們項目的不斷進行,我們開發(fā)的功能也隨之不斷增多,相應(yīng)的,不同功能的測試用例也在不斷的增多。這個時候,如果單純的靠開發(fā)人員手工去點擊每一個測試用例,這顯然是不合理的。
那么我們就可以借助 Maven 來幫助我們做這件事情,來進行自動化的單元測試。
例如在 mall-order 模塊下, 我們想要執(zhí)行所有的單元測試用例,那么我們只需要進入到該模塊的根目錄下,執(zhí)行 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] ------------------------------------------------------------------------
從執(zhí)行結(jié)果,我們可以看出,一共執(zhí)行了三個測試用例,沒有失敗,也沒有報錯的情況出現(xiàn)。
2. 跳過測試
2.1 指定測試用例進行測試
其實每一項新的操作一般都會伴隨一些問題產(chǎn)生。例如,我們在實際的開發(fā)過程中,有些時候只是改動了一處代碼,但是如果直接執(zhí)行 mvn test
命令的話,會將整個項目的測試用例全部都執(zhí)行一遍,這對于我們來說,是有些得不償失的,沒必要因為一處改動,而去測試其他幾十個或者幾百個測試用例。
那我們應(yīng)該怎么辦呢? 這里我們?yōu)榱搜菔?,寫了兩個測試類,OrderServiceTest
和OrderService2Test
,其中第一個類中,有兩個測試用例,第二個類中,只有一個測試用例。
這時候,我們修改了第二個類中測試用例對應(yīng)的方法,需要重新進行單元測試。我們可以直接執(zhí)行命令: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] ------------------------------------------------------------------------
從結(jié)構(gòu)來看,我們這里只執(zhí)行了第二個測試類中的測試用例。
2.2 跳過測試
換到另外一個場景,構(gòu)建項目的時候。在平時的開發(fā)過程中,我們經(jīng)常會使用mvn package
構(gòu)建項目,但是如果這個項目比較龐大,測試用例會非常多,那么執(zhí)行測試用例的過程就會非常耗時。那怎么辦呢,test 階段在 package 階段之前,如果直接執(zhí)行 package 階段,test 階段勢必會被執(zhí)行到。
這個時候我們可以跳過測試來構(gòu)建項目。(當然,這樣的做法是不被建議的)
在執(zhí)行構(gòu)建命令的時候,添加參數(shù)來指定跳過測試即可,mvn package -DskipTests
或者 mvn package -Dmaven.test.skip=true
。
這兩個命令雖然都能夠在構(gòu)建項目的時候跳過測試,但還是有些區(qū)別的。
- -DskipTests: 會編譯測試類;
- -Dmaven.test.skip=true: 不會編譯測試類。
3. 測試報告
Maven 的默認配置中,會在 target\surefire-reports
目錄下生成測試報告。
我們執(zhí)行 mvn clean test
,就可以觀察到該目錄生成。
我們可以在 txt 格式的文檔中看到生成的測試報告。這里的測試報告基本上和控制臺輸出的內(nèi)容是類似的。
大家可能也注意到了,我們在執(zhí)行測試用例的時候,同時生成了兩種類型的文件,一種是 txt 格式,另一個則是 XML 格式。
- txt 格式: 為了讓執(zhí)行測試用例的開發(fā)者更加直觀的看到測試用例的運行結(jié)果;
- XML格式: 更多的是為了支持其他工具的解析。
4. maven-surefire-plugin
說了這么多,其實 Maven 之所以可以幫助我們自動執(zhí)行測試用例,還是依靠 maven-surefire-plugin 插件來實現(xiàn)的。在學(xué)過 Maven 的生命周期之后,我們知道一個插件的功能都是通過目標來實現(xiàn)的,而不同的目標則會和生命周期中的不同階段進行綁定。這里,生命周期中的 test 階段就是和 maven-surefire-plugin 插件的 test 目標進行綁定的。
對于 Maven 來說,我們可以不指定或者顯示的聲明該插件。
在顯示聲明的時候,我可以通過添加 configuration 的方式來實現(xiàn)剛剛執(zhí)行命令的效果。
<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 節(jié)點,則可以默認跳過測試。當我們再次執(zhí)行mvn package
命令構(gòu)建項目的時候,test 階段是不會被執(zhí)行的。
當然,我們也可以在 configuration 中添加 include 節(jié)點和 exclude 節(jié)點,來控制執(zhí)行的測試類。
<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>
此時,我們再次執(zhí)行mvn test
的時候會發(fā)現(xiàn)只有OrderServiceTest.java
類中的測試用例被執(zhí)行了。
5. 小結(jié)
在本節(jié)的學(xué)習(xí)中,我們簡單介紹了如何編寫測試用例,Maven 如何自動的執(zhí)行測試用例,以及在執(zhí)行測試用例的過程中的一些技巧,比如跳過測試。最后我們還介紹了 maven-surefire-plugin 的簡單使用。通過本節(jié)的學(xué)習(xí),我們可以使用 Maven 輕松的進行自動化測試。