当前位置:首页 期刊杂志

基于Selenium 的自动化测试框架设计与实现

时间:2024-05-04

朱佳艺,刘从军

(江苏科技大学 计算机学院,江苏 镇江 212003)

0 引言

随着信息技术的发展,Web 应用越来越流行,如今越来越多的软件系统都是Web 应用程序,基于Web 的应用承载着越来越复杂的业务逻辑和越来越庞大的信息平台结构,且发布周期短,更新迭代快[1],这就要求Web 应用程序测试具有全面性、可扩展性和高效性。承载Web 应用的浏览器具有多样化和多元化的特征,因而增加了Web 应用测试的复杂性和工作量。因此,应该更多地关注Web 应用程序测试的效率、可重用性和全面性[2]。

软件测试的目的是尽可能早地发现软件中的缺陷。软件测试的花费占整个软件开发生命周期的30%~60%,具体取决于产品的关键性和复杂性。软件测试是一个验证软件功能性和非功能性要求的过程,有助于基于软件的功能性、可靠性、可用性、效率、可维护性和可移植性等属性是否符合ISO-9126-1标准来控制产品质量[3]。

测试人员对Web 应用程序进行验收测试通常采用手动测试的方法,而手动测试是个耗时的过程,而且需要人为的干预,容易出现人为错误,从而浪费时间。为解决这些问题,自动化测试应运而生。自动化测试是一个自动测试的过程,包括设计、执行测试脚本和使用高效的自动化工具。自动化测试可以提高软件测试质量,使人为干预在软件测试中占比最小化[4]。

1 相关研究

常见的Web 自动化测试工具如QTP、Win Runner Load Runner、Robot、SilkTest、Selenium 等在自动化测试中得到了广泛应用。Selenium 可以说是最全面、最流行的开源Web自动化测试工具[5],特别对使用了BackBase 框架的Web 应用程序提供了良好支持 。

大型软件开发公司有相对成熟的测试技术,如Automated Testing Specialists Inc.提出数据驱动测试技术[6],Mercury Interactive Inc.推出关键字驱动测试技术[6]。文献[7]采用Selenium 工具对某系统进行了完整的自动化测试,但所进行的研究只针对特定系统,脚本无法复用在其他系统上;文献[8]设计一个基于Selenium 的自动化测试框架,并结合Jenkins、Pytest 等工具,具有稳定性、灵活性、可重用拓展、轻量级等特点,其采用数据驱动模式对难定位的元素进行二次处理,对验证码进行简单识别;文献[9]设计的基于Selenium 的自动化测试框架支持兼容性测试、日志记录、页面截图、测试报告自动生成,但并没有对验证码的识别进行处理,也没有自动构建和部署测试的功能。

本文提出的基于Selenium 的自动化测试框架相比于文献[7]-[9]的创新之处在于:框架可以复用,并不局限于某一系统;能部署在多台机器上同时进行测试,既节省了时间,又测试了兼容性;对验证码的识别更简单。实验结果表明,该框架对于提升测试的可重用性、可扩展性、全面性、准确性具有较好效果。

1 自动化测试

1.1 自动化测试方法

测试人员首先分析软件需求,根据需求设计测试用例。测试用例通过评审后,传统会根据测试用例中描述的步骤流程对应用进行手工测试,然后将得到的真实结果与预期结果进行对比。因此,为了节省人力、物力、时间、资源等成本,提高测试效率与准确度,研究者提出了自动化测试的概念。自动化测试是指将人为手动执行的测试行为转化为机器自动执行的过程[10]。

自动化测试有很多类型,比如功能的自动化测试、性能的自动化测试等。功能自动化测试是指借助自动化工具或框架来部署并执行测试脚本,从而自动化测试并验证软件功能[11];性能自动化测试是指通过工具或框架模拟成千上万的用户向系统发出请求,从而测试系统的处理能力、负载能力、稳定性与吞吐量等[12]。

自动化测试的项目大多满足以下3 个条件:①软件需求稳定。如果软件需求经常修改,或者变动跨度较大,则需要修改测试用例,并修改测试脚本,导致维护、测试脚本的成本可能高于节省的测试成本,与当初的目的背道而驰。所以对于变动较大部分可进行手工测试,等到趋于稳定之后再转化成自动化测试;②项目周期长。项目本身就需要大量时间完成,或者是一个长期迭代的项目,因此有充足的时间来完善自动化测试框架;③自动化测试脚本可重用。即开发出来的自动化测试脚本可在本项目中重用,或者在其他项目中使用,从而提高自动化测试脚本的利用率,达到一举多得的效果[13]。

1.2 自动化测试工具

自动化工具是为了支持各种测试活动而开发的软件,也称为测试管理工具。针对不同的测试需求,如功能测试、性能测试、安全测试、Web 服务测试、数据库测试、可用性测试等有不同的工具。市面上可用的自动化工具可分为开源工具和付费工具。一旦手动测试用例被自动化,即可通过使用自动化工具执行脚本节省手动执行测试用例所花费的精力[14]。表1 是一些帮助测试脚本设计和执行的自动化工具。

Table 1 Comparison of automated test tools表1 自动化测试工具比较

根据目前市场上每个项目预算分配的现状和趋势,购买或更新许可工具的成本非常高,可能超过分配的预算。因此,使用商业自动化工具的另一种解决方案是从商业工具改编或迁移到开源工具。在上面提到的自动化工具中,像Selenium 这样的开源工具是非常有效的,与获得许可的自动化工具相比,其具有许多优势并支持多种功能。

目前,Web 自动化测试工具种类繁多、五花八门。因此,选择标准应该从以下几方面来考虑:①发展趋势要稳定上升;②需要有一个活跃的社区能够进行讨论;③需要是开源软件;④支持主流的编程语言(Java、Python);⑤能支持主流浏览器(谷歌、IE、火狐等)。

综合以上几方面考虑,本文采用的技术架构为Python+Selenium。

1.3 Selenium

Selenium 里包含许多工具,有Selenium IDE、Selenium Grid、Selenium RC(Selenium 1.0)和Selenium webdriver(Selenium 2.0)[15]。Selenium 能模拟用户操作直接在浏览器上运行,主要功能包括:①可在不同浏览器上测试与浏览器的兼容性;②测试系统功能[16]。

Selenium IDE 是一个浏览器插件,用于构建测试脚本,支持Chrome 和Firefox 浏览器。其还可用于记录、编辑和调试Selenium 测试用例,记录所有由最终用户执行的操作,并生成测试脚本,同时实现回放。

Selenium Grid 是一种测试辅助工具,可以通过在多台计算机上进行分布式扩容,并通过一个中心点管理多个环境,从而轻松地组合多种浏览器与多种OS运行测试。

在很长一段时间内,Selenium remote control(RC)是Selenium 的核心部分,由于其使用了Selenium core,也即Java script 函数,运行起来比Selenium webdriver 慢很多。在执行测试脚本前,驱动与server 通信,将命令传递给server,并且其不支持Ajax 程序。为避免Selenium RC 的限制,人们融合Selenium 和webdriver,并提出Selenium webdriver[17]。

Selenium webdriver也被称为Selenium2.0,Selenium webdriver 是直接驱动浏览器的,因此运行起来比Selenium RC 快很多。Selenium webdriver 具有以下优点:①改善了当前Web 应用程序的测试问题,支持多种浏览器;②支持Ajax 应用;③支持多种语言编写测试脚本,如Java、C#、Ruby、Perl、Python 等[18];④支持在多平台上运行,如Windows、Linux 和Mac 等,便于测试人员进行Web 应用程序跨平台、跨浏览器的兼容性测试;⑤可使用Selenium Grid 进行分布式测试;⑥使用Selenium IDE 可进行录制、回放和脚本生成。

Selenium WebDriver 与浏览器的通信流程如下:①对于每一条Selenium 脚本,创建一个http 请求,并发送给浏览器的驱动;②浏览器驱动中包含一个HTTP Server 用来接收这些http 请求;③HTTP Server 接收到请求后,根据请求具体操控对应的浏览器;④浏览器执行具体的测试步骤;⑤浏览器将步骤执行结果返回给HTTP Server;⑥HTTP Server 又将结果返回给Selenium 的脚本,如果是错误的http代码,则会在控制台看到对应的报错信息[19]。具体通信流程如图1所示。

Fig.1 Communication flow图1 通信流程

2 框架分析与设计

2.1 支持的测试类型

基于对Web 项目实际需求功能的分析,对本文提出框架所支持的测试类型进行分析,如图2所示。

Fig.2 Test types图2 测试类型

(1)功能自动化测试。Web 的功能测试属于黑盒测试,不关注内部具体实现逻辑,模拟手动操作对相关功能进行测试。主要关注是否能打开网页链接,网页显示内容是否正确,元素的定位、识别、点击、滑动、输入文本等功能是否能实现,验证码是否识别正确,页面上自动弹出的提示框是否正确处理[20]。

(2)兼容性测试。Web 项目要想被广泛应用,兼容性至关重要。需要在不同的浏览器、操作系统上能够被正常使用,因此要在一些主流的操作系统如Windows、MacOS、Linux 以及主流的浏览器如Chrome、IE、Firefox 上进行兼容性测试。

(3)性能测试。系统响应时间、并发用户数、资源利用率等是测试的关键,该框架将从这几个方面对Web 应用进行测试。

(4)分布式测试。分布式测试是指在版本迭代的回归测试和兼容性测试时,在多台机器、多个版本的操作系统和浏览器上并行执行测试,从而缩短测试时间、提高测试效率。

2.2 功能性需求分析

本文所设计的框架主要包含以下几个功能:编写测试脚本、执行测试脚本、生成测试报告、定位分析测试结果。

(1)编写测试脚本。测试脚本是测试框架中最重要的部分,因为产品在不停迭代,测试用例也会不停地修改,所以脚本编写要考虑到后期维护成本。考虑到这点,编写测试脚本功能将分为4层,如图3所示。

配置层用来存放config 配置文件和数据文件;数据库层对系统数据库进行管理;API 层采用PageObject 设计模式,将页面元素定位方式、操作方法与测试脚本分离;测试用例层通过调用配置层和API 层封装的方法完成测试用例的编写。

(2)执行测试脚本。主要分为并发执行与集成自动化测试两部分,如图4所示。

Fig.3 Writing test script图3 编写测试脚本

Fig.4 Executing the test script图4 执行测试脚本

测试用例多线程的并发执行能够提高自动化测试框架的执行效率。采用Jenkins 持续集成工具,通过自动化部署可以完成持续集成[21]、自动构建并执行测试脚本等诸多重复工作,从而减少资源的消耗。

(3)生成测试报告。测试执行完毕之后将自动生成测试报告,并将测试报告以邮件形式自动发送给相关人员,可以是测试人员也可以是与项目相关的其他人员。

(4)定位与分析测试结果。主要通过log 和失败的截图进行定位与分析,log 中记录自动化测试用例的名称、操作步骤与执行失败的原因。当发现自动化测试用例执行失败时能自动进行截图,并将截图保存在指定位置。

2.3 非功能性需求分析

(1)性能需求分析。利用Selenium Grid 测试辅助工具在多台计算机上进行分布式测试,并通过一个中心点管理多个环境,从而对多种浏览器与多种OS 组合进行并行运行测试。用多线程或多进程降低自动化测试的总耗时,但容易造成内存溢出,所以执行完一个.py 文件,必须执行driver.close(),关闭浏览器后可释放内存。执行测试用例时间不能太长,否则就失去了自动化的意义,一般来说100条测试用例的运行时间需要控制在2h以内。

(2)易用性需求分析。测试人员不需要对编程语言非常熟练或对测试框架的内部逻辑非常熟悉,只需搭建简单的测试环境,输入简单的命令,即能进行自动化测试,生成测试报告,并将报告以邮件形式自动发送给相关人员。

(3)可维护性需求分析。软件开发是一个迭代的过程,功能会不断的增加和完善,所以测试用例会不断增加,测试脚本也会随之不断修改和完善。因此,要求脚本能不断作出调整,以便框架能长期使用。

(4)稳定性需求分析。框架不是只执行一次,可能每天都要执行,也可能每隔一段时间就要执行。为了保证框架的长期使用,框架要有较强的健壮性和稳定性。当输入测试数据时会改变测试环境,而这种改变可能会影响后续测试用例的执行,所以为了保证后续测试顺利执行,框架还要支持测试场景的恢复。

(5)可靠性需求分析。最基本的要求是要保证测试结果真实、可靠。测试数据也从一定程度上保证了测试的质量和完善性,所以测试数据不要随意更改,如要进行增删改操作,需要记录在操作日志中。

2.4 自动化框架设计

本文基于Selenium、Jenkins、Pytest 设计的自动化测试框架总体结构如图5 所示。将编写、维护好的工程代码提交到Jenkins 平台集成,也可以从Jenkins 获取工程代码,或者部署到各个机器上并行执行自动化测试。执行完毕后将自动生成测试报告,并用邮件发送给相关人员。

Fig.5 Overall structure of automation test framework图5 自动化测试框架总体结构

自动化测试框架详细结构如图6所示。

(1)Testcases 包用来存储各个模块的测试用例脚本,其包含Web 应用程序的常见功能,如登录、注册、关键词输入、按钮点击、复选框选择等。定位页面元素一般通过其id、xpath、link text 或css locators 来定位,即使元素名称改变也不需要修改测试脚本,从而简化了维护和修改测试用例的工作。每个.py 文件的命名方式都是有意义的命名,如登录模块是login.py,使测试人员在维护或搭建环境时,能快速定位到自己所需的脚本。

Fig.6 Detailed structure of automation test framework图6 自动化测试框架详细结构

(2)Lib 包中存放一些需要用到的第三方库,如识别验证码的第三方库ShowapiRequest。

(3)Screenshots 目录用来存储测试过程中的所有截图,主要是失败用例截图和需要识别的截图。通过失败用例截图,测试人员可非常容易地抓取到错误发生时的程序状态,有助于开发人员分析issue。将日期和时间设为截图的名字,并将图片文件存储在指定目录下。

(4)Util 包用来实现工具类,比如获取图片验证码和生成随机字符串。获取图片验证码的思路是先用截屏的方法browser.save_screenshot 截下整张图并保存到screenshots目录下,再用抠图的方法im.crop 抠下验证码并保存。用第三方库ShowapiRequest 识别保存下来的验证码,最后返回一个识别后的验证码。输入用户名时即可用随机字符串类随机生成,否则可能会与后台数据库的用户名重复。

(5)Data 目录存储测试数据。在Web 应用程序中,终端用户通常需要输入一些信息,比如登录系统通常需要输入用户名和密码来登录,像此类输入会存储在data 中。测试人员可以从data 中获取输入内容,而不需要在应用程序中输入相同信息。测试人员可以在该目录下存储Web 应用程序所需的输入值。

(6)Log 目录存储Log 日志,特别是失败用例的Log 至关重要,里面会记录issue 的关键时间点和信息,便于开发人员进行分析。

(7)Reports 目录存储测试报告,测试完毕后自动生成测试报告。Selenium 没有生成报告的内置功能[22],所以本文设计的框架采用allure 插件生成测试报告,最后将报告用邮件发送给相关人员。

(8)Config 目录存储配置文件,主要是一些环境的配置,如测试机器IP 地址、操作系统与浏览器相关信息、测试次数等。

3 框架应用与评估

使用了该自动化测试框架之后,测试效率有了很大改善,测试人员可完成比传统方法多两倍的工作量,从而减少了测试的人力资源。有时测试用例失败是由于Selenium webdriver 同步性的问题,而不是由于应用程序本身的缺陷。该框架减少了因同步性问题导致失败的概率,增加了通过的概率。综上所述,所提出的框架比改进前的自动化测试框架准确性更高。

执行5 次具有250 条测试用例的测试集,得到了如表2所示的结果。稳定执行率是指通过的用例数和产品功能导致失败的用例数总和与总执行用例数的比值。因为产品功能导致失败的用例,失败原因并非框架本身的因素,所以将产品功能导致失败的用例作为稳定的用例计算。

Table 2 Situation of test cases execution表2 测试用例执行情况

将5 次结果进行汇总得到表3。稳定执行率表明框架稳定执行的测试用例比例,并且给出的结果与手动测试用例给出的结果一样准确。有时应用程序工作正常,但是测试用例失败是因为同步性的问题。新提出的框架使测试用例同步正确,所以失败率比改进前的自动化测试框架有所降低。改进前的框架是指脚本无法复用的、无法部署多台机器进行并行测试的、没有验证码识别等特殊处理的框架,所以导致维护费用高、执行时间过长、失败率高。

Table 3 Comparative results of the proposed framework and old framework表3 新提出框架与改进前框架的对比结果

下面对本文所提出的自动化测试框架进行评估。作为一个新的自动化测试框架,需要多种类型、多方面的评估,特别是可重用性、可扩展性、兼容性和全面性等方面的性能。评估得到的实验对比结果如表4所示。

Table 4 Experimental comparison results表4 实验对比结果

4 结语

本文提出基于Selenium 的新的自动化测试框架来测试Web 应用程序,该框架可减少编写测试用例所需时间,并提高测试用例通过率,为测试人员提供了一个方便配置不同浏览器进行Web 应用测试的工具,减少了测试人员工作量。通过使用该框架,可生成定制化的测试报告,也可利用失败测试用例的截图分析失败原因,测试人员可在data 目录中维护所有数据。该框架能很好地适用于动态变化的应用程序,自动化测试的脚本也易于理解,因此使用该自动化框架可帮助团队更高效地测试Web 程序。但由于时间限制,本框架关于验证码的识别还不够完善,对于简单的验证码可以使用pytest中的pytesseract 模块和PIL模块进行识别,而对于复杂的验证码,则需要使用第三方的API。希望在后期的研究中,可实现不再依赖第三方库也能识别复杂的验证码。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!