使用maven進行測試(九)
maven本身並不是一個單元測試框架,java世界中主流的測試框架為junit和testng。maven所做的只是在構建執行到特定生命週期階段的時候,通過外掛來執行junit或者testng的測試用例。這一外掛就是maven-surefire=plugin,可以稱之為測試執行器,它能很好的相容junit3、junit4和testng。
maven的default生命週期test階段內建繫結上述外掛的test目標,外掛會執行特定目標下的符合命名格式的測試類,命名格式如下:
**/Test*.java:任何子目錄下所有命名以Test開頭的java類。
**/*Test.java:任何子目錄下所有命名以Test結尾的java類。
**/*TestCase.java:任何子目錄下所有命名以TestCase結尾的java類。
只有符合這些標準的測試類才會得以執行。
當然,如果有需要,可以自己定義要執行測試類的模式,另外上述外掛還支援更高階的testng測試集合xml檔案。
跳過測試執行
mvn package -DskipTests
長期跳過測試執行在pom中全域性設定外掛:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
跳過測試編譯和執行
mvn package -Dmaven.test.skip=true,這個引數控制了兩個外掛,跳過了測試的編譯和執行。
永久跳過,在pom中全域性配置外掛:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<sikp>true</sikp>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
動態指定要執行的測試用例:
mvn test -Dtest=abcTest 只執行這個abcTest測試類
mvn test -Dtest=abc*Test 星號可以匹配零個或者多個字元,表示執行以abc開頭Test結尾的所有測試類。
mvn test -Dtest=abcTest,defTest 只執行這兩個測試類。
mvn test -Dtest 如果只執行這個命令,外掛找不到測試類的情況下會導致構建失敗。
mvn test -Dtest -DfailIfNoTests=false 告訴外掛,即使沒有任何測試類也不要報錯。
遺憾的是,在命令列不能指定某個測試類做排除測試。
包含與排除測試用例:
**是指匹配任何路徑,*匹配除路徑分隔符外的0個或多個字元。
include元素指定要執行的測試用例,exclude指定要排除的測試用例。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/*Test.java</exclude>
</excludes>
</configuration>
</plugin>
測試報告的生成:maven-surefire-plugin生成測試報告
預設情況下,會在專案的target/surefite-reports目錄下生成兩種格式的錯誤報告:
1.簡單文字格式
2.與junit相容的xml格式,這個格式的報告可以用於三方工具的解析。
測試覆蓋率報告:cobertura-maven-plugin,生成在target/site/cobertura目錄下。
在pom.xml目錄下執行 mvn cobertura:cobertura
執行TestNG測試
testNG測試的普通用法和junit測試是一樣的,另外TestNG支援使用者使用一個testng.xml的檔案來配置想要執行的測試集合,testng.xml檔案放在根目錄下,檔案內容如:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suitename="Suite1"verbose="1">
<groups>
<run>
<includename="..."/><excludename="..."/></run>
</groups><testname="Regression1"> ...
</test>
</suite>另外,配置外掛cobertura-maven-plugin使用該testng.xml檔案
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
TestNG較junit的一大優勢是支援測試組的概念:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<groups>util1,util2</groups>
</configuration>
</plugin>
測試程式碼可以重用,我們可以把測試程式碼打包並部署到倉庫供其他專案使用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
當需要引用測試jar包的時候,座標的型別用:<type>test-jar</type>