Maven實戰讀書筆記(10)

account-captchaPOM配置java

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"spring

       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">apache

       <modelVersion>4.0.0</modelVersion>框架

       <parent>dom

              <groupId>com.juvenxu.mvnbook.account</groupId>maven

              <artifactId>account-parent</artifactId>工具

              <version>1.0.0-SNAPSHOT</version>單元測試

       </parent>測試

 

       <artifactId>account-captcha</artifactId>優化

       <name>Account Captcha</name>

 

       <properties>

              <kaptcha.version>2.3</kaptcha.version>

       </properties>

 

       <dependencies>

              <dependency>

                     <groupId>com.google.code.kaptcha</groupId>

                     <artifactId>kaptcha</artifactId>

                     <version>${kaptcha.version}</version>

                     <classifier>jdk15</classifier>

              </dependency>

              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-core</artifactId>

              </dependency>

              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-beans</artifactId>

              </dependency>

              <dependency>

                     <groupId>org.springframework</groupId>

                     <artifactId>spring-context</artifactId>

              </dependency>

              <dependency>

                     <groupId>junit</groupId>

                     <artifactId>junit</artifactId>

              </dependency>

       </dependencies>

 

       <repositories>

              <repository>

                     <id>sonatype-forge</id>

                     <name>Sonatype Forge</name>

                     <url>http://repository.sonatype.org/content/groups/forge/</url>

                     <releases>

                            <enabled>true</enabled>

                     </releases>

                     <snapshots>

                            <enabled>false</enabled>

                     </snapshots>

              </repository>

       </repositories>

</project>

對上面的配置進行解釋:

1Kaptcha是一個用來生成驗證碼 (Captcha) 的開源類庫,其主頁:http://code.google.com/p/kaptcha

2Kaptcha依賴還有一個classifier元素,其值爲jdk5Kaptcha針對1.51.4提供了不一樣的分發包

3POM的最後聲明瞭Sonatype Forge這一公共倉庫,這是由於Kaptcha並無上傳到中央倉庫,咱們能夠從Sonatype Forge倉庫,或者直接將Kaptcha上傳到本身的倉庫中

4、若是配置了nexus,而且配置了鏡像,配置這個倉庫就不會起做用了,須要下載該包而後上傳到nexux上去

 

maven-surefire-plugin簡介

1Maven自己並非一個單元測試框架

2Java世界中主流的單元測試框架爲JUnit(http://www.junit.org/)TestNG(http://testng.org/)

3Maven所作的只是在構建執行到特定生命週期階段的時候,經過插件來執行JUnit或者TestNG的測試用例

4、可稱maven-surefire-plugin爲測試運行器(Test Runner)

5、這個插件能夠很好地兼容JUnit3JUnit4以及TestNG

 

default生命週期的test階段

這個test階段被定義爲 "使用單元測試框架運行測試"

咱們知道,生命週期階段須要綁定到某個插件的目標才能真正的工做

test階段正式與maven-surefire-plugintest目標相綁定了,這是一個內置的綁定

 

maven-surefire-plugintest目標

在默認狀況下,maven-surefire-plugintest目標會自動執行測試源碼路徑(默認爲src/test/java/)下全部符合一組命名模式的測試類,這組模式爲:

n         **/Test*.java:任何子目錄下全部命名以Test開頭的Java

n         **/*Test.java:任何子目錄下全部命名以Test結尾的Java

n         **/*TestCase.java:任何子目錄下全部命名以TestCase結尾的Java

只要將測試類按上述模式命名,Maven就能自動運行它們,用戶也就再也不須要定義測試幾何(TestSuite)來聚合測試用例 TestCase 關於模式須要注意的是,以Tests結尾的測試類是不會得以自動執行的

 

有時候須要跳過測試

1、我敢保證此次改動不會致使任何測試失敗

2、測試運行太耗時了,暫時跳過一下

3、有持續集成服務跑全部測試呢,我本地就不執行啦

在大部分狀況下,這些想法都是不對的,任何改動都要交給測試去驗證,測試運行耗時過長應該考慮優化測試,更不要徹底依賴持續集成服務來報告錯誤,測試錯誤應該儘早在盡小範圍內發現,並及時修復

 

經過命令行方式跳過測試

mvn package -DskipTests

 

POM中配置maven-surfire-plugin插件的屬性,來跳過測試(不推薦)

<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

參數maven.test.skip同時控制了maven-compiler-pluginmaven-surefire-plugin兩個插件的行爲,測試代碼編譯跳過了,測試運行也跳過了

 

經過POM配置,即跳過測試代碼的編譯又跳過測試運行(不推薦)

<plugin>

       <groupId>org.apache.maven.plugins</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>

實際上maven-compiler-plugintestCompile目標和maven-surefire-plugintest目標都提供了一個參數skip用來跳過測試編譯和測試運行,而這個參數對應的命令行表達式爲maven.test.skip

 

反覆運行單個測試用例是平常開發中很常見的行爲

例如,項目代碼中有一個失敗的測試用例,開發人員就會想要再次運行這個測試以得到詳細的錯誤報告,在修復該測試的過程當中,開發人員也會反覆運行它,已確認修復代碼是正確的。若是僅僅爲了一個失敗的測試用例而反覆運行全部測試,未免太浪費時間了,當項目中測試的數目比較大的時候,這種浪費尤其明顯

 

maven-surefire-plugin提供了一個test參數

這個參數讓Maven用戶可以在命令行指定要運行的測試用例

例如,若是隻想運行account-captchaRandomGeneratorTest,就可使用以下命令:

mvn test -Dtest=RandomGeneratorTest

 

使用通配符*

mvn test -Dtest=Random*Test

星號能夠匹配零個或多個字符,上述命令會運行項目中全部類名以Random開頭、Test結尾的測試類

 

使用逗號指定多個測試用例

mvn test -Dtest=RandomGeneratorTest,AccountCaptchaServiceTest

 

test參數的值必須匹配一個或多個測試類

mvn test -Dtest

maven-surefire-plugin找不到任何匹配的測試類,就會報錯並致使構建失敗

 

使用-DfailIfNoTests=false配置

mvn test -Dtest -DfailIfNoTests=false

告知maven-surefire-plugin即便沒有任何測試也不要報錯,這也是另外一種跳過測試的方法

 

從上面能夠看到,test參數用戶能夠從命令行靈活地指定要運行的測試類,惋惜的是maven-surefire-plugin並無提供任何參數支持用戶從命令行跳過指定的測試類,好在用戶能夠經過POM中配置maven-surefire-plugin排除特定的測試類

 

自動運行以Tests結尾的測試類

<plugin>

       <groupId>org.apache.maven.plugins</groupId>

       <artifactId>maven-surefire-plugin</artifactId>

       <version>2.5</version>

       <configuration>

              <include>**/*Tests.java</include>

       </configuration>

</plugin>

 

排除運行測試類

<plugin>

       <groupId>org.apache.maven.plugins</groupId>

       <artifactId>maven-surefire-plugin</artifactId>

       <version>2.5</version>

       <configuration>

              <excludes>

                     <exclude>**/*ServiceTest.java</exclude>

                     <exclude>**/TempDaoTest.java</exclude>

              </excludes>

       </configuration>

</plugin>

 

測試報告

除了基本的命令行輸出,Maven用戶可使用maven-surefire-plugin等插件以文件的形式生成更豐富的測試報告

 

基本的測試報告

默認狀況下,maven-surefire-plugin會在項目的target/surefire-reports目錄下生成兩種格式的錯誤報告:

1、簡單文本格式

2JUnit兼容的XML格式

 

測試覆蓋率報告

測試覆蓋率是衡量項目代碼質量的一個重要的參考指標。Cobertura是一個優秀的開源測試覆蓋率統計工具 (詳見http://cobertura.sourceforge.net/)Maven經過cobertura-maven-plugin與之集成,用戶可使用簡單的命令爲Maven項目生成測試覆蓋率報告

例如能夠在account-captcha目錄下運行以下命令生成報告:

mvn cobertura:cobertura

接着會在target/site/cobertura/下生成一個index.xml文件,能夠經過它查看測試覆蓋率報告

 

重用測試代碼

默認的打包行爲是不會包含測試代碼的,所以在使用外部依賴的時候,其構件通常都不會包含測試代碼

而後,在項目內部重用某個模塊的測試帶是很常見的需求,可能某個底層模塊的測試代碼中包含了一些經常使用的測試工具類,或者一些高質量的測試基類供繼承。這個時候Maven用戶就須要經過配置maven-jar-plugin將測試類打包

 

打包測試代碼

<plugin>

       <groupId>org.apache.maven.plugins</groupId>

       <artifactId>maven-jar-plugin</artifactId>

       <version>2.2</version>

       <executions>

              <execution>

                     <golas>

                            <goal>test-jar</goal>

                     </goals>

              <execution>

       </executions>

</plugin>

 

maven-jar-plugin有兩個目標,分別是jartest-jar

1jar目標是經過Maven的內置綁定在default生命週期的package階段運行,其行爲就是對項目主代碼進行打包

2、而test-jar並無內置綁定,所以上述的插件配置顯式聲明該目標來打包測試代碼

3test-jar的默認綁定聲明週期階段爲package

 

如何依賴測試包構件

<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>

相關文章
相關標籤/搜索