APP下载

基于Selenium的Web软件自动化测试

2018-09-21刘立康

计算机技术与发展 2018年9期
关键词:测试软件测试用例脚本

姜 文,刘立康

(西安电子科技大学 通信工程学院,陕西 西安 710071)

0 引 言

随着互联网技术和云计算技术的发展,很多软件产品都通过Web页面进行操作。Web页面具有操作简单、操作场景繁琐等特点;之前Web页面测试大都使用手动的方法来进行测试,测试过程比较耗费人力,技术含量也较低。随着软件技术的发展,软件测试也逐渐从纯手动测试过渡到手动测试与自动化测试并存。

近年来,软件自动化测试技术发展很快,出现了很多成熟的自动化测试工具,常见的Web自动化测试工具有:QTP、Silk Test、Selenium等。其中Selenium[1-5]是一款开源的、表现非常优秀的自动化测试工具。它最大的特点就是可以完全模拟用户在浏览器上进行各种Web操作,拥有足够好的用户体验,是站在用户的角度对网站性能进行测试。Web自动化测试工具Selenium的逐渐风行,为原本通过手动方式进行Web页面测试,提供了相对简单、廉价的自动化方法。

1 Selenium与Python

文中使用Selenium和Python工具开展Web软件自动化测试[6-10],以下简单介绍这两个工具。

1.1 Selenium

Selenium是一款开源的Web应用程序测试工具。Selenium测试脚本直接运行在浏览器中,模拟用户操作网页的过程。支持在IE、Chrome和FireFox等通用浏览器上使用,可以在Windows、Linux、Mac和Solaris 等多种操作系统上运行。

目前广泛使用的是Selenium2.0以上版本,Selenium2=Selenium1+WebDriver。

WebDriver是一款自动化测试Web应用程序的工具,提供友好的API,使测试更易于理解和维护。它不依赖于任何特定的测试框架,是完全独立的,应用它不需要启动任何额外的进程或者运行其他程序。

Selenium 2[11-13](Selenium WebDriver)是将WebDriver API集成到Selenium 1,解决提供替代编程接口所带来的局限性。Selenium 2工具的主要功能包括:对Web页面进行功能测试,支持脚本录制,支持Java、Python、Ruby和C#等语言的测试脚本。

1.2 Python

Python是一款面向对象的脚本语言,语法比较简单但功能却很强大。Python语言易读、易维护,受广大用户所欢迎、用途十分广泛。

Unittest也称为PyUnit[14-16],是Python语言的单元测试框架。自Python2.1版本后,Unittest已经成为了Python的标准库。Unittest类库中包含许多方法可供编程时调用,提高了开发测试脚本的效率和质量。

2 Web软件项目案例

在某视频直播转码软件项目中,与Web页面相关的部分作为一个单独的软件模块开发。该模块作为项目的业务功能模块之一,支持从Web页面对视频文件进行直播转码。

2.1 软件开发技术

该软件模块采用MVC设计模式,使用当前最流行的Struts2+Spring3+Hibernate框架进行开发。前台采用JSP进行页面开发和用户界面管理,使用JavaScript结合开源的前端插件jQuery EasyUI进行前端页面开发。后台采用Java与MySQL数据库进行开发,采用当前主流的Java开源开发工具Eclipse和Tomcat服务器进行程序开发和发布。

2.2 jQuery EasyUI

jQuery是一套简洁、灵活的JavaScript脚本库,可以帮助Web页面开发工程师简化JavaScript代码。jQuery由于简便易用的特点,在Web前端开发中被广泛使用。

EasyUI作为一款开源前端插件集合,功能十分强大。应用这些插件可以极大地减少Web开发方面的工作量。EasyUI与jQuery结合在一起应用,jQuery负责把EasyUI的各种插件搬运到Web项目合适的地方,并且让它真正运转起来。

2.3 软件功能测试点

Web软件功能测试点覆盖Web页面上各场景的正常与异常功能测试点。Web页面的功能测试包括以下场景:Web页面登录与注销;Web页面登录密码修改;直播频道增、删、改、选中、多频道翻页;频道显示条数、频道各参数配置;直播频道启用和禁用;浏览器兼容性测试,等等。

3 自动化测试软件开发过程

自动化测试软件开发过程主要包括:仔细研读软件需求说明书、分析测试需求、提交测试策略、设计测试用例、搭建测试环境。手动执行测试、选择自动化测试用例、开展自动化测试工作。具体过程如图1所示。

图1 自动化测试软件开发过程

3.1 制定测试计划

明确自动化测试的对象、目的、内容、方法、进度要求,并确保测试所需的人力、软硬件设备、数据等资源准备充分。

3.2 分析测试需求

根据需求说明书,测试架构师(TSE)编写测试策略,设计测试功能点。Web功能测试需要覆盖页面链接、控件、页面功能、数据处理、模块业务逻辑等多种功能的测试。

3.3 设计测试用例

TSE针对正常和异常情况进行测试用例设计,测试用例覆盖所有测试功能点,共涉及测试用例288个,并编写测试用例文档。

3.4 搭建测试环境

搭建测试所需的各种软硬件环境,如数据、网络、测试工具的安装和设置等。

3.5 手动测试

手动测试可以发现Web软件存在的各种问题,同时也可以检查测试用例设计中存在的问题,为开展自动化测试奠定坚实的基础。

3.6 选择自动化测试用例

选择可以自动化测试的测试用例,共选定测试用例238个,自动化率为82.64%。通常兼容性测试用例不能实现自动化测试。

3.7 编写测试脚本开展自动化测试

采用Python与Selenium工具编写自动化测试脚本,脚本基于Unittest自动化测试框架。完成用例的测试脚本编写工作后,采取测试库框架优化测试用例脚本,从众多的脚本中提取出公共函数,供测试用例调用。通过脚本连跑实现对Web软件的自动化测试。

4 基于Selenium+Python的自动化测试软件开发

测试软件开发选择Python作为开发语言,使用Selenium提供的资源进行测试软件开发。工作内容包括安装各种测试工具、搭建测试环境;录制、编写测试脚本;基于测试库框架优化软件代码;自动化脚本连跑;测试结果分析。

4.1 安装测试工具

在执行测试任务的PC机(执行机)安装所需的各种测试工具。

4.1.1 Python工具

安装包为python-2.7.3.msi。安装完成后,在环境变量中增加Python工具的相关目录路径。Python工具自带了一个轻量级的集成开发工具IDLE,IDLE可以进行测试脚本的编辑、调试和执行。

4.1.2 Selenium工具

网上下载基于Python语言的软件包selenium-2.50.1-py2-none-any.whl,执行pip install selenium-2.50.1-py2-none-any.whl进行软件包安装。安装完成后Selenium软件包安装在Python工具的lib目录下。

4.1.3 安装Firefox浏览器和Selenium IDE工具

首先安装Firefox浏览器,然后在该浏览器上安装Selenium IDE工具。Selenium IDE是Firefox浏览器的插件,只能安装在Firefox浏览器上。

4.1.4 安装MySQL数据库的相关工具

在Python程序中读写MySQL数据库,需要安装相关的工具。

(1)安装MySQL-python工具,安装包为MySQL-python-1.2.5.win32-py2.7.exe。

(2)安装MySQL连接器,安装包为mysql-gui-tools-5.0-r17-win32.msi。

安装完成后,可以通过SQL语句对MySQL数据库表单进行操作。

4.1.5 pycharm工具安装

pycharm工具的安装包为pycharm-community-5.0.3.exe。pycharm工具是Python重量级IDE,功能强大,自动检测语法,可以帮助开发者写出更规范的Python代码。

4.2 搭建测试环境

Java Web软件[17]基本组成如图2所示。搭建测试环境需要安装浏览器和Web应用软件。文中的Web软件选择Chrome或者Firefox浏览器作为客户端浏览器。

图2 Java Web软件基本组成

4.2.1 安装浏览器

在测试执行机上安装浏览器,目前安装的Python与Selenium工具要求谷歌浏览器的版本不能低于43.0.2357.0。谷歌浏览器安装包为48.0.2564.116_chrome_installer.exe。安装完谷歌浏览器后,还需要安装谷歌浏览器驱动程序chromedriver.exe,将其安装在指定的目录下。

4.2.2 Web软件测试环境部署

Web软件测试环境部署在操作系统为Windows 7的PC机上。

(1)安装JDK、Tomcat与MySQL。

JDK安装包为jdk-7u15-windows-is86.exe(1.7.0_15版本)。Tomcat安装包为apache-tomcat-7.0.29-windows-x86.zip,直接解压、安装。MySQL数据库安装包为mysql-5.5.8-win32.msi。完成三个软件安装后,在环境变量中添加JDK、Tomcat、MySQL工具的相关目录路径。

(2)安装Web产品软件包。

Web产品软件包为*.war格式的软件包,将软件包部署到Tomcat安装路径下的webapps文件夹中,部署完成之后,切换目录到Tomcat安装路径下的bin文件夹下,执行startup.bat文件启动Tomcat服务。网页的IP地址为部署Web软件PC机的IP地址。

4.3 录制测试脚本

在Firefox浏览器上启动Web软件程序,找到菜单栏“工具”下的Selenium IDE,单击后出现录制页面,点击红色录制按钮,开始录制。根据测试用例进行手动测试操作,测试操作完成后,按下红色按钮停止录制。从Selenium IDE工具导出录制的Python脚本,该脚本文件名与测试用例编号相对应。

目前Web页面的登录、注销以及修改密码等简单的场景采用Selenium IDE工具录制之后,可以导出正确可用的测试脚本。其他包含复杂测试场景的Web自动化测试用例录制后并不能生成真正可用的脚本。某些测试场景不支持通过Selenium IDE工具录制脚本。

脚本录制完成之后通常还需要修改、完善。录制的测试用例脚本拥有Unittest测试框架,为脚本的进一步编写工作提供了良好的基础。

4.4 编写自动化测试用例脚本

测试用例脚本采用Python进行程序设计。对于Python而言,代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次。缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。Python脚本中出现未对齐的行,该行下方就会出现红色曲线。可以使用空格键调整格式,直到红色曲线消失。

当脚本中一行的字符数过多时,会报PEP 8的告警。应该将长字符串分隔成多行显示。

4.4.1 自动化测试脚本框架

下面是一个简单测试用例脚本示例:

#-*- coding:utf-8 -*-

from selenium importwebdriver

importunittest

......

class BaiduTest(unittest.TestCase):

def setUp(self):

self.driver=webdriver.Chrome ()

self.base_url=u"http://www.baidu.com"

deftest_baidu_search(self):

driver=self.driver

driver.get(self.base_url)

self.assertEqual(driver.title, u"百度一下,你就知道")

driver.find_element_by_id("kw").clear()

……

def tearDown(self):

self.driver.quit()

if __name__=="__main__":

unittest.main()

从脚本示例中可以看出,通常测试脚本由5部分组成:

(1)导入需要调用的程序模块。

(2)定义继承unittest.TestCase的测试类,从而可以使用unittest.TestCase类中的各种方法。

(3)在初始化方法setUp中,初始化webdriver,设置测试环境。该方法自动执行。

(4)定义测试方法,首先定位Web元素,然后开展相关测试场景的操作。

(5)在清理方法tearDown中,执行测试用例运行后的清理工作,如退出webdriver、关闭驱动、恢复用例执行前的状态等。该方法自动执行。

4.4.2 Web元素定位

Web元素定位就是在Web页面上找到待测试的Web元素。手工测试时,测试人员容易在Web页面上找到Web元素开展测试工作。自动化测试通过测试程序在Web页面对应的HTML文件中定位Web元素,这是进行Web元素测试的第一步。Web元素定位有多种方法,文中的软件项目测试过程中主要采用如下四种方法。

(1)基于元素ID的定位。

该方法通过查找Web页面上的元素ID值来获取元素,比较简单,适合Web元素ID固定的情况来使用,对于动态分配Web元素ID的情况不能使用。

(2)基于元素XPATH的定位方法。

元素XPATH的定位类似查找一个人的地址,通过页面html文件中的标签名的层级关系定位元素的绝对路径。这种定位元素方法在实际使用过程中,可以针对元素的XPATH进行修改,添加上、下层级的脚本标示,增加元素获取的准确性。

(3)基于元素CSS的定位方法。

该定位方法查找Web元素的CSS属性来获取元素。CSS(cascading style sheets)层叠样式表是用来表现HTML或XML的标记语言。CSS使用选择器来为页面元素绑定属性。元素CSS定位方法,相对前两种方法要复杂一些,元素的CSS属性选择比较灵活多样。

(4)基于元素LINK的定位。

该定位方法仅适用于文本链接的场景,通过元素标签对应的文本信息来定位元素,相对其他的元素定位方法,适用的场景比较有限。

4.4.3 测试方法

完成Web元素定位后,需要对相关的场景进行各种操作,开展测试工作。文献[14]介绍了采用Python语言在各种常见场景中的操作方法。文献[15]采用Java语言介绍了同样的内容。网上也可以查到大量测试场景操作方法。编写测试方法是脚本编写的核心内容。

下面介绍测试脚本编写过程中两种场景的处理方法:

(1)Web页面中包含iframe框架。

Web页面中包含iframe框架时,如果要提取iframe框架中的元素,需要在脚本中使用swtich_to_iframe实现框架切换。在该iframe框架上的相关操作完成后,需要从该iframe框架切换回来,在脚本中使用swtich_to_default_content来实现。

(2)文本框或数字框输入非法值场景。

Web页面上很多元素是使用EasyUI制作的,其中包含大量的文本框和数字框场景。由于填入文本或数字都有一定的取值范围限制,当文本框或数字框中填入非法值时,文本框或数字框的右侧通常会弹出tooltip类型的提示框,提示填入的内容非法。填入非法值之后,tooltip提示框会在鼠标移动出对应文本框或数据框之后消失。测试脚本需要定位tooltip类型的提示框。

解决办法:当文本框与数字框中输入非法值时,可以通过基于元素CSS的方法来定位tooltip元素,检测tooltip中所提示的文本内容。具体方法如下:

Tip=driver.find_element_by_css_selector(“div[class‘tooltip tooltip-right’]”).text

4.4.4 MySQL数据库操作

测试脚本对Web软件进行频道添加、频道修改以及各类频道参数配置后,相关数据会写入MySQL数据库中对应的数据表中。在编写测试脚本时,需要通过MySQL-python工具来实现对MySQL数据库的操作,脚本实现时首先需要在脚本的最前面加上import MySQLdb,然后在测试脚本的测试方法中添加对MySQL数据库的操作语句,实现对数据库的读写操作。代码内容如下所示:

conn=MySQLdb.connect(host=‘10.185.31.52’,port=‘3306’,

user=‘root’,password=‘huawei’,db=‘hwwebom’,charset=‘utf8’)

cur=conn.cursor()

cur.execute(“select name from hwwebom.t_channel where name=‘%s’ ” % channel_name)

for cha_name in cur.fetchall():

print cha_name

cur.close()

conn.commit()

conn.close()

4.4.5 执行用例脚本生成测试报告

测试用例脚本为*.py类型文件,在执行机上点击该文件就可以自动运行。希望在测试用例脚本执行之后生成测试报告,需要使用Unittest的第三方测试报告模块HTMLTestRunner(该模块不在标准库中,需要自行下载),加载该模块后可以生成HTML格式的测试报告。将HTMLTestRunner.py文件保存Python的Lib目录下,就可以在测试脚本中调用该模块,具体实现过程如下所示:

if __name__==“__main__”:

now=time.strftime(“%Y-%m-%d-%H-%M-%S”)

filename=report_dir+‘/’+now+’_Web_Login_result.html’

fp=open(filename,‘wb’)

runner=HTMLTestRunner(

stream=fp,

title=unicode(‘测试报告’),

description=Unicode(‘测试执行情况:’)

)

runner.run(discover)

fp.close()

在生成测试报告文件时,将测试报告生成的时间作为测试报告文件名的一部分,并将测试报告文件生成的时间、测试用例运行结果写入测试报告。

4.5 基于测试库框架优化测试软件

测试库框架(test library framework)把应用程序分成过程和函数。该框架创建应用程序函数的库文件,库文件中的函数供应用程序调用。测试库架构框架的优点在于能够删除明显重复的部分,优化脚本代码。

独立编写的测试用例脚本,整体结构凌乱。需要将很多的公共场景与Web页面上的公共元素参数提取出来作为公共函数与共享参数;重新修改测试脚本,规范优化测试脚本;减少代码冗余,提高脚本质量;同时也方便业务扩展之后的脚本修改和维护。

4.5.1 测试软件目录结构

测试软件的目录结构如图3所示。测试脚本按功能分类存放在各自文件夹中。公共函数与公共配置文件存放在Public文件夹中。执行连跑任务的Python 脚本存放在根(Root)目录中。测试报告存放在Tesst_report目录中。

图3 测试软件目录结构

4.5.2 公共函数的功能

Public文件夹中共包含了5个公共函数文件。其他文件夹中测试脚本可以调用Public文件中公共函数文件中的函数,在Public文件夹中需要添加__init__.py文件。5个公共函数文件实现的功能如表1所示。

表1 公共函数的功能

4.5.3 公共配置文件

Python标准库的ConfigParser[18]模块提供一套API来读取和操作配置文件。ConfigParser是用来读取配置文件的包,可以把一些常用的参数放在配置文件中,供多个脚本共同使用。

公共配置文件中主要写入元素定位参数。在测试脚本编写中,多个测试脚本需要对同一Web元素定位,将该元素的定位参数值写入配置文件,方便编程时共同使用。

以场景登录(Login)时输入“用户名”和“密码”为例,叙述公共配置文件的使用方法。

(1)在脚本开头添加:import ConfigParser。

(2)打开公共配置文件。

all_dir=os.path.split(os.getcwd())

ini_dir=all_dir[0]

css_selector_filename=os.path.join(ini_dir,‘css_selector.ini’)

(3)获取配置文件中指定的配置信息。

[global]

Tip_Username_Null=/html/body/div[2]/div[3]/form/div[1]/div/small[1]

Tip_Password _Null=/html/body/div[2]/div[3]/form/div[2]/div/small

(4)将获取的元素定位信息赋值给元素定位函数的参数变量,进行定位场景操作。

4.6 测试脚本连跑

测试脚本连跑是指全部测试脚本在程序控制下依次自动运行。

4.6.1 测试脚本连跑实现方法

脚本连跑使用discover方法,具体实现方式如下所示:

test_dir=‘./Web_Login’

report_dir=‘./Test_Report’

#discover方法定义

discover=unittest.defaultTestLoader.discover(test_dir,patter n=‘*.py’)

定义连跑路径变量和测试结果报告存放路径变量,然后调用discover方法执行连跑路径下所有的测试脚本,连跑完成之后生成每个测试脚本的测试报告。

4.6.2 设定定时脚本连跑任务

采用相关工具设定定时连跑任务。

(1)BAT脚本启动连跑任务。

编写BAT脚本,调用根(Root)目录下的Python连跑脚本,启动连跑任务。脚本内容如下所示:

@echo off

set Script_path=D:Python_27_3Project_Live_New

set Report_path=D:Python_27_3Project_Live_NewTest_Report

taskkill /f /im FireFox.exe /t

cd /d % Script_path %

::调用Python脚本执行连跑

python Report_Test_Mod_Password.py-v

(2)Windows的任务计划程序定时连跑。

若执行机的操作系统是Windows,在操作系统的附件中启动任务计划程序,设置Bat脚本定时运行任务。

4.6.3 持续集成工具定时连跑

在执行机上安装持续集成工具Jenkin或者ICP-CI,编写Ant脚本,创建持续集成工程,进行Web自动化脚本定时连跑。

5 测试结果分析

基于Selenium+Python的自动化测试软件开发完成后,使用效果良好。

(1)提高测试效率。

手动执行288个Web测试用例耗时7人/天,且无法实现反复测试,整理测试报告也需要花费大量时间与人力。Web自动化测试脚本实现了82.64%的测试场景自动化,238个自动化测试用例连跑大约需要3个小时,同时可以实现测试报告自动输出,可以利用非工作时间反复执行测试任务。

(2)预测试。

可用于软件集成测试、系统测试、验收测试的预测试。

6 结束语

结合Web软件项目详细叙述了基于Selenium+Python的自动化测试软件开发过程, 介绍了开发过程中遇到的许多技术细节。工作实践表明,该测试软件在使用过程中效果良好,可以提高软件开发与测试的效率,降低软件的开发成本。同时弥补了手工测试时重复劳动的缺点,减少了测试人员大量的重复测试验证工作;也有助于做好软件项目的管理工作。

猜你喜欢

测试软件测试用例脚本
酒驾
基于相似性的CITCP强化学习奖励策略①
测试用例自动生成技术综述
网络自适应测试软件运行方法设计
自动推送与网站匹配的脚本
自动化检测EPU10A板卡系统设计与实现
远程开放教育学生自主学习能力评价的研究
一款重型包装抗压系统控制软件的设计与开发
测试工时受限的测试策略研究
愚公移山