lesson_1——RF简介
一、RF定义
RF定义:
通用型的自动测试框架, 绝大部分的软件的的自动化系统都可以采用它。
特点:
测试数据文件(Test Data)对应一个个的测试用例。测试数据文件里面使用的功能小模块叫关键字,由测试库(Test Library) Robot Framework加载测试库,并解释执行测试用例
l 它提供简单易懂的表格式的“语言”来开发自动测试用例。
l 它的标准库提供了常用的功能,以关键字(keyword)的形式来开发测试用例。
l 它定义了灵活且易理解的测试用例执行控制,包括执行哪些用例,如何在执行用例前后进行初始化和清除环境
l 它可以方便挑选要执行的用例和套件
l 它有清晰的日志和报表功能,让QA和manager可以清楚的查看测试执行结果。
二、RF安装
1、cmd命令行安装:
pip install robotframework
pip install robotframework-seleniumlibrary
2、pycharm 安装插件IntelliBot:
File - Settings – Plugins: 选择browser repository安装的
三、RF基本概念
基本概念:测试套件文件,表,关键字, 测试库
执行测试用例
查看日志及报表
测试用例基本语法
四种表:Settings:导入一些库和关键字、执行初始化和清除动作
Variables:声明全局变量
Test Cases:测试用例主体操作步骤
Keywords:可以编写用户关键字
RF的测试套件可以是目录,也可以是文件。而测试用例是存在测试套件文件中的。测试套件目录可以包含 子套件目录 和 子套件文件。RF的测试用例是存放在测试套件文件里面的,一个套件文件可以有多个用例, 套件文件可以在测试套件目录中,如下图:
RF支持四种的表:
Ø 分别为Settings, Variables, Test Cases, Keywords。
Ø 表名必须出现在第一单元格中。表名大小写不敏感
u Settings表:是这个测试套件的 全局配置表。比如,说明这个测试套件要使用的测
试库、资源文件,测试套件的环境初始化(setup)和清除(tear down),该套件内的标签等等;
u Test Case表:是用来定义这个测试套件的 测试用例 的;
u Variables表:就是这个测试套件的 全局变量表;
u Keywords表:是用来定义这个测试套件的 用户关键字 的;
测试用例表里面的每个测试用例大概可以分为 :
Ø 配置部分
Ø 主体部分
用例配置部分主要分为:
Ø [Documentation] 该用例的文字说明
Ø [Tags] 该用例的标签
Ø [Setup], [Teardown] 该用例的初始化和清除操作
Ø [Template] 声明该用例是模板关键字驱动的,本用例只包含测试数据。
Ø [Timeout] 设置用例超时时间
用例主体部分主要是由关键字组成的
u 关键字的来源
Ø 测试库
Ø 资源文件
Ø 用例所在文件的关键字表
u 用例主体部分也包含变量赋值
注意:一定要保证用例文件的编码格式必须是UTF8,否则会出现无法解析中文字符的情况
如果默认不是UTF8需要自己设置一下
lesson_2——关键字的使用
一、关键字简介
RF的能力是由关键字提供的,所以,我们必须对RF的常用关键字有个了解,这样才能把RF用好。
最常用的关键字就在RF的标准库中:http://robotframework.org
其中Builtin是标准库中的内置库,Shortcuts Keywords 就是关键字目录表,具体介绍每个关键字。
一、关键字参数
第1列就是关键字的名称,第2列就是关键字参数!!!
1****、必选参数缺省值参数
来看一个 builtin库里面的常用关键字: should be equal
|
|
first, second, msg=None, values=True, base=None
|
其中,参数 first 、second 是必选参数,需要填写内容,而参数 msg,values,base是带缺省值的参数,不填表示使用缺省值,是可以选填的,可以不填。
二、常用关键字
Should Be Equal/ Should Not Be Equal 判断是否相等
Should Contain/ Should Not Contain 判断是否包含
Should Start With/ Should Not Start With 判断字符串是否以……开头
Should End With/ Should Not End With 判断字符串是否以……结尾
log 打印,相当于print
log to console 打印到终端串口
sleep 1 睡眠1s
set variable 只支持赋值一个字符串给变量
Convert To Integer 、Convert To Number 赋值一个整数,或者浮点数
如果我们想把一个数字作为关键字的参数,可以使用数字变量 log to console ${32}
log to console ${32+46}*
evaluate
在python里面调用eval执行的关键字有:should be true 和run keyword if
evaluate 关键字:直接用 python 代码表达式来生成一个结果
${var}= Create List hello world
等价于:
${var}= evaluate ['hello', 'world']
一个特殊关键字Should Be True
它的参数本身是python 表达式语句,RF会直接用python解释器 的eval函数,来解释这个参数表达式。
Should be true与python两个区别:1、变量前面加个$符号
2、不能中间有多于两个空格
三、认识测试库
通常,关键字是由测试库提供的。其实测试库就是python 模块文件,关键字就是 Python库里面的函数和类的方法。
RF就是本身就是个Python程序, 所以它的寻找库文件的原理和python是一样的。最终是通过sys.path。 我们在哪个目录下面运行robot,那个目录就是当前工作目录当前工作目录就是在sys.path里面的。所以,我们放在当前目录下面的python模块文件,直接就能被找到。
RF 脚本使用函数名、方法名 大小写不敏感。
四、库的导入
要使用测试库提供的关键字,我们必须要声明导入库。当然一个特例:除了RF 的 builtin库的关键字,不需要声明。库的名称在RF里面是大小写敏感的。有的库,在导入的时候,可以提供参数,比如SeleniumLibrary
http://robotframework.org/SeleniumLibrary/SeleniumLibrary.html
Importing链接,点开,有参数 就是导入可以设置的参数
timeout=5.0,
implicit_wait=0.0,
run_on_failure=Capture Page Screenshot,
screenshot_root_directory=None
其实这些导入时带参数的库,对应的测试库都是用类实现的,这些参数就是类的初始化方法init里面的参数。
四、变量的用法
RF中的变量,实质上就是一个Python变量,它指向一个Python对象。所以RF变量对应的是什么Python对象,它就是什么类型的对象。
1****、Scalar方式(Scalar Variable)
普通用法,就是用 ${var} 的方式来表示。
特点:当我们把变量以Scalar方式传递给关键字作为参数的时候,就是直接把它所对应的Python对象传递给关键字对应的函数。
2****、List方式(List Variable)
如果RF变量实际指向一个Python List对象,我们还可以把它以List方式传递给关键字作为参数。
List方式是用 @{var} 的方式来表示,也把这种方式表示的变量叫做List 变量。List方式实际上会展开其List中的每个元素,作为多个参数传入。
3****、Dictionary方式(Dictionary Variable)
如果RF变量实际指向一个Python Dict 对象,我们还可以把它以Dict方式传递给关键字作为参数。
Dictionary方式是用 &{var} 的方式来表示,也把这种方式表示的变量叫做Dictionary 变量。Dictionary方式实际上会展开其Dict中的每个元素,作为多个参数传入。
五、访问环境变量
RF中可以用 %{env_var} 方式直接访问一个环境变量,比如
六、循环
1****、for循环示例
RF用 FOR来实现循环,没有While 循环,对应的文档解释在这里
http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#for-loops
Example
FOR ${animal} IN 猫 狗 猪
log to console ${animal}
log to console 循环体内部
END
log to console 循环体外部
2****、注意事项:
l FOR后面的END不能忘了;
l 如果后面的是变量是个list, 一定要写成 @的形式,而不是$的形式;
l for循环体内的语句,要缩进一个单元格,如果是纯文本文件,连续的空格是无法表示多个单元格的,RF会只当成一个,所以前面还要有一个反斜杠转义,表示这边有一个空的单元格。
3、FOR循环新的语法:
体会一下与旧语法的不同
4、range用法
python中,我们非常常用的有 range方法,RF也有类似的支持,
http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#id578
range用法 [Documentation] Loops over values from 0 to 9 FOR {index}
END
若想使用while循环,可以使用FOR ${index} IN RANGE n,当n足够大的时候模拟while无限循环。
lesson_3——条件判断、初始化与清除
一、条件判断
1****、Run Keyword if关键字
RF里面除了循环以外,另一个流程控制的基本功能就是条件判断,RF中通常用Run Keyword If 关键字来达到类似Python 中 if…else… 条件判断的功能
Ø 第一个参数condition是条件表达式(python表达式),条件表达式参数给python的eval函数。
Ø 第二个参数name 是一个关键字 就是条件满足的时候要执行的关键字,并且只能执行一个关键字
Ø *args就是关键字的参数
RF中解决太长的问题,可以用下一行前面加三个点的省略号,在测试用例中,下一行的省略号前面必须留有一个以上的空单元格。
2****、ELSE分支
老版本的RF 没有else分支,只能通过Run Keyword Unless 来达到类似的目的,
run keyword unless 完全是新的语句,和上面的 run keyword if 没有任何关系,即使没有上面的 run keyword if,也是可以单独用的。
从RF 2.7.4,以后支持 else if 和 else 分支了,通常也是另起一行,前面加省略号,如下( ELSE 本身不是一个关键字,其实它是 run keyword if的参数的一部分,所以前面一定要有省略号,而且一定要全部大写)
3****、循环里的判断
RF中没有while,只能一个大的range,Exit For Loop 关键字实现break功能
用Continue For Loop 关键字实现continue 功能,也可以使用
等价的关键字Continue For Loop If Exit For Loop If
二、初始化Setup和清除Teardown
1****、概念
setup 是测试一个用例(或者套件)前要做的事情,
teardown 是测试后要做的事情。
u 在RF中,每个测试套件目录、测试套件文件、测试用例 都可以有自己的setup 和teardown
u 一般 setup 和teardown 操作都由一个关键字语句构成
u setup 和teardown 操作需要执行多个关键字,可以使用如下语句
Suite setup Run Keywords 关键字1 AND 关键字2
2****、测试用例的Setup和Teardown
每个测试用例都可以有自己的setup 和teardown。用例的初始化、清除,写在测试用例表的配置项中,也就是下面方括号部分:
3****、测试套件文件的Setup和Teardown
除了测试用例,测试套件也有初始化清除。有的操作是针对一个套件里面所有的用例的,而且只需要做一次。
测试套件文件有两种类型的setup和teardown,Suite setup/teardown和Test setup/teardown。
Ø Suite setup/teardown
进入和退出这个suite执行用例前后必须执行且只分别执行一次
Ø Test setup/teardown
如果suite内的用例本身没有 setup/teardown,才执行
4****、测试套件目录的Setup和Teardown
测试套件目录也可以有初识化和清除。 测试套件目录的setup teardown 在其目录下的配置文件init.txt 或者 init.robot里的settings 表中。也有两种类型的 setup 和teardown , Suite setup/teardown和 Test setup/teardown。
Ø Suite setup/teardown
进入和退出这个suite执行用例前后必须执行且只分别执行一次
Ø Test setup/teardown
如果suite内的 用例、或者子套件本身没有 setup/teardown,才执行
执行命令 robot --suite st1 suite1 通过--suite 指定是执行哪些子套件
lesson_4——用户关键字
一、用户关键字
RF中像编程语言中函数概念的东西,就是用户关键字,用户关键字就像RF中的函数,
Keywords表就是定义用户关键字的
二、用户关键字——定义、参数、返回值
Keywords表中定义用户关键字,和函数一样,用户关键字可以有参数和返回值,也可以无,如下:
*** Keywords *** loginwebsite [Arguments] {password} Open Browser http://localhost/mgr/login/login.html chrome Set Selenium Implicit Wait 10 Input Text id=username
{password}Click Element tag=button
Get Course List {courses}= create list
FOR {ele.text} append to list
{ele.text}
END
[Return] ${courses}
三、资源文件
资源文件其实就是RF层面的库文件,里面可以包含用来共享的用户关键字,也可以包含前面说的 Variable 表定义的变量 ,资源文件的格式基本也和测试套件文件类似 ,除了不能有测试用例表和一些特别的设置项。
RF搜索资源文件,使用相对路径的时候,RF搜索资源文件的规则是:
l 首先相对搜索当前文件的目录匹配搜索,
l 如果找不到,就在Python的模块搜索路径中搜索
资源文件声明的时候,一定要带扩展名(不像库文件),在settings表里面用 Resource声明资源文件的,如下
*** Settings *** Library SeleniumLibrary **Resource****rc1.robot
lesson_5——全局变量
一、测试套件中创建变量
1****、变量表Variables中声明变量
变量表Variables,变量表中声明该测试套件中用到的变量,在当前测试套件文件变量表Variables中声明的变量,对整个套件里面所有的测试用例都有效
*** Settings *** Library SeleniumLibrary
*** Variables *** {StudentLoginUrl} *http://localhost/student/login/login.html**** Test Cases *** case1 log to console
{StudentLoginUrl}
2****、Variable表创建LIist变量 *** Variables @{database} 127.0.0.1 3306**** Test Cases *** case1log to console ${database}
3****、Variable表创建Dict变量
*** Variables ***@{database} 127.0.0.1 3306 *&{adminuser} name=auto pw=sdfsdfsdf**** Test Cases *** case1 log to console {adminuser} # 使用整个字典
log to console @{database}[0] #****使用列表第一个元素
log to console &{adminuser}[name] #只是使用一个元素
case2 log to console ${database} # 使用整个列表
二、资源文件中创建变量
和套件文件中的用户关键字一样,套件文件中的变量表里面的变量,其作用范围只是该套件文件。我们可以定义在资源文件中,资源文件变量的定义,和上述测试套件文件中几乎一样,我们只需拷贝 Variables表到资源文件中即可
*** Variables *** ${MgrLoginUrl} http://localhost/mgr/login/login.html
&{adminuser} name=auto pw=sdfsdfsdf
三、变量文件
1****、变量文件cfg.py
也可以使用Python模块文件提供公共变量给RF使用,只需要直接定义变量就可以了,
语法完全就是python 例如:
MgrLoginUrl = 'http://localhost/mgr/login/login.html' StudentLoginUrl= 'http://localhost/student/login/login.html' database= ['127.0.0.1' , '3306']
adminuser= {'name':'auto' , 'pw':'sdfsdfsdf'}
2****、变量文件导入
在测试套件中导入该文件即可使用:
*** Settings *** Variables cfg.py
3****、文件搜索路径
变量文件声明的时候,可以使用绝对路径,也可以使用相对路径。使用相对路径的时候,RF搜索变量文件规则和 搜索资源文件搜索规则 一样:首先在相对当前文件的目录匹配搜索,如果找不到,就在Python的模块搜索路径中搜索,注意资源文件路径,目录之间的分割符,不用点“ .” 而是用 斜杠“ /”
如果有的RF不在项目根目录下面,比如task下面新建目录tc,
可以这样修改rc.robot
*** Settings *** Library SeleniumLibrary Library Collections Variables ../cfg/cfg.py
但是这样不好的地方是 :每个RF文件的路径不一样,导致每个RF文件导入变量文件的写法都不同。而且一旦移动了目录,就要修改里面的写法,比如
<pre style="background:ghostwhite">Variables ../../cfg/cfg.py</pre>
一种推荐的做法,就是 统一相对于项目根目录,假设项目根目录是task,就需要像下面这样
*** Settings *** Variables cfg/cfg.py
这样我们在执行命令时,需要将当前目录(项目根目录)加入到模块搜索路径中:
robot --pythonpath . tc\t1.robot
我们也可以在命令行参数中直接指定变量文件,就可以不用在RF文件中声明了
robot --variablefile cfg\cfg.py tc\t1.robot
lesson_6——扩展关键字
一、Python模块作为测试库
使用python测试库, 模块文件名就是测试库的名字。定义在Python模块文件中的函数,名称前有 _前缀 的不会作为关键字。Python模块文件定义好以后,RF就可以使用它了。我们可以这样使用上面定义的测试库,要注意的是,要保证其在Python模块的搜索路径中,这样RF才能找到它。
robot --pythonpath lesson6 lesson6\tmp.robot
RF使用关键字的时候,中间可以加上任意的空格,并且大小写也可以任意
二、定义关键字别名
from robot.api.deco import keyword #装饰器 zhenzhen @keyword('Hello') # 给关键字returnlist取别名为hello def returnlist(): return [1,2] def _returnlist2(): return [1,2]
三、Python类作为测试库
我们也可以把Python类名作为RF测试库的名字。
*** Settings *** Library tlib2.SubLibrary *** Test Cases *** case1 {a}*
通过这种以类的方式导入的库,可以提供导入时的参数给用户使用。主要用来提供一些初识化参数。这是通过类的初识化方法来实现的,比如
class SubLibrary2****: def init(self,host,port): self.host = host self.port = port def printaddr(self): logger.console('host:%s,ip:%s' % (self.host,self.port))
那么我们RF导入的时候,可以这样声明
*** Settings *** Library tlib2.SubLibrary2 localhost 80
如果类和模块文件同名,声明的时候就可以省略后面的类名。
四、库的搜索规则
RF搜索库完全是按照python的模块的搜索规则来的,如果python库是在一个包中,比如pylib/login/rightpass.py,声明的时候,可以在RF文件中像python导入包里面的模块那样的语法,如下
*** Settings *** Library pylib.login.rightpasswd
RF也支持下面的格式声明库:Library pylib/login/rightpasswd.py
总结如下:
在settting中声明资源文件和变量文件:
路径目录之间的分割符,用斜杠 “/”,而不是用点“.”
Library 用点“ .”隔开
在settting中声明 测试库:
路径目录之间的分割符,可以用点“ .”,也可以用斜杠 “/”
路径目录之间的分割符,用点“ .”后面不加py,用斜杠后面加.py
lesson_7——筛选执行用例
一、指定执行的测试套件
Robot Framework 的命令格式如下
robot [options] data_sources
其中 :
options 是RF命令的选项,可以为空
data_sources 则是要执行的测试套件文件或者目录的路径,可以是绝对路径,也可以是 相对路径,相对与当前shell 的工作目录。
robot tests.robot
robot path/to/my_tests/
robot c:\robot\tests.robot
如果指定的是测试套件文件,则执行该文件中所有的测试用例。如果指定的是测试套件目录,则递归执行该目录下包含的所有的子目录里面所有测试套件文件里面的用例。
不管是执行测试套件文件还是目录,RF认为本次测试的名字就是data_sources参数。
当然我们也可以指定多个要执行的测试套件文件、目录,甚至用通配符来表示多个测试套件,如下所示:
robot my_tests.robot your_tests.robot
robot --name Example path/to/tests/pattern_*.robot
像这种多个测试数据的情况,本次测试的名称就是把它们的名字相加,比如上面的第一个对应的本次测试名称就叫 My Tests & Your Tests。
我们可以用--name选项来指定本次测试名称为Example,像上面第二行所示。
比如这里,我们刚才的套件执行可以是:
robot --pythonpath . --name 回归测试 tc
二、根据名称选择测试用例
我们可以通过 --test --suite 来指定执行哪些用例或者套件,而且还支持用通配符的方式。
--test Example # 执行名为example的用例(即case)
--test mytest --test yourtest # 执行名为mytest和 yourtest的用例
--test example* # 执行名字以example开头的用例
--suite mysuite # 执行名字为mysuite的套件
比如,我们想只测试 “添加老师1” 这个套件:
robot --pythonpath . --test 添加老师1 tc
tc为测试套件名字
注意这个参数得和 data source 参数一起使用,不能单独使用
通常,我们可以在用例后面加上测试管理系统的用例id, 就可以根据用例ID,来选择用例了,如果我们得到的用例清单 如下
tc00001
tc00002
tc00003
tc00004
tc00005
我们就可以这样执行
robot --pythonpath . --test *tc00001 --test *tc00002 --test *tc00003 --test *tc00004 --test *tc00005 t1.robot
如果有的时候,个数太多,参数岂非太长了?我们通常可以使用参数文件
三、参数文件
如果有的时候,参数太长,我们通常可以使用参数文件,我们可以把所有的参数都放在参数文件中,比如参数文件args.txt,具体内容如下:
--pythonpath . # 执行搜索路径为当前工作目录
--name 回归测试 # 指定本次测试名称为“回归测试”
--test tc00001 # 指定本次执行名称为“tc0001”的测试用例
--test *tc00002
--test *tc00003
--test *tc00004
--test *tc00005
t1.robot # 要执行的测试套件文件或者目录的路径
我们的命令就只需要 robot -A argfilename 就可以了
如果用例参数文件args.txt内容如下
--pythonpath .
--name 回归测试 --test tc0001
--test tc0002
tc
就可以执行 robot -A args.txt
四、通过标签选择测试用例
前面我们已经学习过,通过用例名和套件名来选择测试用例。还有一种选择测试用例的方法,是根据用例的标签。
1****、指定标签
我们可以给测试用例打上标签(Tag),这样在运行的时候,可以通过标签指定要运行哪些用例。
测试用例可以有多个标签,我们根据任何一个标签都可以过滤到该用例。
给用例打Tag有如下几种方式
u Setting 表里的Force Tags
如果我们在测试套件文件的Settings表设置了Force Tags, 那么该套件里面所有测试用例都具有了该tag,如果我们在测试套件目录初始化文件的Settings 表设置了Force Tags, 那么该套件里面所有测试用例都具有了该tag
u 测试用例表里的 [tags] 配置
很简单,就是该用例的tag,
u Setting 表里的Default Tags
如果我们在测试套件文件的Settings表设置了Default Tags, 那么该套件里面所有没有[tags] 设置的测试用例都具有了该tag,相当于default标签
注意:测试目录里面的init.robot 不支持Default Tags
2****、指定标签执行用例
如果用例有了标签,在执行自动化的时候,我们可以这样指定执行哪些标签的测试用例
--include foo # 执行包含 标签'foo' 的用例.
--exclude foo # 执行不包含标签'foo' 的用例.
--include oneAND"web test" # 执行同时包含 标签'one','web test' 的用例. 因为有空格,所以用双引号
和下面的区别?
--include one --include "web test"
--include oneORtwo # 执行包含 标签'one'或者'two' 的用例.
--include oneNOTtwo # 执行包含 标签'one'但是不包含标签'two' 的用例.
执行 标签格式为 W*W 的用例.
--include w*w #比如w2w, ww, w33333w
五、指定关键测试用例
1****、关键测试用例
RF执行时,可以指定用例是否是关键测试(critical)用例。如果本次测试中有关键测试用例没有通过,那么整个测试就被视为测试不通过,哪怕是100个中只有一个关键用例没有通过;反之,整个测试就视为通过,哪怕是100个中有99个非关键用例没有通过,只有1个通过。
缺省情况下,RF执行测试时,每个测试用例都被视为关键测试用例。
2****、关键测试用例
我们可以通过命令参数
--critical (-c) 和 --noncritical (-n) 后面加tag名称 来指定测试用例是否为关键测试用例。
比如:
--critical regression
指定 只有具有 regression 标签的用例才是关键用例,其它都不是
--noncritical not_ready
指定 不具有 not_ready 标签的用例是关键用例,其他用例都不是关键用例
--critical ok* --noncritical tbd*
指定 具有以ok开头的标签且没有以tbd开头的标签的用例都是关键用例,其他用例都不是是关键用例。
通常我们可以在关键用例中打上标签 ,比如 basic 、important,critical 表示是关键用例,这样就可以方便的直接标明用例是否为关键用例。