一. 关于RobotFramewrok
1.介绍RobotFramewrok
中文名:机器人框架?😮不必纠结,机器人=自动化,自动化框架。
来自百度:
Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。
用我的话说就是,这是一款支持GUI和命令行的,开源的,使用Python编写的自动化测试框架/工具。
说他是框架,因为是在执行和调度上都是一样的,具体写的内容可以使用现成的,也可以自定义自动化lib。
说他是工具,那是因为安装好结合现成的selenium2library,可以直接上手用于UI自动化。
robotframework的工作逻辑
2.RobotFramewrok优缺点
优点:
跨平台,常用Linux平台(Centos,Ubuntu,Debian等),Windows和macOS
基于Python,学习和维护成本低,易扩展
集成方便,且自带良好的报告和日志输出(例如jenkins+robot插件执行并输出报告)
管理和执行方便,可在命令行指定也可以在Gui界面上标识。
支持Web测试,Api测试,Socket测试等(除了已有成熟的lib,还可以自己写lib来解决)
支持PC端Ui自动化(Selenium2Library+robotframework),接口自动化,移动端自动化(appium+robotframework,其中IOS需要在OSX上操作)
可以写中文脚本!😮(是的,只要你想)
缺点:
做接口自动化的时候,返回值非标准json格式
界面反应有时候略慢
修改引用lib后需要重新打开项目
Gui界面加载项目不能显示其他格式文件(如txt,图片,xml等)
不支持性能测试
3.为什么推荐RobotFramework做自动化
本身该工具,对于case的管理,执行和调试,日志,到最后的输出报告,都做的不错。相比纯代码,减少很多工作量,而因为基于python,可自定义lib,相对来讲还是比较灵活的,具有一定的可扩展性。
对于纯代码写自动化,上手要快很多,尤其是写UI自动化,可以减少代码量和时间。适用于测开+业务测试并存的团队,由测开人员开发好lib,业务测试的同学也可以直接使用开发好的关键字写case。
二. 安装和环境配置
1.注意事项
⚠ 网上很多老的教程会让你使用python2.7,然后wxpython使用2.8.1的版本,那是因为当时robotframework-ride当时还不支持python3。但是,现在已经支持了,所以别再用python2来写了,都下最新的就好了。
2.依赖模块
安装robotframework框架
1 | pip install robotframework |
安装wxpython图形库
1 | pip install wxpython |
安装robotframework-ride 图形界面组件(创建,组织,运行)
1 | pip install robotframework-ride |
安装robotframework-selenium2library 基于Web的Ui自动化依赖
1 | pip install robotframework-selenium2library |
PS: 假如只需要命令行执行的话那么,robotframework-ride和wxpython就不需要安装。
3.运行
在python安装目录下有一个Scripts目录,找到ride.py即可打开图形界面。
4.环境配置
一般我们在图形界面调试,在命令行执行,而在命令行执行就需要使用到命令robot。
这个命令在Scripts目录下,如果以前没加到环境变量的path目录,需要把这个目录上去。
三.运行
1.Gui界面
2.命令行执行
⚠ 百度出来很多让你使用pybot(另还有jybot和ipybot),不在推荐,统一使用robot来替代,根据我下载的最新的稳定版本,pybot已经移除了。
上面说我们在环境变量里加过scripts目录了,而我们要用的就是pybot。如下图。
pybot –outputdir ./report/ ./main/
–outputdir看下面具体解释,是指报告输出目录。
./main/是我的case主体所在目录,没加其他条件,默认他会找寻目录以及子目录下所有可执行的case。
3.命令行常用参数
指定报告输出地址: –outputdir [报告输出目录] [需要执行的目录]
> pybot --outputdir ./report/ ./main/
>
> 等同于 pybot -d,如果不需要输出报告,也可以直接pybot [需要执行的目录]
>
> 输出内容包括log.html, report.html 和 output.xml等。-o、-l和-r`参数用来分别设置 output.xml、log.html和 report.html的输出路径和文件名称
执行指定case: -t –test [casename]
根据用例名称来选择要运行的用例,空格和大小写不敏感。名称也可以是一个简单的正则表达式:”*” 匹配任意内容,”?”匹配单个字符。例:robot -t te?t helloRobot
执行指定suite: -s –suite [suitename]
根据用例集名称来选择要运行的用例集。当此参数和–test,–include或–exclude一同使用时,只有满足全部 筛选条件的用例才会被执行。
名称同样可以是一个简单的正则表达式(和–test类似),另外还可以使用”.”来表示层级关系,如:-s X.Y,表示仅执行X下的Y子集的用例。
指定tag: -i -include [tagname ]
选择并执行指定tag的用例。空格和大小写不敏感。同样可以使用简单的正则表达式:”*” 匹配任意字符,”?”匹配单个字符。
如有多个tag可以 -i aa -i bb这样,同时该参数支持AND OR NOT, 例如要执行同时包含aa和bb两种标签的case (case和suite 本身就可以添加多个tags) -i aaANDbb
执行非指定tag: -e –exclude [tagname]
-e参数的作用和-i相反,它是选择并执行非指定tag的用例。用法和-i完全相同。
失败用例重跑: -R –rerunfailed [output_path]
-R参数它的作用是从output file中选择失败的用例重跑。
但是如果上一次用例全部成功,那么加上-R参数会报错: failed: All tests passed。
标记重要tag: -c –critical [tagname]
用来表示tag的重要程度,一般只在测试报告中会展示。如果不使用-c tag,默认所有运行的tag都是critical tag。
标记不重要tag: -n –noncritical [tagname]
和上面相反,默认都是critical,-n标记了报告上显示non-critical
给自定义变量赋值: -v –variable params:[value]
例如需要在不同环境执行,一些配置项不同,项目global里有一个全局变量叫env(PS:在robotframework引用的地方写 ${env})
pybot -v env:prd ./casename
这样执行用例,并且给env赋了值
四.使用
1.简明语法概要
关键字是蓝色
创建和引用的有效变量是绿色
引用未定义的变量是紫色(仅限Scalar,List和Dict使用${}在一些场景下也可以调用,但也显示紫色)
注释是褐色
其他显示成黑色
当这行关键字后面多传或少传了必传变量背景会变红
2.变量和关键字
对于关键字,不论是系统自带,第三方还是自己编写的function,直接写就好,正确使用是蓝色字体,不是的话说明有问题了,要么是刚引入没反应过来需要重新打开目录要么是写错了没这个关键字。而变量在定义后可视作是关键字。
关键字具有作用域。
局部变量
自定义变量
局部变量的定义有三种: Scalar, List 以及 Dict
类型 | 定义方式 | 使用关键字 | 引用方式 |
---|---|---|---|
Scalar | ${name} | set variable | ${name} |
List | @{name} | create list | log和should中${name},其他地方@{name} |
Dict | &{name} | create dictionary | log和should中${name},其他地方&{name} |
Scalar示例:
变量的赋值和引用都使用${param_name}的格式
使用关键字 set variable来新建变量
格式: [param_name] set variable [param_value]
param_value也可以是引用的其他变量或者自定义关键字的返回值
List实例:
创建list使用 create list(也可以用set variable,但是一般用create list)
三种创建方式:
查看执行结果
通过断言可以看到,三种定义,结果是一样的。
Dict实例:
两种定义方式
&{dict} create dictionary a=1 b=2
&{dict} create dictionary a 1 b 2
log的时候两种调用方式
log ${dict} # dict类型 (可以执行,但是语法检测会抛紫色)
log‘@{dict}’ # string类型
log ‘@{dict}’
还可以使用log ${dict}
⚠ dict和list,如果使用标准方式定义,在log和should引用的时候,一般都使用${name}的方式。
但s如果是做拼接,例如新建dict,以另一个dict为基准,加上其他key:value,则使用&{name}
示例:
自定义方法作关键字
自定义方法作为关键字,例如写个方法获取当前时间
放在libs下,在case suite处导入,在case中使用
此处关键字就叫get_now
在case中可以使用
全局变量
TODO
内置关键字
TODO
五.robotframework的报告
按重要性筛选
按tag筛选
按suite筛选
自定义搜索
Log详情
六.其他
1.全局关键字的使用
TODO
2.无头模式的使用(headless)
⚠ 早期很多教程都是推荐的PhantomJS 无界面浏览器,但是这个软件已经很久不更新了,开发团队也闹崩了。Chrome和Firefox也都有了自己的headless模式,可以直接使用,不再推荐使用PhantomJS,这里也将以Chrome为例。
TODO
七.Web UI测试
示例:登陆并新建手工入库单
web的ui测试,用到了Selenium2Library库,在suite上引入就好了
八.接口测试
TODO
九.移动端app测试
TODO
十.CS软件测试
TODO
报错信息
目前高版本robotframework经常有一些报错,记录下遇到的问题
AttributeError: ‘NoneType’ object has no attribute ‘SetSize’
发生原因: Python3.8和RIDE版本不适应,会出现RIDE的testcase edit界面显示异常/空白的情况。3.8以下的不会出现。
解决方法:使用下列语句更新RIDE版本:
1 | pip install -U https://github.com/robotframework/RIDE/archive/master.zip |
AttributeError: module ‘robotide.pluginapi’ has no attribute ‘RideLogMessage’
这个问题困扰我很久,在gui界面执行case执行不成功,也没结果返回,控制台不断报错。