首页 测试 工具 查看内容

追求代码质量: 使用 Selenium 和 TestNG 进行编程式测试

2014-8-5 23:26| 发布者: tianzc| 查看: 735| 评论: 0

摘要: Selenium 是一种测试框架,它使您可在 Web 应用程序上轻松地运行用户验收测试(user acceptance test)。本月,Andrew Glover 将向您展示如何以编程的方式运行 Selenium 测试,并使用 TestNG 作为测试驱动程序。在将 ...

清单 8. 测试集合的 DbUnit fixture
               
public class DatabaseFixture {

 @Parameters({"seed-path","db-driver","db-url","db-user","db-psswrd"})
 @BeforeTest
 public void seedDatabase(String seedpath, String driver,
   String url, String user, String pssword) throws Exception {

  IDatabaseConnection conn = this.getConnection(driver, url, user, pssword);
  IDataSet data = this.getDataSet(seedpath);

  try {
   DatabaseOperation.CLEAN_INSERT.execute(conn, data);
  }finally {
   conn.close();
  }
 }

 private IDataSet getDataSet(String path) throws IOException, DataSetException {
  return new FlatXmlDataSet(new File(path));
 }

 private IDatabaseConnection getConnection(String driver,
   String url, String user, String pssword ) throws ClassNotFoundException,
    SQLException {
  Class.forName(driver);
  Connection jdbcConnection =
    DriverManager.getConnection(url, user, pssword);
  return new DatabaseConnection(jdbcConnection);
 }
}
 


        要将实际的值与清单 8 中的参数相关联,我必须在 TestNG 的 testng.xml 文件中定义它们,如清单 9 所示:


清单 9. TestNG 的 testng.xml 文件中定义的特定于 DbUnit 的参数
               
 <parameter name="seed-path" value="test/conf/gt15-seed.xml"/>
 <parameter name="db-driver" value="org.hsqldb.jdbcDriver"/>
 <parameter name="db-url" value="jdbc:hsqldb:hsql://127.0.0.1"/>
 <parameter name="db-user" value="sa"/>
 <parameter name="db-psswrd" value=""/>
 


通用参数值

        现在我已经定义了一个灵活的 fixture,它将处理数据库状态和相应测试。现在可以准备使用 TestNG 将所有内容连接起来。通常,第一步是了解希望实现的内容。在本例中,我想完成以下任务:

        我希望在运行任何逻辑测试集合前,DbUnit fixture 能够完成自己任务。
        我希望将相同的测试集合运行两次:一次用于 Firefox,一次用于 Internet Explorer。
        TestNG 的 parameter 元素的作用域是局部的,这对我来说是件好事。这样,我可以很容易地在 TestNG 配置文件中定义通用参数值,并且当需要时在 TestNG 的 test 组元素中重写它们。

        比如,要运行两组测试,简单创建两个 test 元素。我可以通过 TestNG 的 package 元素将我的 fixture 和相关测试包括进来,package 元素能够使包结构中所有测试(或 fixture)的查找变得简单。接着,我可以在两个定义了的 test 组中将 Firefox 和 Internet Explorer 的 brwsr-path 参数关联起来。所有这些都显示在了 testng.xml 文件中,如清单 10 所示:


清单 10. 使 DbUnit 运行的灵活的 testng.xml 文件
               
<suite name="User Acceptance Tests" verbose="1" >
 
 <!-- required for DbUnit fixture   -->
 <parameter name="seed-path" value="test/conf/gt15-seed.xml"/>
 <parameter name="db-driver" value="org.hsqldb.jdbcDriver"/>
 <parameter name="db-url" value="jdbc:hsqldb:hsql://127.0.0.1"/>
 <parameter name="db-user" value="sa"/>
 <parameter name="db-psswrd" value=""/>
 
 <!-- required for Selenium fixture -->
 <parameter name="selen-svr-addr" value="localhost"/>
 <parameter name="aut-addr" value="http://localhost:8080/gt15/"/>  

 <test name="GT15 CRUDs- Firefox" >
 
  <parameter name="brwsr-path" value="*firefox"/>

  <packages>
   <package name="test.com.acme.gt15.Web.selenium" />
   <package name="test.com.acme.gt15.Web.selenium.fixtures" />
  </packages>
 </test>

 <test name="GT15 CRUDs- IE" >
 
  <parameter name="brwsr-path" value="*iexplore"/>

  <packages>
   <package name="test.com.acme.gt15.Web.selenium" />
   <package name="test.com.acme.gt15.Web.selenium.fixtures" />
  </packages>
 </test>
</suite>
 


        我很高兴地宣布,我已经完成了创建一套可重复验收测试所需的所有事情。剩下的工具就是处理 Web 应用程序容器本身。幸运地是,我可以使用 Cargo 来完成。

Cargo 执行加载

        Cargo 是一个创新的以通用方式自动化容器管理的开源项目,比如,用于将 WAR 文件部署到 JBoss 的相同 API 还可以启动和停止 Tomcat。Cargo 还可以自动下载并安装容器 —— Cargo API 的用途很广泛,从 Java 代码到 Ant 任务,甚至是 Maven。

        诸如 Cargo 这样的工具将处理编写逻辑重复测试用例所面对的一个大的挑战,它避免一种潜在的假设,即运行 的容器具有最新最好的应用程序代码。此外,还可以构造一个利用 Cargo 的能力自动完成以下任务的编译过程(例如在 Ant 内):

下载所需的容器。
安装该容器。
启动容器。
将选择的 WAR 或 EAR 文件部署到容器上。
稍后,您还可以使 Cargo 停止所选的容器。(并且,不需要对下载和安装容器发出警告,或者,如果本地机器中已经存在了正确的版本,Cargo 将跳过步骤 1 和 2。)

        我希望使用 Cargo 来确保启动并运行最新和最好的 Web 应用程序。并且,我不需要考虑在哪里部署 WAR 文件,或者必须确保正在使用的是最新的 WAR 文件。我真正想达到的目的是使用户验收测试实现无事件 —— 我仅需要发出一个 命令,然后坐下来等待结果。甚至可以更好,在一个 CI 环境中,我不用等待;当测试完成后我将获得一个通知!

测试容器管理

        要在 Ant 内设置 Cargo,我需要定义一个任务,它将下载特定版本的 Tomcat 并将其安装到本地机器上的临时目录。接下来,将最新版本的代码部署到 Tomcat 上,如清单 11 所示:


清单 11. 设置 Cargo 的任务
               
<target name="ua-test" depends="compile-tests,war">

 <taskdef resource="cargo.tasks">
  <classpath>
  <pathelement location="${libdir}/${cargo-jar}" />
  <pathelement location="${libdir}/${cargo-ant-jar}" />
  </classpath>
 </taskdef>
 
 <cargo containerId="tomcat5x" action="start" wait="false" id="${tomcat-refid}">
  <zipurlinstaller installurl="${tomcat-installer-url}" />
  <configuration type="standalone" home="${tomcatdir}">
   <property name="cargo.remote.username" value="admin" />
   <property name="cargo.remote.password" value="" />
   <deployable type="war" file="${wardir}/${warfile}" />
  </configuration>
 </cargo>

 <antcall target="_start-selenium" />

 <cargo containerId="tomcat5x" action="stop" refid="${tomcat-refid}" />
</target>
 


        清单 11 中的 target 使用 antcall 调用另一个 target。实际上,清单 11 中最后的 cargo 任务封装了 _start-selenium target,并且确保运行测试后停止 Tomcat。

        在清单 12 中定义的 _start-selenium target 中,我需要启动(并稍后停止)Selenium 服务器。在此过程中,我的测试还将连接到其 Selenium fixture 中的服务器实例。请注意:该 target 是如何引用另一个 target ——


清单 12. 启动和停止 Selenium 服务器
               
<target name="_start-selenium">
 <java jar="${libdir}/${selenium-srvr-jar}" fork="true" spawn="true" />
 <antcall target="_run-ua-tests" />
 <get dest="${testreportdir}/results.txt"
        src="${selenium-srvr-loc}/selenium-server/driver/?cmd=shutDown" />
</target>
 


        最后,该组中最后的 target 将通过 TestNG 实际运行我的编程式 Selenium 测试。注意,我是如何通过使用清单 13 中的 _run-ua-tests target 的 xmlfileset 元素,使 TestNG 使用我的 testng.xml 文件。


清单 13. 运行 TestNG testng.xml 文件中的测试
<target name="_run-ua-tests">
 <taskdef classpathref="build.classpath" resource="testngtasks" />
 <testng outputDir="${testreportdir}"
         classpath="${testclassesdir};${classesdir}" haltonfailure="true">
  <xmlfileset dir="./test/conf" includes="testng.xml" />
  <classpath>
   <path refid="build.classpath" />
  </classpath>
 </testng>
</target>
 
结束语

        正如您看到的一样,Selenium 极大地简化了用户验收测试,尤其当使用 TestNG 驱动的时候。虽然编程式测试并不适用于所有人(非开发人员可能更喜欢 Selenium 的 Fit 样式的表),它确实让您了解到了 TestNG 非凡的灵活性。编程式测试还允许您使用 DbUnit 和 Cargo 构建自己的测试框架,从而确保测试的逻辑可重复性。

        开源 Web 测试框架的发展绝不会停止,这对于追求代码质量的完美主义者是个好消息。Selenium 是驱动浏览器的开源 Web 测试框架中新出现的工具之一,它能够使用户验收测试自动化 —— 因此,它非常优秀。结合使用 Selenium 和 TestNG,正如我在本文中演示的一样,您将获得一个非常好的测试驱动,并从依赖性测试以及参数测试中获得巨大的优势。尝试使用 Selenium 和 TestNG 吧,您的用户将为此感谢您。 
 

123

鲜花

握手

雷人

路过

鸡蛋

扫一扫关注最新动态

毒镜头:老镜头、摄影器材资料库、老镜头样片、摄影
爱评测 aipingce.com  
返回顶部