maven 打包跳過測試_Maven測試外掛
在Maven專案中,使用者基於 JUnit 或 TestNG 編寫好了測試程式碼,接下來怎麼執行,並且形成測試報告呢?具體執行測試程式碼,需要靠 maven-surefire-plugin 外掛來實現。
Surefire 外掛簡介
Maven 本身雖然不是測試框架,但是 Maven 能夠在構建執行到特定的生命週期階段的時候,通過呼叫外掛執行基於 JUnit 和 TestNG 編寫好的測試用例。這個外掛就是 maven-surefire-plugin 外掛,它能很好地相容 JUnit 系列和 TestNG 測試框架。在 Maven 的 default 生命週期的 test 階段,繫結的預設外掛是 maven-surefire-plugin。這是一個內建繫結,在預設情況下,maven-surefire-plugin 的 test 階段會自動執行測試原始碼路徑下的所有符合命名模式的測試類。符合命名模式的規範是:
**/Test*.java:所有命名為 Test 開頭的Java類。
**/*Test.java:所有命名為 Test 結尾的 Java 類。
**/*TestCase.java:所有命名為 TestCase 結尾的 Java 類。
只要測試類符合上面的命名模式,Maven 都會自動執行它們,不需要再定義測試集合來宣告要執行哪些測試類。如果測試程式碼是基於 TestNG 框架的,還可以通過配置檔案靈活地指定需要執行的測試案例類。具體的寫法請參考前面關於 TestNG 的介紹。
跳過測試
在實際專案中,要使 Maven 的構建過程暫時跳過測試環境(不執行測試案例),可以在執行 mvn 命令的後面通過新增 skipTests 引數實現,程式碼如下:
Mvn package -DskipTests
不過雖然可以通過該方式跳過測試階段,但是這種操作和思路是不提倡的,因為釋出和使用一個沒有經過測試的構件有很大的風險。除了可以在 mvn 命令後面通過指定 skipTests 引數標明跳過測試外,還可以在 pom 中的 maven-surefire-plugin 外掛配置中進行宣告,程式碼如下:
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<version>2.16version>
<configuration>
<skipTests>trueskipTests>
configuration>
plugin>
除了在 Maven 構建過程中跳過執行測試程式碼外,還可以直接跳過對測試的編譯。
同樣地,這裡可以通過命令列指定,也可以通過 pom 的配置檔案指定。Maven 命令指定程式碼如下:
Mvn package -Dmaven.test.skip=true
其中,maven.test.skip 引數同時控制 maven-compile-plugin 和 maven-surefire-plugin 兩個外掛的行為:既跳過了測試程式碼的編譯,也跳過了測試程式碼的執行。pom 配置檔案的指定程式碼如下:
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>2.1version>
<configuration>
<skip>trueskip>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<version>2.16version>
<configuration>
<skip>trueskip>
configuration>
plugin>
個性化指定執行測試
在實際專案中,使用者可能需要靈活地指定執行某些測試案例。這時候,就可以通過 mvn 命令的 test 引數來實現,程式碼如下:
Mvn test -Dtest=TestDemo
表示只執行 TestDemo 測試類。同樣地,還可以在 test 引數中,用“∗”萬用字元指定執行符合規則的所有測試類。例如:
Mvn test -Dtest=Test*Demo
表示執行類名為 Test 開頭,Demo 結尾的所有測試類。如果不嫌麻煩,也可以通過 test 引數明確指定要執行的測試類名。例如:
Mvn test -Dtest=TestDemo1,TestDemo2
表示執行類名為 TestDemo1 和 TestDemo2 的所有測試類。注意,指定的多個測試類之間要用逗號隔開。同樣,這裡也可以將“∗”萬用字元和明確指定測試類的兩種方式結合起來,以達到更靈活的效果。例如:
Mvn test -Dtest=TestA*,TestDemo1,TestDemo2
表示執行類名以 TestA 開頭的所有的測試類和 TestDemo1、TestDemo2 測試類。最後需要說明的是,如果 maven-surefire-plugin 根據 test 引數找不到任何匹配的測試類的話,會報測試失敗。例如:
Mvn test -Dtest
這樣的命令肯定找不到一個測試類,就會導致失敗。
包含和排除測試
Maven 提倡約定優於配置原則,所以使用者在寫測試程式碼的時候,應儘量按規範的模式給測試類起名字。但是有時候難免會出現一些不符合模式的測試類名,而這些測試類又需要執行。這裡可以通過如下方式,在 maven-surefire-plugin 中進行配置實現。
<plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-surefire-pluginartifactId> <version>2.16version> <configuration> <includes> <include>**/Demo*.javainclude> includes> configuration>plugin>
通過上面的配置,Surefire 外掛就會自動執行所有命名以 Demo 開頭的測試類。同樣地,可以通過 excludes 描述排除哪些測試類。例如:
<plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-surefire-pluginartifactId> <version>2.16version> <configuration> <excludes> <exclude>**/*abc.javaexclude> <exclude>**/Temp*.javaexclude> excludes> configuration>plugin>
表示不執行所有命名以 abc 結尾的測試類和以 Test 開頭的測試類。