Dagger学习之一步一步搭建简单的自动化测试平台(Selenium+TestNG+Ant+Jenkins)

       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 ServerSelenium 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的代码:

01package com.netease.demo;
02 
03import com.netease.dagger.BrowserEmulator;
04 
05/**
06 * The demo to show Dagger's basic usage
07 * @author ChenKan
08 */
09public class GoogleSearch {
10 
11    public static void main(String[] args) {
12 
13        String googleUrl = "http://www.google.com";
14        String searchBox = "//input[@name='q']";
15        String searchBtn = "//input[@name='btnK']";
16        BrowserEmulator be = new BrowserEmulator();
17 
18        be.open(googleUrl);             //打开网址
19        be.type(searchBox, "github");   //在搜索框中输入github
20        be.click(searchBtn);            //点击搜索按钮
21        be.expectTextExistOrNot(true, "https://github.com/", 5000);  //检查页面上是否有期待的文本
22        be.quit();
23    }
24}


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的最简单例子:

01/*
02 * Copyright (c) 2012-2013 NetEase, Inc. and other contributors
03 *
04 *  Licensed under the Apache License, Version 2.0 (the "License");
05 *  you may not use this file except in compliance with the License.
06 *  You may obtain a copy of the License at
07 *
09 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 *
16 */
17package com.netease.demo;
18 
19import org.testng.annotations.AfterClass;
20import org.testng.annotations.BeforeClass;
21import org.testng.annotations.DataProvider;
22import org.testng.annotations.Test;
23import com.netease.dagger.BrowserEmulator;
24 
25/**
26 * The demo to show TestNg's basic usage
27 * @author ChenKan
28 */
29public class TestNg {
30 
31    /**
32     * url & xpath
33     */
34    String googleUrl = "http://www.google.com";
35    String searchBox = "//input[@name='q']";
36    String searchBtn = "//input[@name='btnK']";
37    BrowserEmulator be;
38 
39    /**
40     * 数据准备,若在这一步挂掉TestNG标记为Skipped
41     * @throws Exception
42     */
43    @BeforeClass
44    public void doBeforeClass() throws Exception {
45        be = new BrowserEmulator();
46    }
47 
48    /**
49     * 测试代码,若在这一步挂掉TestNG标记为Failed,否则标记为Passed
50     * @param keyword
51     * @param result
52     */
53    @Test(dataProvider = "data")
54    public void doTest(String keyword, String result) {
55        be.open(googleUrl);
56        be.type(searchBox, keyword);
57        be.click(searchBtn);
58        be.expectTextExistOrNot(true, result, 5000);
59    }
60 
61    /**
62     * 清理数据,若在这一步挂掉TestNG仍标记为Passed
63     */
64    @AfterClass(alwaysRun = true)
65    public void doAfterClass() {
66        be.quit();
67    }
68 
69    /**
70     * 测试数据
71     * @return
72     */
73    @DataProvider(name = "data")
74    public Object[][] data() {
75        return new Object[][] {
76                { "java", "www.java.com" },
77                { "github", "https://github.com/" },
78            };
79    }
80}


除了直接运行这个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">
02 
03    <test name="TestNg" junit="false" annotations="JDK">
04        <classes>
05            <class name="com.netease.demo.TestNg" />
06        </classes>
07    </test>
08 
09    <test name="TestNgClone" junit="false" annotations="JDK">
10        <classes>
11            <class name="com.netease.demo.TestNgClone" />
12        </classes>
13    </test>
14 
15</suite>


执行后我们就能会得到类似这样的测试结果:

===============================================
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出错

1import com.sun.image.codec.jpeg.JPEGCodec;
2import 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出错

1log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).
2log4j:WARN Please initialize the log4j system properly.
3log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解决:在BrowserEmulator.java的构造方法中添加Log配置语句:

1PropertyConfigurator.configure("[workspace]/Dagger//src/log4j.properties");//加载.properties文件


(二)Dagger+Ant

1. 下载并安装Ant

(1)到 Apache Ant官网下载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">&gt;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="plain">&lt;include name=</code><code class="string">"libs/testng-6.8.5.jar"</code> <code class="plain">/&gt;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="plain">&lt;/fileset&gt;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="plain">&lt;fileset dir=</code><code class="string">"${basedir}/libs">
09            <include name="selenium-java-2.46.0.jar" />
10            <include name="*.jar" />
11        </fileset>
12    </path>
13    <taskdef name="testng" classname="org.testng.TestNGAntTask" classpathref="run.classpath" />
14    <target name="clean">
15        <delete dir="build"/>
16    </target>
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"/>
22        </javac>
23    </target>
24    <path id="runpath">
25         <path refid="run.classpath"/>
26         <pathelement location="build/classes"/>
27       </path>
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" />
32        </testng>
33    </target>    
34</project>


(三)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>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dagger是网易杭州研究院QA团队开发的一个轻量级、运行稳定的WebUI自动化测试框架,主要基于SeleniumTestNg可以认为是对Selenium进行二次封装的一个框架(俗称 造轮子 )。之所以把这个轮子开源出来,主要在于经过了公司内部多个项目的实践,也取得了不错的成效,因此,希望开源以后可以对大家有所帮助及参考。 设计理念 Dagger首先是一个WebUI自动化框架,提供了赖以操纵浏览器的一些API。API数量不多,少于20个,但从实践上,已经基本涵盖95%的应用场景了(其余5%比较 个性 的自动化操作一般是封装在业务逻辑层面,有时候甚至会须要hack) Dagger其次是一个测试框架,使用TestNg管理和运行用例,TestNg相关断言内嵌于上述API中。因此,在我们的测试用例里面不应该看到单独的TestNg断言的 Dagger还是一种设计风格:简约。无论是Dagger框架本身还是基于Dagger编写的测试用例,都是十分light及straightforward的,以至于会让人感觉有点土。但实践中,这两者确保了低成本、易用性、可维护性 WebUI自动化从业界看,难推进,易烂尾,原因基本在于:维护成本高、运行速度慢、稳定性差 Dagger专注于WebUI自动化,从技术上克服了速度与稳定问题(见下文)。只封装够用的浏览器操作为API,并充分简化/强化这些API,以简约的风格去降低自动化的学习及使用成本。同时,在实践中,我们主要使用Dagger编写冒烟用例、其次是主干用例,少写逻辑复杂功能,不写边边角角功能,让用例也保持清爽(在整个自动化实施过程中,会定期进行用例Review),同样易于后期维护 主要特性 API极少,易于上手,详见这里. 提供比较完备的文档,便于快速入门,详见这里. 支持单机多浏览器并发执行,大大缩短用例执行时间,详见这里 通过修改TestNg源码实现失败用例自动重运行(详见这里)由此几乎消除WebUI自动化中常见的虚假失败 默认使用Chrome浏览器,原因详见这里 失败用例自动截屏 后续工作 加入Flex/Flash自动化支持 如何使用 Dagger十分适合中小型团队从零开始WebUI自动化,这样的话,只须要直接下载整个Dagger代码就行了,Dagger本身都已经配置好了,下载后看一下使用文档就可以直接开始写用例了 也可以把Dagger打成Jar包,导入已有的自动化框架中,详见这里 标签:Dagger  自动化测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值