字节十年工程师整理的RobotFramework自动化测试框架介绍及应用
目录
一、概念
二、特性
三、RF环境安装
四、RF的使用
五、RF的常用类库
六、RF的常用关键字的使用
七、准备UI自动化测试的环境
八、浏览器操作的关键字
九、元素定位
十、项目的三层架构
十一、RF非GUI方式(命令行)运行与Jenkins集成
一、概念
RobotFramework是什么?
Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。
二、特性1.测试用例使用文本文件(TXT或者TSV文件)保存,使用制表符分隔数据。可以方便的使用任何文本编辑器,或者EXCEL编辑测试用例。也可以使用HTML格式创建用例。
2.测试用例中支持变量使用,可以使用IF语句和FOR循环语句。
3.可以利用“标签”功能对测试用例进行分类和有选择执行。
4.支持关键字驱动、数据驱动和行为驱动。
5.利用已有的关键字,测试人员可以创建自己需要的关键字,形成更高级别的行为。
6.测试执行报告和日志是HTML格式,容易阅读。
7.Robot Framework并不是一款像QTP一样的自动化测试工具。它是一个自动化测试框架,或者说是一个自动化测试平台。
8.提供了测试执行事件的监听接口,并且可以自定义接口中的脚本。例如,某个用例执行前,“start_test”接口中的脚本就会被执行;用例执行结束后,“end_test”接口中的脚本就会被执行。而测试人员可以自定义“start_test”、“end_test”这两个接口的脚本。
9.提供了命令行接口和XML格式的输出。可以与版本管理工具结合,进行持续集成。
10.Robot Framework是通过测试库识别被测对象、操纵被测对象,有很多自带的或者第三方的开源测试库。例如,使用“selenium2Library”库测试web客户端。此外还可以测试java客户端、Win32客户端、SSH协议的字符终端等。
11.测试人员可以使用Python和java创建自己需要的测试库。
12.提供了远程测试执行接口,可以进行分布式测试执行。
以上内容来源百度百科
三、RF环境安装环境的安装需要版本匹配,我现在电脑上配置的版本亲测有效。
1、安装python3.7.6环境并配置环境变量;
2、使用管理员身份打开dos窗口:
安装robotframework:pip install robotframework==4.1
卸载为pip uninstall robotframework
3、在dos窗口中安装RIDE工具,RIDE是robotframework的开发工具:
安装RIDE:pip install robotframework-ride==1.7.4.1
卸载:pip uninstall robotframework-ride
安装时会弹出如下的对话框,是否创建桌面快捷方式?,点击“是”。
4、安装wxPython
Wxpython 是python 非常有名的一个GUI库,因为RIDE 是基于这个库开发的,所以这个必须安装。
pip install wxPython==4.0.4
5、Selenium2Library安装
RF-seleniumlibrary 可以看做RF版的selenium 库,selenium (webdriver)可以认为是一套基于web的规范(API),所以,RF 、appium 等测试工具都可以基于这套API进行页面的定位与操作。
pip install robotframework-selenium2library
6、双击图标打开,或者在dos窗口输入ride.py打开,打开之后如下图所示。
安装过程中遇到的问题
遇到闪退或者启动报错如下所示:
将..python37\Lib\site-packages\robotide\application的目录下application.py文件中的self._initial_locale = wx.Locale(wx.LANGUAGE_ARABIC)改成self._initial_locale = wx.Locale(wx.LANGUAGE_ENGLISH)
如遇其他问题,请求助热心网友们,大部分问题都可以解决。
四、RF的使用1、新建项目
点击【File】→【New Project】,在弹出框中填写项目名称、路径、类型(文件或者文件夹),这里新建一个文件夹。
2、创建测试套件
在文件夹上点击右键,选择【New Suite】,在弹出框中填写测试套件的名称,类型选择File。
3、创建测试用例
在测试套件上点击右键,选择【New Test Case】,在弹出框中填写测试用例的名称。
4、创建资源文件
在文件夹上点击右键,选择【New Resource】,在弹出框中填写名称,并选择格式为TXT。一般为保存业务关键字资源,是自定义关键字的载体,在资源文件下可以创建用户自定义关键字。
5、页面操作介绍
【1】 测试套件的Edit页签页面,如下图所示
1、Settings设置
2、Import:导入外部文件
Library:导入外部类库,如果是黑色表示成功,红色表示失败。
Resource:导入资源文件,比如可以导入业务关键字。
3、定义内部变量
添加变量、添加list集合,添加一个字典,这一块相对用的不多,较常用的还是导入外部文件的Library和Resource功能。
4、元数据
【2】测试用例页面
五、RF的常用类库1、标准库:不需要安装,直接用,RF自带。
Buitini(测试库)
Collections(集合库)
DateTime(时间库)
ScreenShot(截屏库)
标准库的位置:D:\software\python37\Lib\site-packages\robot\libraries
2、扩展库:需要通过pip安装库
Web自动化测试:SeleniumLibrary,Selenium2Library,Selenium2Library for java等。
API接口自动化:RequestsLibrary
APP自动化测试:AppiumLibrary
安装方式:
pip install robotframework-seleniumlibrary
pip install robotframework-requests
pip install robotframework-appiumlibrary
扩展库的位置:D:\software\python37\Lib\site-packages\
注意:在导包时一定要和文件夹的名字一致,包括大小写。
六、RF的常用关键字的使用快捷键:
1、搜索关键字:F5
2、自动补全关键字:ctrl+shift+空格
当我们遇到不熟悉的关键字时,可以在如下所示的页面中查找其使用方法。
小试牛刀
Comment 1.打印 Log 这是一条打印语句 Comment 2.设置变量 ${a} Set Variable 100 Log ${a} Comment 3.获取系统时间 ${times} Get Time Log ${times} Comment 4.睡眠时间,强制等待 sleep 3 Comment 5.字符串的拼接 ${str} Catenate oracle mysql sqlserver Log ${str} Comment 6.创建列表 ${list1} Create List 功能测试 自动化测试 性能测试 Log ${list1} @{list2} Create List 功能测试 自动化测试 性能测试 Log Many @{list2} Comment 7.创建字典 ${dic} Create Dictionary name=张三 age=18 Log ${dic} Comment 7.1 获得字典的键 ${keys} Get Dictionary Keys ${dic} Log ${keys} Comment 7.2 获得字典的值 ${values} Get Dictionary Values ${dic} Log ${values} Comment 7.3 通过键取值 ${key_value} Get From Dictionary ${dic} name Log ${key_value} Comment 8.执行python里面的方法 ${random_number} Evaluate random.randint(1,101) modules=random Log ${random_number} ${times} Evaluate time.time() modules=time Log ${times} Comment 9.执行python自定义的方法 Import Library E:/pythonProject/test.py ${a} Evaluate int(10) ${b} Evaluate int(20) ${return_result} sum ${a} ${b} Log ${return_result} Comment 10. 流程控制IF ${age} Set Variable 22 Run Keyword If ${age}>30 Log 年龄太大,不合适 ELSE IF 18<=${age}<=30 Log 年龄正合适 ELSE Log 未成年 Comment 11. 流程控制FOR FOR ${a} IN oracle mysql sqlserver Log ${a} END Comment 流程控制FOR的另一种形态 @{list3} Create List oracle mysql sqlserver FOR ${a} IN @{list3} Log ${a} END Comment 流程控制FOR循环范围内的数据 FOR ${a} IN RANGE 1 11 Run Keyword If ${a}==5 Exit For Loop Log ${a} END 复制代码以上代码的运行结果:
Starting test: TestDemo.RF测试1.TestSuit1.TestCase1 20210831 08:28:34.827 : INFO : 这是一条打印语句 20210831 08:28:34.828 : INFO : ${a} = 100 20210831 08:28:34.828 : INFO : 100 20210831 08:28:34.829 : INFO : ${times} = 2021-08-31 08:28:34 20210831 08:28:34.830 : INFO : 2021-08-31 08:28:34 20210831 08:28:37.837 : INFO : Slept 3 seconds 20210831 08:28:37.839 : INFO : ${str} = oracle mysql sqlserver 20210831 08:28:37.839 : INFO : oracle mysql sqlserver 20210831 08:28:37.840 : INFO : ${list1} = ['功能测试', '自动化测试', '性能测试'] 20210831 08:28:37.840 : INFO : ['功能测试', '自动化测试', '性能测试'] 20210831 08:28:37.841 : INFO : @{list2} = [ 功能测试 | 自动化测试 | 性能测试 ] 20210831 08:28:37.841 : INFO : 功能测试 20210831 08:28:37.841 : INFO : 自动化测试 20210831 08:28:37.841 : INFO : 性能测试 20210831 08:28:37.842 : INFO : ${dic} = {'name': '张三', 'age': '18'} 20210831 08:28:37.843 : INFO : {'name': '张三', 'age': '18'} 20210831 08:28:37.844 : INFO : ${keys} = ['age', 'name'] 20210831 08:28:37.844 : INFO : ['age', 'name'] 20210831 08:28:37.845 : INFO : ${values} = ['18', '张三'] 20210831 08:28:37.846 : INFO : ['18', '张三'] 20210831 08:28:37.847 : INFO : ${key_value} = 张三 20210831 08:28:37.847 : INFO : 张三 20210831 08:28:37.848 : INFO : ${random_number} = 101 20210831 08:28:37.848 : INFO : 101 20210831 08:28:37.849 : INFO : ${times} = 1630369717.848543 20210831 08:28:37.849 : INFO : 1630369717.848543 20210831 08:28:37.859 : INFO : ${a} = 10 20210831 08:28:37.860 : INFO : ${b} = 20 20210831 08:28:37.860 : INFO : ${return_result} = 30 20210831 08:28:37.861 : INFO : 30 20210831 08:28:37.861 : INFO : ${age} = 22 20210831 08:28:37.862 : INFO : 年龄正合适 20210831 08:28:37.863 : INFO : oracle 20210831 08:28:37.864 : INFO : mysql 20210831 08:28:37.865 : INFO : sqlserver 20210831 08:28:37.866 : INFO : @{list3} = [ oracle | mysql | sqlserver ] 20210831 08:28:37.867 : INFO : oracle 20210831 08:28:37.868 : INFO : mysql 20210831 08:28:37.869 : INFO : sqlserver 20210831 08:28:37.871 : INFO : 1 20210831 08:28:37.872 : INFO : 2 20210831 08:28:37.873 : INFO : 3 20210831 08:28:37.875 : INFO : 4 20210831 08:28:37.876 : INFO : Exiting for loop altogether. Ending test: TestDemo.RF测试1.TestSuit1.TestCase1 复制代码 七、准备UI自动化测试的环境1、通过 pip安装扩展库:pip install robotframework-seleniumlibrary;
2、下载谷歌浏览器;
3、下载谷歌浏览器的驱动(注意:谷歌浏览器的驱动必须和谷歌浏览器兼容),然后将chromedriver.exe放到python目录下;
4、在RF的测试套件里面导入SeleniumLibrary;
八、浏览器操作的关键字 Comment 打开浏览器 Open Browser https://www.baidu.com chrome Comment 隐式等待 Set Browser Implicit Wait 5 sleep 2 Comment 浏览器放大 Maximize Browser Window sleep 2 Comment 设置浏览器的尺寸 Set Window Size 1024 768 sleep 2 ${width} ${height} Get Window Size sleep 2 Comment 返回上一步 Go Back sleep 2 Comment 直接跳转页面 Go To https://www.baidu.com Comment 刷新页面 Reload Page sleep 2 Comment 获取title ${title} Get Title Log ${title} sleep 2 Comment 获取路径 ${loc} Get Location Log ${loc} sleep 2 Comment 关闭浏览器 Close Browser 复制代码 九、元素定位元素定位的八种方式:id,name,link_text,partial_link_text,xpath,css,class_name,tag_name
前提:元素必须唯一
以下是通过id、name、link定位的几种简单方式
除了以上的定位方式,还有两个比较强大的定位方式:xpath与css
我们现在要定位如下的文本框:
xpath:(以下定位的元素都为百度首页的部分元素)
1.通过绝对路径定位,这种方式几乎不用。
2.通过相对路径定位://form/span/input
3.通过元素属性定位://input[@autocomplete="off"]或者//input[@autocomplete="off" and @class="s_ipt"]
4.通过部分属性定位://input[starts-with(@autocomplete,"of")]或者//input[contains(@autocomplete,"of")]
5.通过文本定位//a[text()="新闻"]
css:(以下定位的元素都为百度首页的部分元素)
1.通过绝对路径定位,这种方式几乎不用。
2.通过ID或者Class定位:#ID或者.class
3.通过元素属性定位:
一个属性定位 :input[autocomplete="off"]
两个属性同时定位:input[autocomplete="off"][class="s_ipt"]
4.通过部分属性定位:
以什么开头:input[autocomplete^="of")]
以什么结尾:input[autocomplete$="ff")]
包含:input[autocomplete*="of")]
5.通过子元素定位div#s-top-left a:nth-child(3),id为s-top-left下的第三个a标签。
如何处理frame框架?
我们在实际项目中,会发现很多情况下都存在frame框架,而处在frame框架中的元素,不能直接定位,需要先跳进当前的frame中,再进行定位。
跳进上图中的frame框架中:Select Frame menu-frame
如果要定位不是该frame中的元素,则需要先跳出当前frame,再进行操作:Unselect Frame,如下图所示:
下拉框列表的定位方式:
下面以Select From List By Value为例:
定位一组相同元素中的其中一个:
处理警告框
弹框一般有三种:alert,confirm,prompt
处理上图中的alert弹框,关键词为Handle Alert,如果点击确定操作,不用传任何参数,如果点击取消按钮,则传值为:DISMISS.
十、项目的三层架构1、三层架构指的是什么?
(1)页面元素层
(2)业务逻辑层
(3)测试用例层
业务逻辑层调用页面元素层,测试用例层调用业务逻辑层。
2、为什么要分层,意义在哪里?
实现页面元素,公共方法,公共数据,业务逻辑,测试用例集中式管理。
增加脚本的重复利用率。
增加脚本的可维护性。
十一、RF非GUI方式(命令行)运行与Jenkins集成命令:pybot -d 测试报告的路径 测试用例的路径
Jenkins的基本操作
1、安装Jenkins的环境
(1)安装jdk环境;
(2)进入Jenkins官网,下载安装文件,双击进行安装,按照步骤进行即可;
2、Jenkins的配置
(1)在插件管理中搜索Robot Framework,进行安装。
(2)创建一个自由风格的项目
(3)设置定时执行任务
(4)创建一个Windows批处理命令
(5)添加Execute Groovy script System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","")
(6)增加构建后操作步骤