Robot Framework简介
1、什么是Robot Framework
- 由Nokia Siemens Networks(诺基亚西门子)开发。
- Robot Framework是一款基于python的功能自动化测试框架。
- 可以同时测试多种类型的客户端和接口。
- 主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。
2、RF的特点
(1)本身不提供任何类型测试,只提供测试框架的基本功能
(2)使用简单:使用表格语法,统一编写测试用例
也可像编程一样,编写RF脚本
(3)基于Python所以有丰富的库
(4)复用性高,可利用现有关键字组合新关键字
(5)支持各种变量,如字符串、列表、字典等,支持if和for语句
(6)提供标签功能,可以有选择性的执行测试用例
(7)输出的报告和日志是HTML格式,方便阅读分析
3、搭建RF环境
4、创建RF测试项目、测试套件、测试用例
对应 test project 、 test suite 、test case
(1)打开Ride
(2)创建测试项目、测试套件、测试用例
(3)导入包
(4)测试用例的基本结构
结果存入变量
操作名
操作别名或参数
url或参数
传递参数
5、RF脚本编写测试用例
5.1关键字
不区分大小写,建议大写
5.2注释
- Comment messages
- 快捷键:ctrl+#
- 取消:ctrl+$
- 行尾加
#注释文字
5.3输出日志
关键字log
- Log message1,message2或变量1,变量2,… level=INFO
- 在指定日志级别下记录message或变量值。
- 文本不需要加引号。
- 多个变量间以英文逗号间隔,多个变量结果输出在同一行中。
- level可以省略,默认INFO。
- 有效的日志级别有TRACE、DEBUG、INFO、HTML、WARN。
5.4执行测试
- Run选项卡→Start
- 快捷键F8
- 设置报告存储位置
- Robot Framework会生成三个文件,分别为output.xml、log.html和report.html。
- output.xml是以XML格式记录测试结果,阅读起来不够直观,可以使用不同的语言读取XML文件中的测试结果,生成定制化的测试报告。
- log.html和report.html相对来说要美观得多,log.html偏向于测试日志,记录脚本每一步的执行情况。report.html偏向于测试报告,总体展示测试用例的执行情况。通过浏览器打开log.html文件。
- Run→Arguments
- -o 路径\output.xml -l 路径\log.html -r 路径\report.html
- 控制台汉字乱码
- 修改python\lib\site-packages\robotide\contrib\testrunner\testrunner.py中的latin1为mbcs
- mbcs(Multi-Bytes Character Set):多字节字符集
- 根据系统自动显示为本国语言的字符,在中文系统下表示GB2312
- 重启ride
5.5创建变量、列表、字典
- ${变量名} set variable 变量值
- $开头表示变量,不论数据是否使用[ ]、{ }
- 变量不区分大小写,但不全是,最好一致
- ${列表名} create list 值1 值2 值3 …
- 数据中不需使用[ ]
- 一个单元格一个数据,每个元素自动转字符串
- 循环访问时建议将$换为@
- ${字典名} create dictionary 关键字1=值1 关键字2=值2 ...
- 数据中不需使用{ }
- 一个单元格一对数据,每个元素值自动转字符串
- 循环访问时建议将$换为&
- 输出
- 使用${变量/列表/字典名}
- 结果为字符串形式
- 查看和转换变量的数据类型
- ${结果变量} evaluate type($变量名)
- 变量名不能再加{ }
- evaluate表示执行python表达式,并返回执行结果
- ${结果变量} evaluate int($变量名)+-*/等操作表达式
5.6if语句
- run keyword if 表达式 关键字 命令的参数1 参数2…
- 表达式可以用
- 0<=${变量名}<60的形式
- ${变量名} run keyword if 关键字 evaluate 表达式
- 执行表达式,将结果存入变量
- ${变量名} run keyword if 关键字1 set variable 值1 ELSE IF 关键字2 set variable 值2 … ELSE set variable 值n
- ELSE IF需要大写,中间有空格。
- 语句写在一行。
5.7for循环
- 不支持while
- 不支持多层(含两层)循环,只能重新定义关键字
- :for ${变量} IN 值1 值2 值3
语句
- 冒号不能省略
- IN建议大写
- 语句必须从第二列单元格写起
- :for ${变量} IN RANGE 初值 终值
语句
- IN RANGE建议大写,放在一个单元格中,中间有空格
- 初值可以省略,默认从0开始
- 初值和终值放在不同单元格中
- 终值不被使用,而是到终值-1
- 自定义关键字
- 右击测试套件→New User Keyword
- 可以设置进入的参数
- exit for loop
- @{列表名} create list 值1 值2 …
:for ${变量名} IN @{列表名}
语句
run keyword if '${变量名}'=='值' exit for loop
- 建议使用@{列表名},字典使用&{字典名}
- '${变量名}'=='值'
- 都要加引号
- exit for loop可以根据条件退出循环
- continue for loop
- 提前进入下一轮循环
6、发送请求与处理响应
6.1创建会话
- create session 会话名 url地址
- 返回session对象,无需存储结果
- url地址中携带http、域名或IP、端口号
- 如http://wthrcdn.etouch.cn
6.2发送请求
使用 聚合数据 的天气预报接口举例
- get请求
- ${响应结果} get request 会话名 /路径?参数名=值
- ${字典名} create dictionary 参数1=值1 参数2=值2
${响应结果} get request 会话名 /路径 params=${字典名}
- params关键字不能省略
第一种传参:
第二种传参:
- post请求
- &{headers字典名} create dictionary content-type=application/x-www-form-urlencoded
${响应结果} post request 会话名 /路径 data=${字典名} headers=${headers字典名}
- 需将content-type存入headers,有时候不加会出错
- data不能换成params
6.3处理响应数据
- 获得响应正文
- ${响应结果.content}
- 二进制编码
- ${响应结果.text}
- unicode码形式的正文
- ${响应结果.content.decode("utf-8")}
- 转码为utf-8
- json格式
- ${json变量} to json ${响应结果.content} pretty_print=True
- 美化json显示
- pretty_print=True
- 获取json中的的项
- ${变量} get from dictionary ${json变量} 字典关键字
- get from dictionary表示根据字典关键值取值
- to json是不能使用pretty_print=True
去掉美化显示
- 获得响应状态码
- ${响应结果.status_code}
log ${res.status_code}
- 获得响应cookies
- ${响应结果.cookies}
- 返回RequestsCookiesJar对象
- 结果是字典形式,Cookie与for间的内容为cookies参数与值
- ${响应结果.cookies}[参数名]
- 获得某个cookies参数的值
- 参数名区分大小写
- 参数无需引号
- ${cookie} get from dictionary ${响应结果.cookies} cookies参数名
- 将取到的cookies存到自定义cookie变量
- 获得响应头
- ${响应结果.headers}
- 也可在${响应结果.headers}中取到cookies
- ${cookie} get from dictionary ${响应结果.headers} Set-cookie
- Set-cookie一般是关键字
- ${cookie} fetch from left ${cookie} 右边的分割字符串
- 根据指定字符串拆分,然后去左边的串,结果重新存储
- 需要导入String包
- 发送cookies数据
- ${响应结果} get request 会话名 /路径?参数=值&cookie参数名=值
6.4正则表达式查找数据
- ${结果} get regexp matches 源字符串 (?i)正则表达式 1
- 需要导入String包
- 源字符串必须是字符串格式
- 如${响应结果.text}
- (?i)
- 忽略大小写
- 正则表达式需要使用( )包含
- 一对( )一个模式
- 1表示匹配第几个模式,且只输出匹配到的字符串
- 结果是列表形式
- ${结果}[0]
- 获得结果列表中的第1个
- 结果是字符串形式
6.5变量转存
- ${结果} convert to string 源变量
- 将变量转换为字符串
- 变量严格区分大小写
7、断言
- ${变量} Should Be Equal 变量1 变量2 断言失败消息
ignore_case=True
- 判断是否相等,变量1相当于实际结果,变量2相当于预期结果
- 返回值接收变量可以省略
- 断言成功时返回None,否则无返回值
- 输出日志
- 断言失败信息+变量1!=变量2
- ignore_case=True
- 表示忽略大小写
- ${变量} Should Contain item1 item2 断言失败消息
ignore_case=True
- 断言item1中是否包含item2
- 通过时返回None,否则无返回值
- 失败时,输出断言失败消息与失败原因
- ${变量} Should Match Regexp 变量1 (?i)left正则表达式模式right 断言失败消息
- 搜索变量1中匹配正则表达式的字符串
- (?i)表示忽略大小写
- left表示模式左边的字符串,right表示模式右边的字符串
- 模式一般需要使用( )包含,一对( )是一个模式
- 若匹配,则返回列表,第一个元素是原数据,后面的元素是匹配到的数据
- 若不匹配,则输出断言失败消息+失败原因
- ${变量} Should Match Regexp 变量1 \\d{6}
- 搜索变量1中一开始的连续6个数字字符串
8、参数化
8.1列表参数化
- 获得省或直辖市的名称
- ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionProvince
- 断言失败继续运行
- ${断言的结果变量} run keyword and continue on failure 断言
8.2文件数据参数化
- 创建模块,至少定义函数,建议使用参数和返回值。
- 将py文件(即自定义库)拷贝到Python\Lib\site-packages下,在RF用导入Library的方式导入。
- 在用例中直接使用返回值、函数名、参数。
- 使用循环处理行、列数据。
9、命令行运行
- 查找\Python\Scripts中是否有pybot.bat,如果没有,自行创建,输入:
@Echo off
python -m robot.run %*
- 运行测试
- pybot test.robot
- 运行指定文件
- pybot *.robot
- 运行当前目录下以.robot为后缀名的测试文件
- pybot test_a
- 运行当前test_a目录下的所有用例
- pybot ./
- 运行当前目录下的所有的测试文件