使用实现Web应用集成功能性测试 -- WebTest & Maven
最近在appfuse看到使用webtest-maven-plugin实现Web应用的集成测试,研究了下,感觉非常不错,对于Web应用自动构建非常有帮助,在性能测试之前可以保证Web应用的基本功能工作正常,分享给大家。
WetTest工作原理
它是基于Ant来运行的Web页面的测试工具。通过运行不同的target,测试页面上面提供的所有功能。它的工作原理是运用比较出名的HtmlUnit来实现对一个页面功能的测试。它的工作流程就是模拟一个浏览器的事件(页面提供的功能:可以调用一个Url,可以点击一个button,label等,可以为页面上的元素赋值),然后通过抓取返回的页面上的Title或者是element的值来校验是否返回预期的结果。
WetTest与Maven的集成配置
Maven的配置
在Web应用的pom.xml中引入webtest-maven-plugin,定义集成测试阶段执行测试,验证阶段执行结果验证,系统集成测试之后生成报告。同时指定Web应用的地址,测试用例所在文件,生成文件所在路径,日志级别以及遇到错误的时候采取的策略。这样在Maven构建阶段就会自动执行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> <loglevel>fatal</loglevel> </configuration> </plugin>
WebTest用例文件(Web-tests.xml)配置
?xml version="1.0" encoding="UTF-8"?> <pre name="code" class="html"><!-- 导入 config & login xmlf --><!DOCTYPE project [ <!ENTITY config SYSTEM "./config.xmlf"> <!ENTITY login SYSTEM "./login.xmlf">]>
<pre name="code" class="html"><!-- 定义默认跑的target --><project basedir="." default="run-all-tests">
<!-- 在ant中引入webtest标签 --><taskdef resource="webtestTaskdefs.properties" /> <!-- 引入正则表达式: allows to build a message string with parameter replacement: "User {0} successfully created" --> <taskdef resource="net/sf/antcontrib/antcontrib.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">
<pre name="code" class="html"> <!-- 先执行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=".*${system}.*" 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"/> <verifytitle description="we should see the user profile title" text=".*${userProfile.title}.*" regex="true"/> </steps> </webtest> </target></project> 由于一般的测试都离不开这个Login界面,所以把Login的target抽出了,还有连接服务器的配置config任务也可以抽出来放成两个 单独的文件了。
login.xmlf:登陆页面具体操作
<span style="color:#3333FF;"><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"/> <verifytitle description="Home Page follows if login ok" text=".*${welcome}.*" regex="true"/></span>config.xmlf:webtest的配置,使用webtest-maven-plugin中configuration值做为输入参数一部分
<span style="color:#3333FF;"><config host="${host}" port="${port}" protocol="http" basepath="${basepath}" resultpath="${resultpath}" saveresponse="true" resultfile="web-tests-result.xml" haltonfailure="${haltonfailure}" haltonerror="${haltonerror}" summary="true"> <header name="Accept-Language" value="${user.language}"/> <option name="ThrowExceptionOnScriptError" value="true"/> </config></span>
附:Webtest Maven Plugin链接
WebTest的官方链接网址
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。