摘 要:为了实现对资产管理系统Web端自动化测试,研究了一种基于Selenium的unittest框架并采用数据驱动测试技术。利用Selenium提供的Webdriver定位元素,应用数据驱动模式进行测试用例脚本执行、用例重启、测试日志和测试报告自动生成等关键功能的自动执行,执行完成后将测试过程和测试结果以直观的方式反馈给测试人员。实践证明,在Web端使用自动化测试,有效节省了测试时间,提高了测试效率。
关键词:Selenium;unittest;框架;数据驱动
中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2021)18-0021-04
Abstract: In order to realize the automatic test of the Web side of the assets management system, a unittest framework based on Selenium is studied and data driven testing technology is adopted. Uses the Webdriver provided by Selenium to locate elements. Data driven mode is applied to automatically execute key functions such as test case script execution, case restart, automatic generation of test log and test report. After execution, the test process and test results are fed back to testers in an intuitive way. Practice has proved that using automatic test on the Web side can effectively save test time and improve test efficiency.
Keywords: Selenium; unittest; framework; data driven
0 引 言
随着软件产业人工成本的提高和软件测试技术日益受到重视,自动化测试逐渐成为一种趋势。Selenium是一套强大的Web应用自动化测试的工具集,它可以支持多种浏览器环境。在软件测试中,为了提高自动化测试执行的正确性、高效性、稳定性和案例性,测试框架采用分层设计,应用数据驱动构建数据层、逻辑层、业务层三层结构,实现将测试数据和测试行为完全分离,减少代码重复编写。同时使用discover将测试用例按照测试功能进行拆分,分散到不同的测试文件中实现所有的测试用例并行执行。
本研究对现有测试框架进行了优化,主要采用了数据驱动、关键字驱动、discover方法相结合的方式。Selenium的数据驱动方式主要实现数据和测试脚本的分离,通过关键字驱动实现了业务逻辑和应用程序的分离,discover方法实现了测试用例的指执行。此外,为了提高测试用例的可维护性在脚本设计中采用了Page Object设计思想。
1 Selenium自动化测试
Selenium是一款基于Web的自动化测试工具。它提供了一系列测试函数,用于支持Web自动化测试。这些函数非常灵活,它们能够通过多种方式定位界面元素,并可以将预期结果与系统实际结果进行比较。Selenium支持Java、C#、Python等多种语言编写测试脚本,可以在Firefox、IE、Google Chrome、Opera等主流浏览器中执行测试脚本。Selenium是开源工具软件,可以按照测试需求搭建框架[1]。
Selenium包含Selenium IDE、Selenium WebDriver、Selenium Grid等3大组件,如图1所示。Selenium IDE是浏览器的一个插件,负责录制、回放脚本,模拟用户对页面的真实操作,Selenium WebDriver是一个浏览器自动化框架,它接受命令并将它们发送到浏览器。Selenium Grid用于分布式自动化测试,通过控制多台机器、多个浏览器并行执行测试用例,一般用于多测试用例[2]。
Selenium的工作原理是:测试工程师开发基于Selenium的测试脚本→执行测试脚本→测试脚本程序→提供测试结果,可以概括为Selenium Client发送请求,WebDriver接收请求,然后解析请求,发送请求给浏览器,浏览器接受请求并执行,最后将结果返回[3],如图2所示。
2 Unittest单元测试框架
Unittest是python自带的单元测试框架,主要适用于单元测试,可以对多个测试用例进行管理和封装。主要用来组织和执行测试用例,将单条测试用例组织在一起执行,为了保证测试的连续性Unittest提供了失败重启机构,使程序在執行一条用例失败后能继续执行下一条用例。Unittest还提供了丰富的断言方法,用以判断否通过,从而生成最终的测试结果[4]。
Unittest主要用于单元测试的测试用例设计,Unittest也可实现批量执行测试等功能,同时适应于当前流行的敏捷化测试。在自动化测试中利用单元测试框架,使用一个类来继承Unittest的TestCase测试用例,每个case就是一个最小的测试单元,用测试容器把多个测试单元组织起来直接执行,最后生成测试报告。Unittest库包括:TestCase、TestSuite、TestLoder、TextRunner、TextTestResult、TestFixture,unittest[5]单元测试原理如图3所示。
3 资产管理软件测试需求分析
固定资产管理系统是企业日常使用的管理系统,是现代企业最基本最重要的工具。固定资产管理系统具有数据量大、关系复杂、使用周期长、维护困难等特点。资产日常操作管理功能主要包括固定资产的新增、修改、退出、转移、删除、借用、归还、维修、计算折旧率等日常工作,此外系统还包括用户管理及系统后台管理等功能。待测固定资产管理系统功能模块如图4所示。
目前,固定资产管理系统大多采用B/S结构,也就是浏览器—服务器结构,用户主要通过浏览器实现对资产的管理。待测试系统是一个典型的B/S结构管理系统,通过对系统的需要分析,要对该系统进行自动化测试,框架设计就要包括用例管理、执行控制、测试报表及测试日志等。通过分析,固定资产管理系统一般开发、维护周期长,因此适合自动化测试。
4 框架、数据驱动和discover方法设计
自动化测试框架通常主要包括测试用例管理、执行控制器、报表生成以及测试日志等模块,模块相互支持、相辅相成形成自动化测试系统;数据驱动将代码与数据进行分离,单纯由数据组成文件,再由文件来驱动关键字,最终实际整个自动化的流程读取到数据。
用例管理:用例管理模块是框架的基本管理模块,功能主要是用例的添加、修改、删除等单元,而这些功能也与用例例的模式,测试数据管理、可复用库等相关[6]。
控制器:自动化执行控制器用于自动化用例的执行,主要功能是用不同的方式执行用例。自动化控制器使用比较多的是GUI(用户图形界面)以及commandline+文件。
报表生成:报表生成模块主要功能是根据测试用例执行情况生成报表,一般报表是以HTML的格式生成,报表主要内容是用例的执行情况汇总,同时根据用例执行情况自动生成相应的总结报告。报表生成模块还能设置邮件发送功能,将报表直接发送到指定邮箱。
测试日志:测试日志模块是对用例执行过程的记录,通过日志将用例执行过程全貌提供给测试者,使测试人员通过调查用例失败信息及追踪用例执行情况了解测试基本情况。
数据驱动处理:测试数据的改变引起执行结果的改变叫数据驱动。我们通过脚本循环执行,读取一文件中不同的内容来完成自动化工作。使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据。可以将测试脚本与测试数据分离,使得测试脚本在不同数据集合下高度复用。测试脚本与测试数据分离不仅提高了测试覆盖,还可减少测试脚本的编写与维护工作,降低测试成本。根据固定资产管理系统测试需求对系统登录模块进行Unittest框架、数据驱动及discover方法设计[7]:
1.新建csv读取文件csvdata.py
Import csv #导入csv代码库
def read(): #将数据读取存放在一个方法中,方便后面调用
path=r”D:\test\element1.csv”
stream=open(path,’r’) #以只读的形式打开文件
data=csv.reader(stream) #进行数据格式转换
list=[] #将读取的数据放到list中
i=0
for row in data: #使用for循环进行读取
if i!=0:
list.append(row)
i=i+1
rerurn list
2.建立测试用例文件csvtest.py
Import ddt
import unittest
import time
from selenium import webdriver
class denglu(unittest.TestCase):
def setUpClass(cls): #定義setUpClass方法
cls.driver=webdriver.Chrome()
cls.driver=implicitly_wait(30)
def tearDownClass(cls): #定义tearDownClass方法
cls.driver.quit()
def test_denglu(self): #定义test_denglu方法
self.driver.get(“http://192.168.X.XXX/test/login”) #进入资产管理系统登录页面
self.driver.find_element_by_name(“username”).send_keys(“zhanguser”) #输入用户名
self.driver.find_element_by_name(“password”).send_keys(“*******”) #输入密码
self.driver.find_element_by_class_name(“uppercase”).click() #点击登录
time.sleep(3)
self.driver.find_element_by_link_text(“资产管理”).click() #点击资产管理按钮
3.建立runtest.py文件
import unittest
test_dir=’./test_case’
discover=unittest.defaultTestLoader.discover(test_dir,pattern=”test*.py”)
if _name_=’__main__’:
runner=unittest.TextTestRunner()
runner.run(discover)
5 结果分析
引入自动化测试的主要目的是减少重复工作,提高测试工作效率,而使用自动化测试使回归测试更简易方便,从而达到节约开发成本的目的。在固定资产管理系统的自动化测试过程中,共做过5次版本升级,版本升级都会编写大量的测试用例对系统进行验证。资产管理系统自动化测试使用了1 200个测试用例,为了对比自动化测试与手工测试的耗时情况。项目组对资产管理系统的系统增加用户、增加资产信息、资产信息查询、添加维修信息、维修信息查询等模块进行了自动化和手工测试耗时对比,结果如表1所示。
自动化测试的优势在于在多个平台环境上运行相同的用例、大量组合性测试或其他重复性测试以及任务周期长的软件产品开发项目,对于回归测试更高效。为了对比自动化测试与手工测试的收益率,使用函数为:
其中,Thp为手工测试准备时间;Thr为手工测试日间;Tap为自动化测试准备时间;Tar为自动化测试时间。
自动化和手工测试收益率对比,结果如表2所示。
为了对比自动化测试和手工测试收益率,对固定资产管理系统分别进行了自动化测试和手工测试,通过对比发现测试初期,自动化测试收益率较低,但随着回归测试次数的增加,自动化测试的收益率显著提高。这是因为自动化测试在前期需要开发大量復杂的测试脚本,随着脚本的完成,自动化测试的优势就很快显现。
6 结 论
项目根据固定资产管理系统的用户需求以Selenium的Unittest框架为基础,利用数据驱动和Page Object设计技术对框架进行了优化,用优化的Web应用自动化测试框架对资产管理系统执行测试,同时还进行了手工测试,并将两种测试结果进行对比。
在软件测试中,当回归测试的次数一次次增加,自动化测试的收益率显著提高。自动化测试前期需要投入较多成本开发脚本,当自动化测试框架、脚本设计完成后,自动化执行用例效率会远远高于手工测试。通过使用自动化和手工测试两种方法及结果进行比较,自动化测试效率远高于手工测试。
参考文献:
[1] WOODWARD M R. Insights into software testing [J].Software Focus,2001,2(3):93-103.
[2] TEICH J. Hardware/Software Codesign:The Past,the Present,and Predicting theFuture [J].Proceedings of the IEEE,2012,100(s1):1411-1430.
[3] 杜丽洁.基于QTP自动化测试框架的开发与应用 [D].武汉:武汉理工大学,2012.
[4] 易彤,林茂春.基于关键字驱动的自动化测试研究与实现 [J].电子技术与软件工程,2015(5):76.
[5] 高宇.Web自动化测试系统的研究与实现 [D].北京:北京工业大学,2017.
[6] 陈丽丽,林莉,傅晓娟.基于关键字驱动的自动化测试框架研究 [J].长春理工大学学报,2012,7(7):238-239.
[7] 李国强,张虹,王海瑞.软件测试关键技术的研究与应用 [J].火控雷达技术,2014,43(2):112-117.
作者简介:郑根让(1970.09—),男,汉族,陕西宝鸡人,副教授,硕士,研究方向:软件技术与测试、高等职业教育研究。