1.maven-surefire-plugin簡介
轉載:https://leokongwq.github.io/2016/10/12/maven-test.html
Maven本身並不是一個單元測試框架,它只是在構建執行到特定生命週期階段的時候,通過插件來執行JUnit或者TestNG的測試用例。這個插件就是maven-surefire-plugin
,也可以稱爲測試運行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。
在默認情況下,maven-surefire-plugin的test
目標會自動執行測試源碼路徑(默認爲src/test/java/
)下所有符合一組命名模式的測試類。這組模式爲:
**/Test*.java:任何子目錄下所有命名以Test開關的Java類。
**/*Test.java:任何子目錄下所有命名以Test結尾的Java類。
**/*TestCase.java:任何子目錄下所有命名以TestCase結尾的Java類。
2.跳過測試
要想跳過測試,在命令行加入參數skipTests就可以了。如:
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中配置maven.test.skip:
<plugin>
<groupId>org.apache.maven.plugin</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
3.動態指定要運行的測試用例
maven-surefire-plugin
提供了一個test
參數讓Maven用戶能夠在命令行指定要運行的測試用例。如:
mvn test -Dtest=RandomGeneratorTest
也可以使用通配符:
mvn test -Dtest=Random*Test
或者也可以使用“,”
號指定多個測試類:
mvn test -Dtest=Random*Test,AccountCaptchaServiceTest
如果沒有指定測試類,那麼會報錯並導致構建失敗。
mvn test -Dtest
這時候可以添加-DfailIfNoTests=false
參數告訴maven-surefire-plugin
即使沒有任何測試也不要報錯。
mvn test -Dtest -DfailIfNoTests=false
由此可見,命令行參數-Dtest -DfailIfNoTests=false
是另外一種路過測試的方法
4.包含與排除測試用例
如果由於歷史原因,測試類不符合默認的三種命名模式,可以通過pom.xml
設置maven-surefire-plugin
插件添加命名模式或排除一些命名模式。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<includes>
<include>**/*Tests.java</include>
</includes>
<excludes>
<exclude>**/*ServiceTest.java</exclude>
<exclude>**/TempDaoTest.java</exclude>
</excludes>
</configuration>
</plugin>
5.生成測試報告
5.1 基本測試報告
默認情況下,maven-surefire-plugin
會在項目的target/surefire-reports
目錄下生成兩種格式的錯誤報告。
簡單文本格式——內容十分簡單,可以看出哪個測試項出錯。
與JUnit兼容的XML格式——XML格式已經成爲了Java單元測試報告的事實標準,這個文件可以用其他的工具如IDE來查看。
5.2 測試覆蓋率報告
測試覆蓋率是衡量項目代碼質量的一個重要的參考指標。Cobertura
是一個優秀的開源測試覆蓋率統計工具(詳見http://cobertura.sourceforge.net/),Maven通過cobertura-maven-plugin
與之集成,用戶可以使用簡單的命令爲Maven項目生成測試覆蓋率報告。運行下面命令生成報告:
mvn cobertura:cobertura
6.運行TestNG測試
TestNG是Java社區中除了JUnit之外另一個流行的單元測試框架。TestNG在JUnit的基礎上增加了很多特性,其站點是http://testng.org/ .添加TestNG依賴:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.9</version>
<scope>test</scope>
<classifier>jdk15</classifier>
</dependency>
下面是JUnit和TestNG的常用類庫對應關係
RandomGeneratorTest
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1" verbose="1">
<test name="Regression1">
<classes>
<class name="com.juvenxu.mvnbook.account.captcha.RandomGeneratorTest" />
</classes>
</test>
</suite>
同時再配置maven-surefire-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的一大優勢在於它支持測試組的概念。如可以在方法級別聲明測試組:
@Test(groups={"util","medium"})
然後可以在pom中配置運行一個或多個測試組:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<groups>util,medium</groups>
</configuration>
</plugin>
7.重用測試代碼
當命令行運行mvn package的時候,Maven只會打包主代碼及資源文件,並不會對測試代碼打包。如果測試代碼中有需要重用的代碼,這時候就需要對測試代碼打包了。
這時候需要配置maven-jar-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>
maven-jar-plugin有兩個目標,分別爲jar和test-jar。這兩個目標都默認綁定到default生命週期的package階段運行,只是test-jar並沒有在超級POM中配置,因此需要我們另外在pom中配置。
現在如要引用test-jar生成的測試代碼包,可以如下配置:
<dependency>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-captcha</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>