基于WebDriver和TestNG的网页自动化测试方法
2016-02-13吕茜
吕 茜
(国家新闻出版广电总局573台,北京 102209)
(573 Station of State Administration of Press, Publication, Radio, Film and Television, Beijing 102209 China)
基于WebDriver和TestNG的网页自动化测试方法
吕 茜
(国家新闻出版广电总局573台,北京 102209)
互联网行业对时效性有着极高的要求,版本迭代异常迅速,保证项目的代码在快速迭代中保持很好的质量,是软件测试面临的重要挑战,互联网行业中使用最为广泛的当属网页自动化测试。文章阐述了一种基于WebDriver和TestNG的网页自动化测试方法,能有效提高测试的效率和准确率,具有很好的应用价值。
网页自动化测试;WebDriver;TestNG;无界面浏览器
本文著录格式:吕 茜. 基于WebDriver和TestNG的网页自动化测试方法[J]. 软件,2016,37(12):69-73
(573 Station of State Administration of Press, Publication, Radio, Film and Television, Beijing 102209 China)
0 引言
伴随着互联网行业的迅猛发展,网站也如雨后春笋般涌出。而在互联网行业中,对时效性有着极高的要求,相同的创意,你能比竞争对手早上线,你就更有可能占领市场;同时尽早的发现已上线系统中的bug,则可以尽少的降低公司的损失。所以最近几年持续集成CI(Continuous Integration)和持续交付(Continuous Delivery)发展的异常迅猛。而这两个概念的一个核心底层技术,就是自动化测试,对于互联网来说,该自动化测试大部分情况下就是网页自动化测试。所以,一个设计良好的网页自动化测试框架,对于网站和互联网公司有着重要的战略意义。
1 WebDriver介绍及应用
WebDriver提供了一个简洁的编程接口来调用浏览器的API进行基于浏览器的网页自动化测试[1]。它具有如下特点:
(1)完美支持Ajax
当今的大部分网站都是用Ajax技术实现页面的局部刷新而不需要重新加载浏览器。WebDriver能完美支持基于Ajax技术构建的页面。
(2)多种页面定位技术
进行网页自动化测试的本质就是计算机在浏览器中模拟用户的操作,而其第一步就是需要定位待操作的元素。WebDriver支持如下几种定位方式:css、id、xpath、tagname、name等。
(3)元素操作的支持
WebDriver内嵌多个常见网页元素的操作方式,比如针对文本框的文本清除与输入;针对下拉框的选择;单选/复选框的使用等等,甚至可以编写JavaScript代码在自动化测试中进行Ajax操作。
(4)所有页面布局模式的支持
常见的页面布局模式,无论是单页面基于Ajax,还是传统的iframe以及框架网页frame,WebDriver都提供了很好的支持。
(5)多浏览器支持
网页测试一个重大挑战就是网页兼容性,由于不同浏览器对css、Javascript等标准支持的不同,同一个网页需要在不同的浏览器不同的操作系统中进行回归测试来确保页面正确显示。当前使用的主流浏览器:Firefox、IE、Chrome等都提供了WebDriver的API,使得同一套测试代码测试不同的浏览器成为可能,大大提高测试的效率。而且各个浏览器对WebDriver的支持是原生的,大大提高了自动化测试执行的效率。
(6)多种客户端编程API
WebDriver客户端API对主流编程语言都提供了支持,比如Java、C#、Node.js等,所以对于大部分网站开发人员来说,都可以很快速的上手WebDriver来实现网页的自动化测试。
(7)分布式测试的支持
WebDriver内嵌了一个叫WebDriver Hub的功能,可以在一个WebDriver服务器端控制多个WebDriver测试节点,从而实现了WebDriver的分布式测试。
2 TestNG介绍及应用
TestNG(Test Next Generation)是一款由JUnit和NUnit激发而产生的新一代测试框架[2],广泛应用于单元测试和集成测试之中。它有如下特点:
(1)基于注解
TestNG内置许多用于测试的注解,比如BeforeClass/AfterClass、BeforeTest/AfterTest、BeforeMethod/AfterMethod等,能有效指定相应的类(class)或者测试(test)或者测试方法(method)在执行之前或者之后需要执行的操作。
(2)组的概念
可以将一系列相关的测试用例放到一个组(Group)里面,而在测试执行的过程中,指定相应的组去执行。实际项目中的一个例子,就是比如测试类Test1里面有三个测试方法f11、f12和f13;Test2里面有两个测试方法f21、f22,其中f12和f21只在回归测试当中使用,那么我们可以在f12和f21加上注解@Test(groups={’regression’}),这样在执行调用时,一旦指明是regression测试,那么就只有f12和f21执行。
(3)并发的概念
TestNG在集成测试中,可以实现基于测试方法(method)、测试(test)、类(class)、实例(instance)这几个级别的线程安全的并发测试,有效提高测试效率。
(4)其他特性
除上述之外,TestNG还提供了数据驱动、ANT集成、异常测试、测试依赖等特性,在实际使用当中都具有良好的使用价值。
3 基于WebDriver和TestNG的自动化测试方法
结合WebDriver和TestNG的特点,文章设计的基于二者的网页自动化测试框架流程图如图1所示:
图1 网页自动化测试流程图
这里面有几个关键问题需要解决(下文对于WebDriver的初始化和应用,都以Firefox浏览器为例,实际使用过程中,可以根据需要,初始化为Chrome、IE、Opera等不同浏览器)。
3.1 初始化WebDriver
如果是做单元测试,那么往往一个TestNG测试类需要完成一个测试功能,这个时候我们可以在TestNG的BeforeClass中初始化WebDriver,AfterClass中清理测试环境[3]。核心代码如下所示:
如果是做集成测试,即需要将一系列的测试放在一起进行功能验证,或者叫测试集(suite),这时我们可以重写TestNG的ITestListener,在测试开始onStart方法中初始化测试环境,在测试结束onFinish中清理测试环境,核心代码如下所示:
然后在测试类的BeforeClass中获得webDriver的应用进行网页测试:
3.2 错误重试
在自动化测试中,不可避免的会发生测试错误的情况。大部分情况是待测程序的确有逻辑上的问题;另外较常见的情况就是测试环境出了问题,比如网络的突然中断、测试程序的挂起等等,在后面这种非代码错误情况下,我们就需要进行重新测试以此排除环境造成的测试结果干扰。
借助于TestNG的RetryAnalyzer和RetryListener,我们可以方便的实现在测试方法失败后进行重测。核心代码如下所示[4]:
最后将MyRetrylistener加入到suite.xml中的listener即可。
该方法有个缺陷,就是在TestNG最终的测试报告中,会把重测的次数也计入其中。比如有一个测试方法f0,重新测试了一遍,然后成功,则在测试报告中会记录测试次数是2次,这样是不对的。所以我们需要做一下修正,即在test结束之后重新计算failed的个数,核心代码如下所示[5]:
3.3 测试顺序的执行
在集成测试之中,各个测试用例有时候需要基于一定的测试顺序,比如验证会员的管理功能的时候,需要首先进行登录等。TestNG默认情况下,测试中测试类的执行顺序是和他们的声明顺序是一致的,比如按照如下方式声明,则执行顺序就是
在有些测试中,我们需要打乱这种测试顺序,比如用户在访问某些页面时,是随机的,这时我们可以定义preserve-order=“false”来实现。
3.4 测试的并发执行
对于不相关的测试集,可以采用并发的形式提高测试效率。TestNG提供了如下几种并发的形式:
在上述4个例子中,都是并发5个线程去执行测试,所不同的是并发的策略:
第一个例子中所有的测试方法并发执行,测试方法运行在不同的线程中;
第二个例子中所有的suite.xml中定义的test并发执行,test运行在不同的线程中,同一个test中定义的测试类class运行在同一个线程中;
第三个例子中所有的class并发执行,class运行在不同的线程中,同一个class中定义的测试方法运行在同一个线程中;
第四个例子中所有的测试方法运行在同一个实例同一个线程中,不同的实例运行在不同的线程中。
3.5 无浏览器界面的测试
WebDriver是针对浏览器的网页自动化测试工具,在其工作过程中,会首先启动一个浏览器(Firefox、Chrome等)界面,然后它会控制该浏览器模拟用户的操作,比如转到一个网页,操作网页等等。在实际工作当中,网站的业务功能是其中测试的重中之重,而此时,对于网页界面的显示却并不太关心。同时,我们知道,对于搭建和运行一个具有Firefox或者Chrome等浏览器界面的测试环境,无论是物理机还是虚拟机,对于资源的利用率来说往往不会很充分(因为其必须运行一个操作系统之上,比如Linux或者Windows,而此时,操作系统本身是需要占用一定的资源的)。那么有没有既节省资源又能使用WebDriver进行网页自动化测试的方法呢(因为暂时没有无界面运行Windows窗口的方法,所以下文对本问题的探讨只基于Linux环境)?
(1)使用Xvfb
Xvfb(the X Windows Virtual Framebuffer)是一个X11显示服务器的实现。它不是将图形在屏幕上显示出来,而是在内存中运行所有的图形操作[7]。对客户端来说,除了无法看到真正的图形显示,没有其他分别。首先安装Xvfb,比如Ubuntu系统中:
然后启动Xfvb
然后启动另外一个shell并执行:
接着运行:
我们看到
这个时候,我们需要修改上文所述的WebDriver初始化,改用RemoteWebDriver方式:
(2)使用chrome-headless
Google chromium团队成立一个项目专门用于开发无界面的Chrome:https://chromium.googlesource.com/chromium/src.git/+/master/headless[8],所以如果使用Chrome浏览器进行网页自动化测试,则直接只用该项目即可。该项目比Xfvb的方法占用更少的资源。
4 结语
文章阐述的基于WebDriver和TestNG的网页自动化测试方法,能有效解决网页自动化测试中遇到的常见问题,具有很好的实际应用价值。
[1] Selenium官方网站, http://www.seleniumhq.org/.
[2] TestNG官方网站, http://testng.org/doc/index.html.
[3] H@H@, TestNG +WebDriver入门篇. http://www.cnblogs. com/GGHHLL/archive/2013/06/07/3124121.html.
[4] Jepombar, 测试中给TestNG添加RetryAnalyzer, https:// jepombar.wordpress.com/2015/02/16/testng-adding-a-rehttp:// stackoverflow.com/questions/28208202/retry-failed-test-case-intestngtryanalyzer-to-all-you-tests/.
[5] Kandume Luckcraft, TestNG中重试失败的测试用例. http://stackoverflow.com/questions/28208202/retry-failed-tes t-case-in-testng.
[6] Devendra Raju, TestNG中保留测试顺序. https://www. seleniumeasy.com/testng-tutorials/preserve-order-in-testng.
[7] Grig Gheorghiu, 在Ubuntu上以Firefox无界面形式运行Selenium WebDriver测试, http://agiletesting.blogspot.com/ 2016/01/running-selenium-webdriver-tests-using.html.
[8] Google, 无界面Chromium, https://chromium.googlesource. com/chromium/src.git/+/master/headless.
A Web Test Automation Method Based on WebDriver and TestNG
LV Xi
Internet industry has a strong requirement for time, and the code iterates rapidly in it, it’s very important to ensure the code with high quality during the iteration which challenges a lot for software testing, at the same time, web test automation is the most common testing in internet industry. The article illustratesa web test automation method based on WebDriver and TestNG, which can improve testing efficiency and accuracy, the method is very valuable in current daily work.
Web test automation; WebDriver; TestNG; Headless browser
TP3
ADOI:10.3969/j.issn.1003-6970.2016.12.016
吕茜,(1984-),女,本科学士学位,长期从事监管工作。