Dagger(中文含义为“匕首”)是基于Selenium2和TestNG的一个轻量级开源框架,主要对各种web操作进行了封装,并使用TestNG作为测试框架。为实现web端的UI自动化,本文将整理基于Dagger框架的自动化测试平台搭建过程。
本文Dagger方面的内容,主要参考了陈侃同学的代码和文档,其他内容参考了一些技术博客,接下来会在文中标明。在此感谢各位大神们的分享~
学习web端UI自动化的初衷,是希望改变手动执行web端的测试用例的现状。特别在产品版本趋于稳定时,后期迭代中需要进行大量的回归测试,这时候仍然使用人工的方式来测试效率会比较低。如果希望将web端的一些用例变成可自动执行的代码,那么Dagger(Selenium+TestNG)+Ant+Jenkins会是一个不错的选择。
首先简单描述一下这几个框架之间的关系:
(1)Selenium实现了对web端各种操作的模拟,如打开页面、点击按钮、输入文本等,使用Selenium我们就可以用代码来模拟浏览器的各种操作;
(2)TestNG提供了一个测试框架,它将用例包裹在测试框架中,规定了测试过程并生成测试结果,使用Selenium+TestNG使得我们能够完成最初步的自动化测试(需要手动在本地执行);
(3)Dagger就是对Selenium+TestNG进行了进一步的封装,使得它们更简洁易用;
(4)Ant是一个基于Java的构建工具,使用Dagger+Ant我们可以自动编译并执行用例,而不需要手动执行,这为在远程测试机上执行用例提供了基础;
(5)Jenkins是基于Java的持续集成工具,它为自动化测试提供了一个管理平台,使用Dagger+Ant+Jenkins,我们可以有效地管理测试源码、测试执行、测试结果等。至此,我们将得到一个简单但完整的自动化测试平台。
接下来整理在Windows系统下的具体搭建过程(具体原理性知识这里不多作介绍):
准备工作:正确安装JDK(1.6及以上版本)、Eclipse/MyEclipse,本文中使用的版本是JDK1.8和MyEclipse8.5。
下文中提到的资源都可以在这里找到。
(一)Dagger(Selenium)
1. 下载Dagger源码:https://github.com/NetEase/Dagger
这里对源码进行几点说明:
(1)/com.netease.dagger/BrowserEmulator.java:Dagger浏览器操作的API,封装了Selenium的部分方法
(2)/com.netease.dagger/GlobalSetting.java:全局设置,包括浏览器类型、浏览器驱动、timout时间等等
(3)/com.netease.demo:一些用例demo,包括直接运行的、使用testNG运行的
(4)/com.netease.test:API的使用demo
(5)/res:浏览器驱动文件
(6)/sreenshot:执行失败的浏览器截图
(7)/test-xml:用例文件
(8)/test-output:测试输出,如测试报告等
(9)prop.properties:配置文件
2. 将Dagger源码导入MyEclipse。此时会发现代码存在错误,这是因为还没有导入必要的jar包,其中就包括Selenium的jar包。
3. 下载相关jar包,拷贝到Dagger/libs目录下并build path
(1)Selenium相关jar包:在Selenium官网下载Selenium Standalone Server和Selenium Client&WebDriver的java版本。本文中使用的版本是selenium-server-standalone-2.18.0.jar(注意这里不使用最新版本的jar包)、selenium-java-2.46.0。
(2)其他jar包:apache-logging-log4j.jar(用于日志)、jxl.jar(用于Excel)
4. 下载浏览器驱动:由于Dagger默认使用Chrome浏览器,下载chromedriver_for_win.exe并拷贝到Dagger/res目录下
5. 运行com.netease.demo包中的GoogleSearch.java,至此已经可以用代码实现浏览器操作啦~
下面是GoogleSearch.java的代码:
01 | package com.netease.demo; |
03 | import com.netease.dagger.BrowserEmulator; |
06 | * The demo to show Dagger's basic usage |
09 | public class GoogleSearch { |
11 | public static void main(String[] args) { |
14 | String searchBox = "//input[@name='q']" ; |
15 | String searchBtn = "//input[@name='btnK']" ; |
16 | BrowserEmulator be = new BrowserEmulator(); |
19 | be.type(searchBox, "github" ); |
6. 下载并安装TestNG
在线安装参考:http://www.cnblogs.com/puresoul/archive/2013/12/20/3483092.html
离线安装参考:http://www.dataguru.cn/thread-472787-1-1.html
7. 使用TestNG运行com.netease.demo包中的TestNg.java
使用TestNG可以让我们:(1)控制测试流程,规定测试前、测试中、测试后要做的事情;(2)同一个case可以使用不同的参数多次执行;(3)统一管理测试数据,将测试数据与测试过程分离(使用DataProvider);(4)规定测试用例之间的依赖关系;(5)进行批量测试(执行xml文件);(6)自动生成简单的测试报告;(7)其他
下面是一个TestNg.java是TestNG的最简单例子:
73 | @DataProvider (name = "data" ) |
74 | public Object[][] data() { |
75 | return new Object[][] { |
76 | { "java" , "www.java.com" }, |
除了直接运行这个java文件,我们还可以使用xml文件批量执行用例,如/test-xml/demo.xml。执行下面这个xml文件将一次执行TestNg和TestNgClone这两个用例,其中每个<test>标签定义一个用例。
01 | <suite reruntimes= "2" thread-count= "10" parallel= "tests" verbose= "10" name= "demo" annotations= "JDK" time-out= "1800000" > |
03 | <test name= "TestNg" junit= "false" annotations= "JDK" > |
05 | < class name= "com.netease.demo.TestNg" /> |
09 | <test name= "TestNgClone" junit= "false" annotations= "JDK" > |
11 | < class name= "com.netease.demo.TestNgClone" /> |
执行后我们就能会得到类似这样的测试结果:
===============================================
demo
Total tests run: 4, Failures: 0, Skips: 0
===============================================
打开/test-output/index.html可以看到简单的测试报告。
【Note】
Selenium还包含很多内容,包括Selenium IDE、Selenium Romate Control、Selenium Core等等,本文只关注Dagger中封装的相关的内容。Dagger也包含很多内容,本文只关注最基本的API使用。TestNG的报告还可以进行美化,使用TestNG-xslt可以做到。编写测试代码不仅涉及到Dagger的API、TestNG的框架,还需要学习XPath(用来进行网页元素定位)等知识。
【Problem】
(1)ImageContrast.java中import出错
1 | import com.sun.image.codec.jpeg.JPEGCodec; |
2 | import com.sun.image.codec.jpeg.JPEGImageEncoder; |
解决:com.sun.*, sun.* 开头的包都是 JRE 的底层类库,Eclipse默认把这些受访问限制的API设成了ERROR。只要把Windows-Preferences-Java-Complicer-Errors/Warnings里面的Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过。
(2)打印Log出错
1 | log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies). |
2 | log4j:WARN Please initialize the log4j system properly. |
解决:在BrowserEmulator.java的构造方法中添加Log配置语句:
1 | PropertyConfigurator.configure( "[workspace]/Dagger//src/log4j.properties" );//加载.properties文件 |
(二)Dagger+Ant
1. 下载并安装Ant
(2)配置Ant环境变量,在PATH中添加“[Ant目录]/bin;”
2. 编写Ant构建文件build.xml
在Dagger项目的根目录下新建build.xml(注意一定要在根目录下),下面是一个build.xml的例子,其中定义了classpath、清理、编译、运行等过程:
01 | <?xml version= "1.0" encoding= "UTF-8" ?> |
02 | <project name= "Demo" default = "run" basedir= "." > |
03 | <echo message= "import libs" /> |
04 | <path id= "run.classpath" > |
05 | <fileset dir= "${basedir}"</code><code class="plain">></code></td></tr></tbody></table></div><div class="line alt2"><table><tbody><tr><td class="number"><code>06</code></td><td class="content"><code class="spaces"> </code><code class="plain"><include name=</code><code class="string">"libs/testng-6.8.5.jar"</code> <code class="plain">/></code></td></tr></tbody></table></div><div class="line alt1"><table><tbody><tr><td class="number"><code>07</code></td><td class="content"><code class="spaces"> </code><code class="plain"></fileset></code></td></tr></tbody></table></div><div class="line alt2"><table><tbody><tr><td class="number"><code>08</code></td><td class="content"><code class="spaces"> </code><code class="plain"><fileset dir=</code><code class="string">"${basedir}/libs" > |
09 | <include name= "selenium-java-2.46.0.jar" /> |
10 | <include name= "*.jar" /> |
13 | <taskdef name= "testng" classname= "org.testng.TestNGAntTask" classpathref= "run.classpath" /> |
17 | <target name= "compile" depends= "clean" > |
18 | <echo message= "mkdir" /> |
19 | <mkdir dir= "build/classes" /> |
20 | <javac srcdir= "src" destdir= "build/classes" debug= "on" encoding= "UTF-8" > |
21 | <classpath refid= "run.classpath" /> |
25 | <path refid= "run.classpath" /> |
26 | <pathelement location= "build/classes" /> |
28 | <target name= "run" depends= "compile" > |
29 | <testng classpathref= "runpath" outputDir= "test-output" > |
30 | <xmlfileset dir= "${basedir}/test-xml" includes= "demo.xml" /> |
31 | <jvmarg value= "-ea" /> |
(三)Dagger+Ant+Jenkins
1. 安装Jenkins
Jenkins有两种启动方式,一种是下载Jenkins安装包,安装成功后直接访问链接地址即可;一种是将Jenkins部署到Tomcat上,使用Tomcat启动。这里介绍后者(前者在实验过程中遇到了未知的问题,导致无法执行构建文件出现timeout)。
(1)下载Tomcat,本文使用直接下载Tomcat7.0源文件的方式,下载完成后直接解压
(2)下载jenkins.war,并复制到Tomcat的webapps目录下
(3)在Tomcat/bin目录下运行startup.bat,启动Tomcat和Jenkins
(4)浏览器打开http://localhost:8080/jenkins,此时可以看到Jenkins页面
2. 简单配置Jenkins
Jenkins系统管理 - 系统配置,设置JDK和Ant路径:
3. 使用Jenkins管理Ant执行
(1)Jenkins - 新建 - 新建一个自由风格的软件项目
# 选择不使用任何源码管理(以后可以选择SVN、Git等)
# 构建 - invoke Ant :选择Ant版本;填入Targets(build文件中的default target,一般为用例运行“run”);Build File路径
(2)Jenkins - 立即构建,在build history中可以看到正在构建的任务,点击具体任务可以查看详情,Console Output可以查看控制台输出
【Note】
Jenkins中还可以进行邮件发送、源码管理、用户管理、权限管理、节点管理(分布式执行)等等设置,还有很多在测试平台管理中需要用到的插件。本文介绍的是简单进行一个demo执行所要配置的部分。
【Problem】
这里可能会出现一些与路径相关的问题,此时可以检查:
(1)环境变量JAVA_HOME是否正确配置到JDK目录
(2)Jenkins的JDK配置是否正确
(3)项目中的配置文件(特别是prop.properties)路径是否正确
(4)build.xml文件是否放在项目的根目录
(5)invoke Ant的Build File参数可以尝试细化到文件级别(/Dagger/build.xml)
至此,我们已经搭建完成了一个简单的自动化测试平台。
最后给出一个整体的框架图:
以上。
版权声明:本文为博主原创文章,未经博主允许不得转载。
</div>