自动化测试框架的发展及开发
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化测试框架的发展及开发相关的知识,希望对你有一定的参考价值。
参考技术A 自动化测试框架是自动化测试的核心,在开展自动化测试工作前,需要相应的自动化测试框架。一个好的自动化测试框架不但影响自动化测试的进程,也决定自动化测试的成败。基于界面的软件自动化测试框架经历了四个发展阶段: 无框架→数据驱动→关键字驱动→混合模型,如图 17-2 所示。
(1)无框架阶段(即简单的录制/回放)。
■ 在早期,自动化测试并没有框架这一概念,只是简单的录制/回放,由工具录制并记录操作的过程和数据,并形成脚本,通过对脚本的回放重复人工操作的过程。这种模式脚本与数据混合在一起,导致一个测试用例对应着一个脚本,维护成本很高,并且当界面发生变化时,就得重新录制脚本,导致脚本的使用率很低。
(2)数据驱动(Data Driven)框架阶段。
■ 无框架阶段最大的缺点就是脚本与数据混合在一起,为了解决这一问题,自动化测试框架发展到数据驱动框架阶段,该框架从数据文件中读取数据,通过参数化的方式将数据文件中的数据写入脚本中,由于不同的数据对应着不同的测试用例,将脚本与数据彻底地分离,因此提高了脚本的使用率,大大降低了脚本的维护成本。虽然数据驱动框架解决了脚本与数据的问题,但并没有将被测试对象与操作分离。
(3)关键字驱动(Keyword Driven)框架阶段。
■ 关键字驱动测试是在数据驱动框架的基础上改进的一种框架模型。它将测试逻辑按照关键字进行分解,形成数据文件与关键字对应封装的业务逻辑。主要关键字包括三类:被测试对象(Item)、操作(Operation)和值(Value)。用面向对象形式将其表现为 Item.Operation(Value)。关键字驱动的主要思想是:脚本与数据分离、界面元素名与测试内部对象名分离、测试描述与具体实现细节分离。
(4)混合框架(Hybrid Framework)阶段。
■ 关键字驱动框架将自动化测试框架带入了一个新的阶段,自动化测试工具 QuickTest 也很好地使用了这个理念。但在实际开展自动化测试的时候,发现测试工具所带的关键字驱动方式还是无法很好地完成测试任务。该框架虽然将数据与脚本进行了分离,但是如果要更灵活地调用测试用例中的数据或输出测试结果,该框架无法做到;并且需要读取其他文件存储格式中的数据时也是无法很好地解决,这样在自动化测试开始的前期,工程师会开发一个符合实际测试的框架来支持后期的测试工作,这就是通常所说的混合模型自动化测试框架。
随着自动化测试框架的不断发展,自动化测试脚本类型也在不断地发生变化。 自动化测试脚本类型的发展经历了以下几个阶段:
(1)线性脚本。
▲ 通过录制直接产生线性执行脚本。线性脚本无法对其逻辑或顺序进行任何的调整,产生的线性脚本只能按顺序一行一行地执行。该脚本类型对应着自动化测试框架发展中的无框架阶段。
(2)结构化脚本。
▲ 很显然线性脚本无法处理逻辑和业务关系。为了解决该问题,在原来的线性脚本中添加了顺序、循环和分支等结构的脚本,形成结构化脚本。
(3)共享脚本。
▲ 在实际测试过程中,需要将调试的脚本进行共享,供其他工程师调用,这样脚本类型就发展到了可共享的阶段。
(4)数据驱动脚本。
▲ 数据驱动脚本将数据与流程控制进行分离,通过读入数据文件来驱动流程。
(5)关键字脚本。
▲ 脚本、数据、业务分离,数据和关键字在不同的数据表中,通过关键字来驱动测试业务逻辑。
自动化测试框架是由假设、约束以及为自动化测试提供支持的工具的集合。自动化测试框架最大的优点是可以减少测试脚本实现和维护的成本,测试用例只需要修改测试用例文件,而不需要更新脚本驱动程序和引擎驱动程序。自动化测试框架的优劣直接影响到自动化测试的成功与否。
假设自动化测试框架是形成自动化测试策略的基础,下面是常用的假设条件:
约束条件影响着自动化测试是否成功,如果不注意以下约束条件,自动化测试工作将很难成功:
一般自动化测试框架应该包括四部分内容:测试管理、数据驱动、结果分析和测试报告。
如图 17-3 所示是一个混合测试框架模型样例。
RobotFramework 自动化框架环境搭建及使用
参考技术A一、为什么要做自动化?
前提:主流程稳定,周期长,脚本可重复利用。
1.节省人力资源
2.提高效率
3.面试需要
二、什么是RobotFramework:
基于Python的关键字驱动的自动化框架。
1. 基于Python:就是由python语言开发的这个框架。
2.关键字驱动:关键字驱动测试又称为表格驱动测试,是自动化测试的一种方法,是数据测试的一种改进方法。关键字驱动主要包括测试步骤、测试步骤中的对象,测试对象执行的动作,测试对象需要的数据
3.自动化框架?:是应用于自动化测试,框架提供可重用的基础自动化测试平台,提供自动化测试执行和管理功能的组织架构。
三、pip的常用方法:
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。
以下在win10_x64 cmd中操作:
安装:pip install 包名
eg:pip install robotframework
安装指定版本:pip install 包名==版本号
eg:pip install robotframework==1.7.4.1
升级指定包:pip install --upgrade 包名
eg:pip install --upgrade robotframework
卸载:pip uninstall 包名
eg:pip uninstall robotframework
搜索安装包:pip search 包名
eg:pip search robotframework
查看当前电脑上已经安装的包:pip list
查看当前电脑上可以升级的包:pip list -o
四、rf的安装:
安装RF自动化框架:pip install robotframework
安装RF自动化框架IDE:pip install robotframework-ride
安装wxpython(ride依赖wxpython):pip install wxpython
ps :实际上新版本pip在安装ride时会自动安装所需依赖,也就是wxpython
版本信息:Win10 x64 + Python 3.7.7 + rf 3.1.2 + ride 1.7.4.1 + wxpython 4.0.7.post2
ps :ride 1.x版本不支持Python 3.8及以上,ride 2.x(开发中)支持Python 3.8
rf日志中文乱码解决方法:修改文件 python安装目录下 Libsite-packagesrobotidecontrib estrunner estrunnerplugin.py 第 565 行,将 SYSTEM 改成 OUTPUT ,重启ride工具。
五、元素定位:
id :以百度搜索输入框为例
在RF中写法: id=kw
name :以百度搜索输入框为例
在RF中写法: name=wd
xpath :Xml Path Language
1. 绝对路径:从html根部逐级(从上至下)查找
/html/body/p[1]/p[1]/p[3]/p/p/form/span[1]/input
在RF中写法:xpath=/html/body/p[1]/p[1]/p[3]/p/p/form/span[1]/input
2.相对路径:根据节点的上下文进行查找
eg://p/form/span/input 这里是在html中找一个p,p里面包含一个form,form包含一个span,span包含一个input,找有这样一个四层的关系的input标签,要注意如果html中有多个符合这种层级关系的input,会默认选第一个,也就是说这种方式未必是完全准确的。
3. xpath相对定位我们还可以根据元素的属性来查找:
eg://p/form/span[1]/input[@type] 这里是找符合这样一个层级关系并且有\'type\'这个属性的input标签
在RF中写法:xpath=//p/form/span[1]/input[@type]
eg://p/form/span[1]/input[@type=\'submit\'] 这里是找符合这样一个层级关系并且\'type\'这个属性的值为\'submit\'的input标签
在RF中写法:xpath=//p/form/span[1]/input[@type=\'submit\']
eg://p/form/span[1]/input[contains(@type,\'sub\')] 这里是找符合这样一个层级关系并且\'type\'这个属性的值包含\'sub\'的input标签
在RF中写法:xpath=//p/form/span[1]/input[contains(@type,\'sub\')]
以上是根据属性,如果是下面这样的a标签,我们还可以根据链接文字来进行定位
点我
eg://a[contains(text(),\'点我\')] 这样就是找所有a标签并且文字为\'点我\'的元素了
在RF中写法:xpath=//a[contains(text(),\'点我\')]
小技巧:
在 Chrome-F12-Console 中根据Xpath寻找元素:使用 $x (""),引号中填写xpath路径,如$x("/html/body/p[1]/p[1]/p[3]/p/p/form/span[1]/input")
css:
id: 以百度搜索输入框为例
在RF中写法: css=#kw
class: 以百度搜索输入框为例
在RF中写法: css=.s_ipt
css根据属性定位 :
[id=\'kw\'] 表示查找id值为\'kw\'的元素
[name^=\'w\'] 表示查找name值为\'k\'开头的元素
[class$=\'ipt\'] 表示查找class值为\'ipt\'结尾的元素
[autocomplete*=\'f\'] 表示查找autocomplete值中包含\'f\'的元素
[id=\'kw\'] [name^=\'w\'] 表示查找id值为\'kw\'并且name值为\'k\'开头的元素
在RF中写法:css=[id=\'kw\'] [name^=\'w\']、css=[class$=\'ipt\']、
css=[maxlength=\'255\']、css=[autocomplete=\'off\']
ps:id和class也是属性,只是在css中针对id和class多了一种简单的写法,如上面的
css=#kw、css=.s_ipt
css根据标签定位:
input
表示查找当前页面所有input标签
在RF中写法:css=input
a,input
表示查找当前页面所有a标签和input标签
在RF中写法:css=a,input
span input
表示查找span标签下的所有input标签,哪怕是span下下级的input
在RF中写法:css=span input
span>input
表示查找父元素为span标签的所有input标签,注意和span input的区别
在RF中写法:css=span>input
span+input
表示查找紧挨在span元素后的第一个input元素
在RF中写法:css=span+input
span~input
表示查找紧挨在span元素后的所有input元素
在RF中写法:css=span~input
ps :其实大家都知道,因为页面上只依靠标签定位的话重复的可能性太大了,所有我们可以采用 标签 + 属性 的方式来进行定位
例如 span>input[id=\'kw\'][name^=\'w\'] 意思是查找所有父标签为span的input标签,并且该标签中有属性id的值为kw且属性name的值为w开头
在RF中写法:css=span>input[id=\'kw\'][name^=\'w\']
小技巧:
在 Chrome-F12-Console 中根据css寻找单个元素:
使用 $ (""),引号中填写css选择器,如$("span>input[id=\'kw\'][name^=\'w\']")
在 Chrome-F12-Console 中根据css寻找多个元素:
使用 $ (""),引号中填写css选择器,如$("span>input[id=\'kw\'][name^=\'w\']")
以上是关于自动化测试框架的发展及开发的主要内容,如果未能解决你的问题,请参考以下文章