第 3 章 Robot Framework 入门

           通过 RIDE 去学习和使用 Robot Framework 框架,对于初学者来说大大的降低了学习难度。所以后面
对 Robot Framework 框架都将会通过 RIDE 中进行。实际上 RIDE 已经成为使用 Robot Framework 的“标配”。

3.1 创建项目

在 Robot Framework 中创建测试项目和创建单元测试项目一致

Robot Framework unittest(Python)
Test ProjectTest Project
Test SuitTest Suit
Test CaseTest Case

3.1.1 创建测试项目

1、创建测试项目
        选择菜单栏 file----->new Project

           
        Name 输入项目名称;Type 选择 Directory。

2、创建测试套件
右键点击“测试项目”选择 new Suite 选项。

Name 输入项目名称;Type 选择 File

3、创建测试用例

右键点击“测试项目”选择 new Test Case。

用例只需要输入用例 name,点击 OK 即可。
完成创建之后的界面如下:

下面我们就可以在 test case 的“表格”来进行测试用例的编写了.

3.1.2 从 F5 开始学习

Robot Framework 并没有像其它框架一样提供一份完整的 API 文档,所以,我们没办法通过官方 API文档进行习。RIDE 提供了 F5 快捷键来打开帮助文档。

search term: 用于搜索关键字。
source:用于选择相关库,默认在所有库下搜索关键字。
创建分上下两部分,上部分显关键字列表,下半部分显示某一关键字的详细说明。你一定很好奇这些
关键字的说明信息是哪儿来的?这说明是由 RIDE 读取的代码函数(方法)的系统注释获得的。在我们学
到开发系统关键字的时候,将会明白这一点。

3.2 测试项目与测试套件的概念

如果你查看当前所创建的项目会发现,“测试项目”是一个目录.

“测试套件”则是一个 txt 文件。

“测试项目”和“测试套件”本质上并没有什么区别,如果你愿意,也可以把测试项目创建成一个文件.

        如果你把“测试项目”创建成一个文件后,那么在这个“测试项目”下就不能再创建“测试套件”了,
只能创建测试用例。
        除非我们所创建的“测试项目”非常小,只需要几个用例。一般情况下,我们会选择将其定义成一个
目录,这样它就可以分成多个套件,套件可定义为不同的业务,不同的业务下再分用例,结构会更加清晰。

        当然,你同样也可以把“测试套件”创建成一个目录。

        如果你把“测试套件”创建成了一个目录后,就不能直接在其下面创建用例了,还需要再创建的“File”
        类型的“子测试套件”。说白了就是用例只能创建在 file 类型的套件中。


下面用一张图来表述他们的关系:

3.3 常用关键字介绍

       在学习一门编程语言的时候,大多教材都是从打印“hello world”开始。我们可以像编程语言一样来学习 Robot Framework。虽然通过 RIDE 提供“填表”一样的写测试用例的方式。但它却有着像编程语言一样的强大的关键字,以及可以开发关键字的扩展能力。
3.3.1 log 就是“print”
log 关键字就是编程语言里的“print”一样,可以打印任何你想打印的内容。


在 test case 中填写以下内容:

logshello world

勾选测试用例,点击工具栏的“Run Tests”按钮或按快捷键“F8”执行测试用例。如图:

在 Run 标签页,将看到执行结果:

通过运行结果中看到,“ INFO:”的“hello world” 就是通过 log 关键字打印的信息。

3.3.2 定义变量

在 robot Framework 中通过“Set variable”关键字来定义变量,如:

${a}Set variablehello world
log${a} 

执行结果:

Starting test: 测试项目.测试套件.test case
20150303 09:35:33.927 : INFO : ${a} = hello world
20150303 09:35:33.927 : INFO : hello world
Ending test: 测试项目.测试套件.test case

3.3.3 连接对象

        “Catenate”关键字可以连接多个信息。

${hi}Catenatehelloworld
log${hi}  


执行结果:

Starting test: 测试项目.测试套件.test case
20150303 10:07:29.039 : INFO : ${hi} = hello world
20150303 10:07:29.039 : INFO : hello world
Ending test: 测试项目.测试套件.test case

       加上“SEPARATOR=”可以对多个连接的信息进行分割。

${hi}CatenateSEPARATOR=---helloworld
log${hi}   

执行结果:

Starting test: 测试项目.测试套件.test case
20150303 10:07:29.039 : INFO : ${hi} = hello--- world
20150303 10:07:29.039 : INFO : hello--- world
Ending test: 测试项目.测试套件.test case

3.3.4 定义列表

通过“Create List”关键字可以定义列表。
例 1

${abc}Create Listabc
log${abc}   


执行结果:

Starting test: 测试项目.测试套件.test case
20150303 10:23:20.760 : INFO : ${a} = [u'a', u'b', u'c']
20150303 10:23:20.762 : INFO : [u'a', u'b', u'c']
Ending test: 测试项目.测试套件.test case

        每个字符串前面加 u,是为了统一编码问题,将字符串转为 Unicode 编码。

例 2

@{abc}Create Listabc
log many@{abc}   

        如果通过“@{}”去定义列表的话,可以通过“log many”关键字进行打印.

执行结果:

Starting test: 测试项目.测试套件.test case
20150303 17:04:30.631 : INFO : @{abc} = [ a | b | c ]
20150303 17:04:30.632 : INFO : a
20150303 17:04:30.633 : INFO : b
20150303 17:04:30.633 : INFO : c
Ending test: 测试项目.测试套件.test case

3.3.5 时间的操作

在 Robot Framework 中也提供操作时间的关键字。

1) Robot Framework 中提供了“get time”关键字用来获取当前时间。

${t}get timehello world
log${t} 


执行结果:
Starting test: 测试项目.测试套件.test case
20150303 17:04:30.628 : INFO : ${t} = 2015-03-03 17:04:30
20150303 17:04:30.630 : INFO : 2015-03-03 17:04:30
Ending test: 测试项目.测试套件.test case
2) “sleep”关键字用来设置休眠一定时间。

${t}get timehello world
sleep5 
${t}get timehello world

        sleep 关键字默认以“秒”为单位。

执行结果:

Starting test: 测试项目.测试套件.test case
20150303 17:23:17.020 : INFO : ${t} = 2015-03-03 17:23:17
20150303 17:23:22.020 : INFO : Slept 5 seconds
20150303 17:23:22.022 : INFO : ${t} = 2015-03-03 17:23:22
Ending test: 测试项目.测试套件.test case
        通过前后两次获取当前时间的差,可以清楚的看到 sleep 休眠 5 秒所起的作用。

3.3.6 if 语句


        通过“run keyword if”关键字可以编写 if 分支语句。

${a}Set variable59  
run  keyword if${a}>=90log优秀 
...ELSE IF${a}<=70log良好
...ELSE IF${a}<=60log及格
...ELSElog不及格 


        首先定义两个变量 a 等于 59 。
        If 判断 a 大于等于 90 ,满足条件 log 输出 “优秀 ”;
        不满足上面的条件,接着 else if 判断 a 大于等于 70 ,满足条件 log 输出 “良好”;
        不满足上面的条件,接着 else if 判断 a 大于等于 60 ,满足条件 log 输出 “及格”;
        上面的条件都不满足,else log 输出“不及格”。
注:注意 sele if 和 else 前面的三个点点点(...)
执行结果:
Starting test: 测试项目.测试套件.test case
20150303 11:04:05.676 : INFO : ${a} = 59
20150303 11:04:05.676 : INFO : 不及格
Ending test: 测试项目.测试套件.test case


3.3.7 for 循环


在 Robot Framework 中编写循环通过“:for”。

例 1,执行 10 次循环

:FOR${i}in range10
log${i}  

通过“:for”定义 for 循环;in range 用于指定循环的范围.

执行结果:

Starting test: 测试项目.测试套件.test case
20150303 13:24:37.713 : INFO : 0
20150303 13:24:37.716 : INFO : 1
20150303 13:24:37.718 : INFO : 2
20150303 13:24:37.720 : INFO : 3
20150303 13:24:37.723 : INFO : 4
20150303 13:24:37.725 : INFO : 5
20150303 13:24:37.727 : INFO : 6
20150303 13:24:37.729 : INFO : 7
20150303 13:24:37.732 : INFO : 8
20150303 13:24:37.734 : INFO : 9
Ending test: 测试项目.测试套件.test case
注意,in range 定义为 10,它的范围是 0~9

例 2,遍历列表。

@{abc}create listabc
:FOR${i}in@{abc} 
log${i}   


“create list” 关键字用来定义列表(a,b,c),“@{}”用来存放列表。
通过过“:for”循环来来遍历@{abc}列表中的字符。
执行结果:
Starting test: 测试项目.测试套件.test case
20150303 13:42:05.064 : INFO : @{abc} = [ a | b | c ]
20150303 13:42:05.065 : INFO : a
20150303 13:42:05.066 : INFO : b
20150303 13:42:05.068 : INFO : c
Ending test: 测试项目.测试套件.test case
例 3,循环中的判断

@{abc}create listabc
:FOR${i}in@{abc} 
 Exit For Loop If'${i}'=='c'  
log${i}   


       通过“Exit For Loop If”关键字时行 for 循环内的判断,当满足 Exit For Loop If 条件后,循环结束。
执行结果:
Starting test: 测试项目.测试套件.test case
20150303 16:24:26.146 : INFO : @{abc} = [ a | b | c ]
20150303 16:24:26.154 : INFO : Exiting for loop altogether.
20150303 16:24:26.158 : INFO : c
Ending test: 测试项目.测试套件.test case
        从执行结果看到当循环到字符 c 时,Exit For Loop If 条件成立,结束循环;通过 log 打印当前的字符 c。

3.3.8 强大的 Evaluate


        为什么说“Evauate”关键字强大呢。因为通过它可以使用 Python 语言中所提供的方法。
例 1,生成随即数
在 Python 中我们可以这样来引和并使用方法:


Python Shell
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import random
>>> random.randint(1000, 9999)
3308


        random 模块的 randint()方法用于获取当前时间。
        在 Robot Framework 中使用“Evauate”也可以调用 Python 所提供的 random 模块下的 randint()方法。

${d}Evaluaterandom.randint(1000, 9999)random
log${d}  


执行结果:
Starting test: 测试项目.测试套件.test case
20150303 16:36:08.387 : INFO : ${t} = 5031
20150303 16:36:08.389 : INFO : 5031
Ending test: 测试项目.测试套件.test case

例 2,执行本地程序

Evaluateos.system('python c:/helloworl.py')os


        通过调用 Python 所提供的 os 模块中的 system()方法可以执行本地 Python 文件。至于在.py 文件中
Python 可以做任何想做的事。
       对于 system()方法来说,它也不单单可执行 Python 文件,任何在 cmd 命令提示符下可运行文件和命
令,它都可以执行。
        不过,一般情况下不建议通过 system()方法去执行外部程序。这样做其实就脱离了 Robot Framework,
也就是说不管 Robot Framework 什么事了。我们尽量把要做的事情通过 Python 封装成关键字给 Robot
Framework 使用。


3.3.9 导入库


        在 Python 语言中可以使用 import 导入标准和第三方模块或框架。那么在 Robot Framework 中也提供
了“Import Library”关键字来完成这个事情。


1、调用框架


Import Library unittest
        我们导入了 Python 标准的单元测试框架 unittest。当然,在 Robot Framework 中并不能使用 unittest
单元测试框架。这只里只演示“Import Library”等同于 Python 语言中的 import。
假如我们通过“Import Library”导入一个不存在的模块,然后运行测试用例:


执行结果:
Starting test: 测试项目.测试套件.test case5
20150303 18:28:42.621 : FAIL :
Importing test library 'HTMLTestRunner' failed: ImportError: No module named
HTMLTestRunner
Traceback (most recent call last):
None
PYTHONPATH:
C:\Python27\lib\site-packages\robot\libraries
C:\Python27\lib\site-packages
C:\Python27\lib\site-packages\robotframework_selenium2library-1.5.0-py2.7.eg
g
C:\Python27\lib\site-packages\setuptools-12.0.1-py2.7.egg
C:\Python27\lib\site-packages\pip-6.0.6-py2.7.egg
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win

C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages\wx-2.8-msw-unicode
.
D:\测试项目
Ending test: OTC qs.测试项目.测试套件.test case5
        Robot Framework 会遍历 Python 安装目录下的相关目录查找“HTMLTestRunner”模块。


2、调用 Python 文件


        首先创建 test.py 文件。
test.py
#coding=utf-8
def add(a,b):
return a+b
if __name__ == "__main__":
a = add(4,5)
print a


        运行结果为 9,这是再简单不过的小程序了。
        下面就通过 Robot Framework 调用 test.py 文件中的 add()函数。

Import Libraryd:/test.py  
${add}add45
log${add}  


执行结果:
Starting test: 测试项目.测试套件.test case
20150303 21:54:21.335 : INFO : ${add} = 45
20150303 21:54:21.335 : INFO : 45
Ending test: 测试项目.测试套件.test case


        从执行结果中看到和预想的结果不是样,不应该是 9 么?怎么是 45。这是因为 Robot Framework 把 4和 5 当前两个字符串。所以 4 和 5 拼接起来是 45。我们可以将 4 和 5 转化成 int 类型,再调用 add。

Import Libraryd:/test.py  
${a}Evaluate int(4)  
${b}Evaluate int(5)  
${add}add${a}${b}
log${add}  

执行结果:
Starting test: 测试项目.测试套件.test case
20150303 22:01:18.430 : INFO : ${a} = 4
20150303 22:01:18.430 : INFO : ${b} = 5
20150303 22:01:18.430 : INFO : ${add} = 9
20150303 22:01:18.430 : INFO : 9
Ending test: 测试项目.测试套件.test case


        通过“Evaluate”转化成为 int 类型后,再调用 add 就得到了想要的结果。


3.3.10 注释


        Robot Framework 中添加注释也非常简单。“Comment”关键字用于设置脚本中的注释。

Comment
这是注释
#这也是注释 
  


        除此之外,你也可以像 Python 一样使用“#”号进行注释。
        这一小节中介绍的关键字全部由 Builtin 库提供,Builtin 为 Robot Framework 标准类库。Builtin
库提供常用的关键字。


3.4 Screenshot库

        Scrennshot 同样为 Robot Framework 标准类库,我们只将它提供的其它中一个关键字“TakeScreenshot”,它用于截取到当前窗口。
        虽然 Scrennshot 也为 Robot Framework 标准类库,但它默认不会加载,需要手动加载这个库。

3.4.1 屏幕截图

       使用“Take Screenshot”关键字实现截取当前屏幕。
例:

Take Screenshot  


        运行用例,查看 log.html:

3.5 Collections 库

        Collections 库同样为 Robot Framework 标准类库,它所提供的关键字主要用于列表、索引、字典的处理。
        在使用之前需要在测试套件(项目)中添加:

 

3.5.1 创建字典


        字典也是一种常见的存放数据的形式,Create Dictionary 关键字用于创建关键字。

Create Dictionarykeyvaluekeyvalue
Create Dictionarya1b2


        字典的存放方式是 key:value 成对儿存放的。


3.5.2 操作字典


        Get Dictionary Items 关键字用于读取字典的 key 和 value

${dict}Create Dictionarya1b2
${itmes}Get Dictionary Items${dict}   
log${itmes}    
${key}Get Dictionary Keys${dict}   
log${key}    
${value}Get Dictionary Values${dict}   
log${value}    
${v}Get From Dictionary${dict}   
log${v}    


Get Dictionary Items 关键字获取字典中的 key 和 value。
Get Dictionary Keys 关键字获取字典中的 key。
Get Dictionary Values 关键字获取字典中的 value。
Get From Dictionary 关键字获取字典中的 key 对应的 value

执行结果:


Starting test: 测试项目.测试套件.test case
20150312 17:56:24.811 : INFO : ${dict} = {u'a': u'1', u'b': u'2'}
20150312 17:56:24.813 : INFO : ${itmes} = [u'a', u'1', u'b', u'2']
20150312 17:56:24.814 : INFO : [u'a', u'1', u'b', u'2']
20150312 17:56:24.815 : INFO : ${key} = [u'a', u'b']
20150312 17:56:24.816 : INFO : [u'a', u'b']
20150312 17:56:24.817 : INFO : ${value} = [u'1', u'2']
20150312 17:56:24.818 : INFO : [u'1', u'2']
20150312 17:56:24.819 : INFO : ${v} = 2
20150312 17:56:24.820 : INFO : 2
Ending test: 测试项目.测试套件.test case


        虽然 Scrennshot 也为 Robot Framework 标准类库,但它默认不会加载,需要手动加载这个库。

第 4 章 认识 RIDE 敬请期待。。。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值