近期在appfuse看到使用webtest-maven-plugin實現Web應用的集成測試,研究了下。感受很不錯。對於Web應用本身主動構建頗有幫助,在性能測試以前可以保證Web應用的基本功能工做正常,分享給你們。html
它是基於Ant來執行的Web頁面的測試工具。java
經過執行不一樣的target,測試頁面上面提供的所有功能。它的工做原理是運用比較出名的HtmlUnit來實現對一個頁面功能的測試。jquery
它的工做流程就是模擬一個瀏覽器的事件(頁面提供的功能:可以調用一個Url,可以點擊一個button,label等,可以爲頁面上的元素賦值),而後經過抓取返回的頁面上的Title或者是element的值來校驗是否返回預期的結果。web
在Web應用的pom.xml中引入webtest-maven-plugin,定義集成測試階段運行測試,驗證階段運行結果驗證,系統集成測試以後生成報告。spring
同一時候指定Web應用的地址,測試用例所在文件,生成文件所在路徑,日誌級別以及遇到錯誤的時候採取的策略。這樣在Maven構建階段就會本身主動運行WebTest的測試用例。apache
詳細配置例如如下:api
在build節點增長webtest插件 (插件詳細參數參考)<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>webtest-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <id>webtest-test</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> </execution> <execution> <id>webtest-verify</id> <phase>verify</phase> <goals> <goal>verify-result</goal> </goals> </execution> <execution> <id>webtest-report-html</id> <phase>post-integration-test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> <configuration> <host>${project.cargo.host}</host> <port>${project.cargo.port}</port> <sourcedirectory>src/test/resources</sourcedirectory> <sourcefile>web-tests.xml</sourcefile> <target>${project.webtest.target}</target> <basepath>${project.build.finalName}</basepath> <resultpath>target/webtest/webtest-results</resultpath> <resultpath>target/webtest/webtest-results</resultpath> <haltonfailure>false</haltonfailure> <haltonerror>false</haltonerror> <pre name="code" class="html"> <autorefresh>true</autofresh> <loglevel>fatal</loglevel> </configuration> </plugin>
?由於通常的測試都離不開這個Login界面,因此把Login的target抽出了,還有鏈接server的配置config任務也可以抽出來放成兩個 單獨的文件了。login.xmlf:登錄頁面詳細操做xml version="1.0" encoding="UTF-8"?瀏覽器
> <!-- 導入 config & login xmlf --> <!DOCTYPE project [ <!ENTITY config SYSTEM "./config.xmlf"> <!ENTITY login SYSTEM "./login.xmlf"> ]> <!-- 定義默認跑的target --> <project basedir="." default="run-all-tests"> <!-- 在ant中引入webtest標籤 --> <taskdef resource="webtestTaskdefs.properties" /> <!-- web系統很是多都是多語言的。作頁面驗證的時候也需要多語言支持, 第二個找不到其它語言時候的默認語言 --> <property file="../../../target/classes/ApplicationResources_${user.language}.properties"/> <property file="../../../target/classes/ApplicationResources.properties"/> <!-- 定義 runs all targets。依賴系統中各個功能模塊,登錄。登出。用戶操做--> <target name="run-all-tests" depends="Login,Logout,UserTests" description="Call and executes all test cases (targets)"/> <!-- 定義runs user-related tests,RUD,系統不存在用戶Create功能 --> <target name="UserTests" depends="EditUser,SearchUser,SaveUser" description="Call and executes all user test cases (targets)"> <echo>Successfully ran all User UI tests!</echo> </target> <!-- 登錄測試,Login to the application --> <target name="Login" description="Runs login test and verifies Home's Title"> <!-- 定義登錄測試的webtest詳細內容 --> <webtest name="login"> <!-- 先運行webtest配置 --> &config; <!-- 詳細測試步驟,來自login.xml --> <steps> &login; </steps> </webtest> </target> <!-- Logout of the application --> <target name="Logout" description="Runs logout test and verifies Login's Title"> <webtest name="logout"> &config; <steps> &login; <invoke description="get Logout Page" url="/j_security_logout"/> <verifytitle description="we should see the login title" text=".*${<span style="font-size:14px;">login.service</span>}.*" regex="true"/> </steps> </webtest> </target> <!-- Verify the edit user screen displays without errors --> <target name="EditUser" description="Tests selecting the 'Edit Profile' forward"> <webtest name="editUser"> &config; <steps> &login; <invoke description="click Edit Profile button" url="/userInfo/save.action"/> <verifytitle description="we should see the user profile title" text=".*${userProfile.title}.*" regex="true"/> </steps> </webtest> </target> </project>oracle
<invoke description="get Login Page" url="/"/> <verifytitle description="we should see the login title" text=".*${system}.*" regex="true"/> <setinputfield description="set user name" name="j_username" value="admin"/> <setinputfield description="set password" name="j_password" value="password"/> <clickbutton label="${login.submit}" description="Click the submit button"/> <verifytext description="Home Page follows if login ok" text=".*${welcome}.*" regex="true"/>config.xmlf:webtest的配置,使用webtest-maven-plugin中configuration值作爲輸入參數一部分
<config host="${host}" port="${port}" protocol="http" basepath="${basepath}" resultpath="${resultpath}" saveresponse="true" resultfile="web-tests-result.xml" haltonfailure="${haltonfailure}" haltonerror="${haltonerror}" autorefresh="${autorefresh}"> <header name="Accept-Language" value="${user.language}"/> <option name="ThrowExceptionOnScriptError" value="true"/> </config>
。詳細複雜配置語法參考java reg官方文檔
java.util.regex.PatternSyntaxException: Illegal repetition near index 2
.*${login.title}.*
3. 最開始沒有把autorefresh打開,結果login page spring security3默認是回給client一個自刷新頁面,致使測試失敗
下篇:Maven實現Web應用集成測試本身主動化 -- 部署本身主動化(Cargo Maven Plugin)
app