1、介绍
1.1、介绍Robot
Robot Framework是一个基于关键字驱动的自动化测试框架。通过该框架,测试人员可使用python封装关键字,并在非代码环境下使用关键字构建可被执行的测试用例
Robot Framework官方网站:http://robotframework.org/
1.2、安装
1.2.1、Robot Framework
Robot Framework支持Python和Jython,本文档针对ubuntu下Python进行讲解
下载地址:https://pypi.python.org/pypi/robotframework,下载最新版本安装包如果是windows可直接下载exe安装包,ubuntu可使用tar.gz包进行源码安装,当然windows也支持源码安装
下载完后解压tar包并进入文件夹内执行sudo pythonsetup.py install便可完成安装。安装完成后可在终端执行pybot--version测试是否安装成功
1.2.2、Robot Framework IDE(RIDE)
RIDE是Robot的第三方测试用例编辑器,可编辑用例,编辑关键字等并生成HTML,TXT等格式的文件。同时RIDE可直接可进行测试执行。RIDE是基于wxPython进行开发,所以安装RIDE前需要先行安装wxPython,其官方网站为:http://www.wxpython.org/
windwos下可字节下载exe包进行安装
ubuntu下通过终端命令行方式进行安装,方法如下:
1,curl http://apt.wxwidgets.org/key.asc | sudo apt-key add –
2,修改/etc/apt/sources.list文件,追加如下内容
deb http://apt.wxwidgets.org/ gutsy-wx main
deb-src http://apt.wxwidgets.org/ gutsy-wx main
3,sudo apt-get update
4,sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
5,sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev libgtk2.0-dev
完成wxPython安装后可进行RIDE安装
下载地址:http://code.google.com/p/robotframework-ride/,安装方法同robot安装包
1.2.3、官方快速入门和example
下载入门手册:robotframework-quickstart-20090113.zip并解压,进入文件夹后可看见一个quickstart.html,打开该文件可看到官方的快速入门的文档。同时在终端中进入到该文件夹执行命令pybot quickstart.html便可看到robot执行了一系列测试。这种帮助文档就是example本身的例子并不多见,其原理就是robot可识别html页面中的表格,只要表格的内容和robot执行用例的语法,便可成功执行用例。执行完毕后可看见当前文件夹下生成了report文件,可查看这份报告
2、简单使用Robot Framework
2.1、Hello World
在/home下建立demo用的文件夹例如名为robot_test。在终端中使用命令ride.py打开RIDE编辑器。点击RIDE菜单栏File->Open Directory选中robot_test文件夹,然后确定。
在robot_test目录下新建一个RobotTest.py然后再文件内编写python代码,如下
- import os
- import sys
- class RobotTest:
- def first_keyword(self):
- fp = open("/tmp/robot_fk", "a")
- fp.write("this is the first keyword\r\n")
- fp.close()
这样一个TestLib文件就创建完成了,之后在RIDE中创建测试用例:
在RIDE的最上侧菜单栏选择File->New Project后如下
在右侧编辑框拉开Setting选项如下
点击Documentation的大文本编辑框,输入一下文本,可输入中文然后保存,便在可在robot_test目录下生成一个robot_test.html的文件可打开查看样式
首先需要加载刚编辑的RobotTest.py这个库,方法为,点击左侧Robot_Test,在右侧找到Library按钮点击,并点击浏览找到RobotTest.py文件
然后添加用例
在RIDE中右键点击Robot_Test选择New Test Case,输入用例名,比如first case
后点击first case便可看到用例编辑框,在下面的表格中加入第一个关键字first keyword如下
这样一条简单的用例就完成了
用例执行:
点击RIDE最上测得按钮如图
便可看到RIDE开始执行测试用例,执行完毕后如下图
之后进入/tmp目录下看到一个robot_fk文件,可打开看到一串字符this isthe first keyword,这意味着我们的测试成功了。
2.2、Robot工作原理简述
Robot的测试用例和配置使用HTML,TXT等格式文件进行编辑,html是比较常用的一种格式,通过html绘制的表格形式来编辑用例可阅读性较高。
Robot通过识别html表格中的表头来确定该表格的配置是做合使用,例如Settings用来配置资源库,Test Cases用来编辑测试用例,Variables用来配置默认的变量等等。
每个robot工程开始工作时会通过Settings加载相关的资源,通常为TestLib,或者导入其他的配置文件等等,然后找到所有的Test Cases表格并顺序执行每个case。每个测试用例的每个步骤通常都是有一个关键字来执行操作该步骤。Robot会去Settings中指定的library中寻找该关键字,如果找到则执行该关键字所对应的代码,如果在Lib代码中无法找到该关键字,则寻找html的表中表头为Keywords的表格,如果也无法找到则会报错。执行测试用例时每个步骤都执行完且没有报错,则认为该条用例为pass。
3、Robot Framework详解
3.1、Robot的格式
官方文档所描述的配置如下图
而是用RIDE编辑所生成的html文件格式如下:
如果使用其他html编辑器来编辑robot相关配置,建议编辑成官方说明中的标准样式。
3.2、TestLib
TestLib是robot框架关键字部分的核心,它的作用就是用来封装底层关键字。Robot自带了一部分非常常用的TestLib如XML,String等,也有别人开发的第三方的TestLib比如web页面测试相关,Database相关,在robot中只需要正确导入这些库,那么就可以使用这些lib中封装的关键字。而在自动化测试开发中,最重要的过程就是开发出优秀的TestLib,封装出复用性强,清晰明了的关键字。
TestLib编写规则:
1,TestLib是一个python文件,里面写的python代码,所以TestLib通常是.py结尾的。
2,TestLib只且只有一个class,并且该class的名字和TestLib文件名相同。如2.1介绍的RobotTest.py中定义的class的名字也是RobotTest
3,class中所定义的函数便是robot中的底层关键字,所以一些私有函数,不打算作为关键字对外开放的建议将函数名以“__”开头
4,class中函数名定义通常为defabc_def_ghi(self, xxx):这样的格式,单词之间使用下划线分隔,这样的定义的函数名在编辑测试用例时可直接使用关键字abc def ghi或者Abc Def Ghi也是允许的。所以class中定义函数的时候建议只使用小写字母和下划线的方式,这也符合python的编程规范。
5,其他规范符合python的规范,比如使用os,sys等系统函数该import的就还是要import
符合上述条件的TestLib就可以被robot使用。读者可以自行建立一个TestLib并实现一两个关键字并在RIDE中导入,导入方法参考2.1的例子,导入后如果RIDE中该库颜色显示是红色的,说明很有可能该TestLib有点问题,最直接的问题就是class名和文件名不同导致找不到该Lib,或者头部import某库就出错了。
3.3、Robot的主配置(html)
凡是使用RIDE编辑的html无需太关心格式问题,所以具体跟表格格式相关的问题不再赘述,现介绍一些常用的配置,这些配置通常在RIDE中都能找到,只需要填写内容即可。以下描述还是以2.1节中的example为例
3.3.1、Setting
点击RIDE中的Robot Test看到右侧的Settings打开可看到较多配置
3.3.1.1、Documentation
描述文档,通常用来描述该html的作用,类似帮助文档或者说明
3.3.1.2、Suite Setup
每个Test Suite启动时执行的动作,用法同测试用例中的关键字
3.3.1.3、Suite Teardown
每个Test Suite结束的时候执行的动作,用法同测试用例中的关键字。
3.3.1.4、Test Setup
每个Test Case启动时执行的动作,用法同测试用例中的关键字。如果在某个具体的Test case中指定了Setup则执行case里的setup而不执行setting里的Test Setup
3.3.1.5、Test Teardown
每个Test Case结束的时候执行的动作,用法同测试用例中的关键字。同样case里的Teardown会将setting里Test Teardown覆写。
3.3.1.6、Test Timeout
用例超时时间,超过该时间还未执行完毕的用例将被强制退出。单位为秒,也可以写成如下形式,用RIDE输入的时间自动会转成如下形式
3.3.1.7、Tags
Tags作为用例的标记,在robot中是非常常用的。在setting中可配置Force Tags和Default Tags,也可在用例中配置Tag,Tag的作用在后面描述
3.3.1.8、Library
指定TestLib,系统自带的或者已经安装的TestLib可直接输入名字,自己编写的TestLib就需要加入路径,相对路径绝对路径均可,相对的是该html文件的路径
3.3.1.9、Resource
引入一个资源文件。通常一份比较好的robot用例中包含就是跟该用例相关的关键字,用例和一些基本配置等等,如果需要用到很多公共的模块,公共的关键字,这些公共资源通常会编辑成一个独立的html,这样业务相关的html便可引用
3.3.2 、Testcases
本节开始描述如何编写测试用例。
3.3.2.1、编写方法
上图是官方的帮助文档中描述的Test Case表格的样式。第一列为用例名,第二例开始往后便是用例的动作。如果该用例不止一个动作那么步骤2的动作要写到步骤1动作的下方,即步骤2的第一列要空出,如下例子
Case One | Keyword A | arg1 | arg2 | |
Keyword B | arg1 | arg2 | arg3 | |
Case Two | Keyword C | |||
Keyword D | arg1 | arg2 |
两个case均有2个步骤,而robot识别case就通过如果第一列为非空则认为该行是一个新的case。
上例的表格缺少表格头,官方的样式表头是第一列是Test Case,第二列是Action,第三列以后的是Argument,事实上不一定所有的case的第二例都是Action,有可能的是返回值,有些keyword可能还会返回2个返回值甚至更多,那么在Action之前可能还要占用更多格的空间。RIDE编辑生成的用例表表头只有Test Cases。所以一般的用例的形式通常为:
用例名 | 返回值 = | 关键字 | 参数1 | 参数2 |
3.3.3.2、变量
在编写测试脚本时,每个步骤之间并不是独立的。往往需要前一步骤的输出传入给后一步骤的输入。在代码中可以使用变量来传递这些值,但是如果在表格中编写测试用例,想要传递参数并不是那么容易的事。Robot提供了这样的变量机制,能够在编写用例轻松传递参数。
变量的定义方式为${变量名},通过该方式可定义变量,并给变量赋值,和作为参数传入。举个例子,定义个测试用例名为var case,并且有两个关键字第一个为get var,有1个返回值,没有输入参数,功能获取var的值。另一个关键字为set var,有1个输入参数,没有返回值,功能设置var值。Var case的步骤先调用get var获取var然后调用set var并传入该值。如下:
var case | ${test_var}= | get var |
set var | ${test_var} |
上述用例中定义了${test_var}这个变量用来取值和赋值。如果作为返回值需要复制,就写在关键字操作前并加入=,如果作为参数传值写在关键字操作后,参数需要注意顺序。
学会使用变量,并知道关键字如何使用,基本就可以编写测试用例了,下面介绍Test case中一些常用的配置。在case中的配置需要使用”[ ]”进行标示
3.3.2.3、Documentition
和setting中的一样,用来做一些注释,描述等等,在robot执行时会把这些内容打印出来
3.3.2.4、Setup
当case启动时首先会执行的操作,如果这里定义的Setup则setting中的Test Setup将失效。
3.3.2.5、Teardown
当case结束最后会执行的操作,如果在这里定义了Teardown则setting中的Test Teardown将失效
3.3.2.6、Timeout
用例超时时间。
3.3.2.7、Tags
和setting中tags一致,用于给用例做标记。
3.3.3、Keyword
Robot作为关键字驱动的测试框架,Keyword是其用例层最核心的内容。TestLib中定义的函数,可作为Keyword在用例编辑时使用。同时用户可自定义Keyword,而用户自定义的Keyword通常是底层TestLib中的Keyword的组合和封装。TestLib中的keyword的功能是最为简单单一的。如果测试用例全部使用Testlib中的keyword那极有可能一个用例包含十几个步骤甚至更多。这样的用例逻辑性和可读性是很差的。阅读用例的人可能只关心某一步骤做什么,并不关心是怎么做的,比如数据处理完的下一步骤是验证结果。验证结果可能需要处理数据库,写文件,解析数据结构等等。这些事应该上层写用例的人可能不关心,或者也不想关心。良好的Keyword封装能够让用例编写更轻松,用例质量也越高
3.3.3.1、Keyword编写方法
官方定义的Keyword表格样式如下
和Test case定义方式是一样的。在RIDE中可以如下创建一个Keyword。右键点击Robot Test选择New User Keyword,并取名为my keyword。
这里使用2.1中的例子,在my keyword中调用两次first keyword
保存后的html样式为
然后编辑first case,让它的测试步骤为调用一次my keyword
编辑完成执行first case用例,然后查看/tmp/下的robot_fk文件,每执行一次就会增加两行”this is the first keyword”。
需要注意的是,用户定义的Keyword不能和Testlib中的Keyword重复。由于robot在执行用例时首先回去TestLib中搜索Keyword,如果用户定义了和TestLib中重复的Keyword,那该Keyword将无法被执行到。
3.3.3.2、Keyword的输入和输出
如果把一个Keyword当成一个函数,那除了函数处理流程,用户最关心的便是输入和输出。输入便是参数,输出便是Keyword的返回值。下面通过一个例子来说明关键字的输入和输出。首先在2.1中使用的RobotTest.py中增加两个方法,第一个方法名为plus,输入参数2个,功能是返回两个参数的和。另一个方法名为multi,输入参数为3个,功能是返回3个参数的乘积。定义个关键字名字为alg keyword,有3个输入参数,1个返回值,其功能是三个参数两两求和,将3个和求乘积并返回。在RobotTest.py添加如下代码
- import os
- import sys
- class RobotTest:
- def first_keyword(self):
- fp = open("/tmp/robot_fk", "a")
- fp.write("this is the first keyword\r\n")
- fp.close()
- def plus(self, arg_a, arg_b):
- return int(arg_a) + int(arg_b)
- def multi(self, arg_a, arg_b, arg_c):
- return int(arg_a) * int(arg_b) * int(arg_c)
在RIDE中新建一个keyword命名为alg keyword。使用[Arguments]声明参数如下所示。
在RIDE中编辑参数的方式为
然后在alg keyword编辑测试步骤,如下
保存后html页面为
这里RIDE在生成html页面时为了限制表格列数,将${c}另起一行并在前使用...表示这是与上一行的连接。最后加入[Return]返回${d}的值
在RIDE中在Return Value中添加返回值,完整的keyword编辑如下
完成Keyword后在RIDE中添加一个测试用例命名为second case,调用alg keyword并传入参数1,2,3,并将返回的值进行打印
编辑完后勾选second case并点击按钮执行。
执行结果如下
上面的执行结果显示alg keyword在second case里被正确使用了,也返回了正确的值。通过这种函数可以将单一的关键字封装成高级关键字。Keyword也还有其他常用配置
3.3.3.3、Documentation
和setting中的一样,用来做一些注释,描述等等。
3.3.3.4、Teardown
关键字执行完成时最后会执行的操作。关键字在执行过程中如果遇到错误便会终止,如果后续操作中有资源释放,这些操作就不会执行,可能会导致系统崩溃,内存泄露等,所以可以在Teardown中加入资源释放的操作。
3.3.4、Variable
Robot可以在case之外单独定义一些变量,这些变量可以设置默认值。这个更像是代码中的全局变量。当有一些公共的配置,在每个测试用例都可能用到,比如ip地址,端口号,默认的用户名和密码等等。全局变量的定义时建议全部使用大写字母。在3.3.3的示例中,second case使用alg keyword使用了参数1,2,3,这里可以使用全局变量来替换。
首先在RIDE中创建全局变量,在RIDE中右键点击Robot Test选择New Scalar,然后给变量命名并设置默认
同样方法再创建两个全局变量,完成后可查看html表格
之后修改second用力,将这三个参数代替原本的1,2,3传入到用例中
之后点击运行查看结果。
4、Robot高级应用
掌握上述Robot应用便可完成大部分测试用例,另外Robot还提供了一些功能更强大的关键字可让用例编写更灵活
4.1、If分支
Robot支持if判决能让用例执行时根据不同情况执行不同操作。If相关的关键字是”Run Keyword If”,”ELSE IF”,”ELSE”
利用3.3.3中创建的plus关键字,创建一个用例调用plus输入两个参数,如果返回的值小于0,则打印loga,大于等0,小于10打印logb,大于等于10打印logc。首先在RobotTest.py里增加三个函数分别打印loga,logb,logc,调用robot中的logger需要导入robot的api包
然后新建一个用例名为third case之后编辑用例,如下
之后可以尝试修改plus的参数进行测试查看结果。
If有个比较特殊的地方,如果判断一个变量是否为某个字符串,不能直接用${ret}去判断,需要给${ret}加引号如下:
RunKeyword If | ‘${ret}’== ‘abc’ | Dosomething | arg1 |
如果不加引号,使用 ${ret} == ‘abc’,假设${ret}的值是qwe,执行时会报错,告诉你qwe这个变量没有定义。这种情况看来,robot将变量的值,当做代码里的变量名处理,所以需要加上引号当字符串处理。这是python的强大之处吧,可以通过字符串转化成一个变量的名字。
关于if的用法还有许多技巧,详细看官方的帮助文档
http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html?r=2.8.1
4.2、循环
Robot可以使用For循环反复执行一些操作,比较常用的做法是假如某个操作返回一各列表,而下一步需要分别处理列表里的每个元素,那么需要如下操作:
${table_list}= | Dosomething | ||
:FOR | ${table} | IN | @{table_list} |
Dofirst step | ${table} | ||
Dosecond step | arg2 |
使用:FOR 和IN便可遍历列表中的元素,不过需要注意的是使用FOR遍历时需要将变量通过@转换成一个列表,否则无法正确遍历。遍历过程中可通过关键字” Exit For Loop”终止循环。FOR循环也支持多种方式,比如IN RANGE可以设置遍历次数,或者直接在某几项元素中遍历,详细可以看帮助文档for loop一节
http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html?r=2.8.1#for-loops
4.3、Tags
之前提到过Tags的概念,是用于给用例做标记。用户可以在setting中设置force tags和default tags,也可以在用例中使用[Tags]来给用例标记。Tags最直接的应用就是,可以有选择的执行测试用例。比如有10个用例,其中5个用例使用[Tags]标记为group_a,另外5个标记为group_b。当使用pybot执行用例时假如加上参数--includegroup_a那么robot只会执行有group_a标记的用例,如果使--excludegroup_a那么robot除了group_a的用例不执行,其他都执行,并且一个用例可以加多个tags。在版本测试中,可以通过给用例增加tags,比如某个产品有100个用例,1.0版本需要测试的用例都加上1.0的tags,1.1的版本需要测试用例都加上1.1的tags,这样在执行用例时就可以通过tags来区分版本,很方便。
在setting中可以设置Default Tags和Force Tags。使用这两个配置后可以不用单独给每个用例增加Tags,使用这些配置会让用例增加哪些Tags,请看
上述链接中描述了Force Tags,Default Tags和用例自身的Tags是如何并存的。
4.4、pybot
pybot是robot的执行程序,事实上RIDE执行用例也是利用pybot,所以了解pybot的使用方法很重要。
最简单的用例执行就是pybot xxx,其中xxx就是robot的资源文件。就像1.2.3中的quickstart.html。使用该命令就可执行测试。通过pybot--help可以看到帮助手册。常用的如--include,--exclude,--argumentfile,--listener,--variable,还可以设置日志输出的路径等,等用户需要使用时可查看帮助
转自:http://blog.csdn.net/yydoraemon/article/details/13847781