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 ./
- 运行当前目录下的所有的测试文件