2小时入门Robot Framework

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文件夹,然后确定。

2小时入门Robot Framework

在robot_test目录下新建一个RobotTest.py然后再文件内编写python代码,如下

  1. import os
  2. import sys
  3. class RobotTest:
  4. def first_keyword(self):
  5. fp = open("/tmp/robot_fk", "a")
  6. fp.write("this is the first keyword\r\n")
  7. fp.close()

这样一个TestLib文件就创建完成了,之后在RIDE中创建测试用例:

在RIDE的最上侧菜单栏选择File->New Project后如下

2小时入门Robot Framework

在右侧编辑框拉开Setting选项如下

2小时入门Robot Framework

点击Documentation的大文本编辑框,输入一下文本,可输入中文然后保存,便在可在robot_test目录下生成一个robot_test.html的文件可打开查看样式

首先需要加载刚编辑的RobotTest.py这个库,方法为,点击左侧Robot_Test,在右侧找到Library按钮点击,并点击浏览找到RobotTest.py文件

2小时入门Robot Framework

然后添加用例

在RIDE中右键点击Robot_Test选择New Test Case,输入用例名,比如first case

2小时入门Robot Framework

后点击first case便可看到用例编辑框,在下面的表格中加入第一个关键字first keyword如下

2小时入门Robot Framework

这样一条简单的用例就完成了

用例执行:

点击RIDE最上测得按钮如图

2小时入门Robot Framework

便可看到RIDE开始执行测试用例,执行完毕后如下图

2小时入门Robot Framework

之后进入/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的格式

官方文档所描述的配置如下图

2小时入门Robot Framework

而是用RIDE编辑所生成的html文件格式如下:

2小时入门Robot Framework

如果使用其他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打开可看到较多配置

2小时入门Robot Framework

3.3.1.1、Documentation

描述文档,通常用来描述该html的作用,类似帮助文档或者说明

2小时入门Robot Framework

3.3.1.2、Suite Setup

每个Test Suite启动时执行的动作,用法同测试用例中的关键字

2小时入门Robot Framework

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输入的时间自动会转成如下形式

2小时入门Robot Framework

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、编写方法

2小时入门Robot Framework

上图是官方的帮助文档中描述的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执行时会把这些内容打印出来

2小时入门Robot Framework

3.3.2.4、Setup

当case启动时首先会执行的操作,如果这里定义的Setup则setting中的Test Setup将失效。

2小时入门Robot Framework

3.3.2.5、Teardown

当case结束最后会执行的操作,如果在这里定义了Teardown则setting中的Test Teardown将失效

2小时入门Robot Framework

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表格样式如下

2小时入门Robot Framework

和Test case定义方式是一样的。在RIDE中可以如下创建一个Keyword。右键点击Robot Test选择New User Keyword,并取名为my keyword。

2小时入门Robot Framework

这里使用2.1中的例子,在my keyword中调用两次first keyword

2小时入门Robot Framework

保存后的html样式为

2小时入门Robot Framework

然后编辑first case,让它的测试步骤为调用一次my keyword

2小时入门Robot Framework

编辑完成执行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添加如下代码

  1. import os
  2. import sys
  3. class RobotTest:
  4. def first_keyword(self):
  5. fp = open("/tmp/robot_fk", "a")
  6. fp.write("this is the first keyword\r\n")
  7. fp.close()
  8. def plus(self, arg_a, arg_b):
  9. return int(arg_a) + int(arg_b)
  10. def multi(self, arg_a, arg_b, arg_c):
  11. return int(arg_a) * int(arg_b) * int(arg_c)

在RIDE中新建一个keyword命名为alg keyword。使用[Arguments]声明参数如下所示。

2小时入门Robot Framework

在RIDE中编辑参数的方式为

2小时入门Robot Framework

然后在alg keyword编辑测试步骤,如下

2小时入门Robot Framework

保存后html页面为

2小时入门Robot Framework

这里RIDE在生成html页面时为了限制表格列数,将${c}另起一行并在前使用...表示这是与上一行的连接。最后加入[Return]返回${d}的值

2小时入门Robot Framework

在RIDE中在Return Value中添加返回值,完整的keyword编辑如下

2小时入门Robot Framework

完成Keyword后在RIDE中添加一个测试用例命名为second case,调用alg keyword并传入参数1,2,3,并将返回的值进行打印

2小时入门Robot Framework

编辑完后勾选second case并点击按钮执行。

2小时入门Robot Framework

执行结果如下

2小时入门Robot Framework

上面的执行结果显示alg keyword在second case里被正确使用了,也返回了正确的值。通过这种函数可以将单一的关键字封装成高级关键字。Keyword也还有其他常用配置

3.3.3.3、Documentation

和setting中的一样,用来做一些注释,描述等等。

2小时入门Robot Framework

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,然后给变量命名并设置默认

2小时入门Robot Framework

同样方法再创建两个全局变量,完成后可查看html表格

2小时入门Robot Framework

之后修改second用力,将这三个参数代替原本的1,2,3传入到用例中

2小时入门Robot Framework

之后点击运行查看结果。

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包

2小时入门Robot Framework

然后新建一个用例名为third case之后编辑用例,如下

2小时入门Robot Framework

之后可以尝试修改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,请看

http://robotframework.googlecode.com/hg/doc/userguide/RobotFrameworkUserGuide.html?r=2.8.1#tagging-test-cases

上述链接中描述了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

上一篇:java.lang.NoClassDefFoundError: javax/servlet/ServletContext


下一篇:leetCode刷题(找到最长的连续不重复的字符串长度)