条件判断,初始化与清除
RF中用Run Keyword If 关键字做条件判断
条件表达式参数给python的eval函数
run keyword If "2018" in $h tml log to console 内容
#如果2018在$html中,在控制台打印出内容 $html可能是字符串可能是列表
python 的写法: #链接的返回值是:Wed Oct 24 10:59:01 UTC 2018
def getWebInfo():
response = requests.get(
'http://mirrors.sohu.com/centos/timestamp.txt')
return response.text
html = getWebInfo()
if "2018" in html:
print("2018年的")
else:
print("不是2018年的")
RF的写法:(关键字和条件之间要有两个以上的空格)
01(一个条件)
*** Settings ***
Library mylib4 #getwebinfo关键字定义在mylib4模块中
*** Test Cases ***
测试1
${html}= getwebinfo
run keyword if '2018' in $html log to console 2018年的 #在控制台打印2018年的
02(多个条件)
如果条件判断更加多一点
*** Settings ***
Library mylib4
*** Test Cases ***
测试1
${html}= getwebinfo
run keyword if '2018' in $html and 'UTC' in $html #跟if写法一样
... log to console 2018年的UTC时间 #换行的时候一定要加三个点
run keyword unless 是独立的新的语句,后面的判断条件还是要写的。意思是如果后面的不成立,就执行。
03(类似于if else)
*** Settings ***
Library mylib4
*** Test Cases ***
测试1
${html}= getwebinfo
run keyword if '20188' in $html and 'UTC' in $html
... log to console 2018年的UTC时间
... ELSE log to console 不是2018年的UTC时间 #ELSE必须大写。并不是rf中的关键字,是run keyword if里面处理的
04(类似于if elif else)
*** Settings ***
Library mylib4
*** Test Cases ***
测试1
${html}= getwebinfo
run keyword if '2018' in $html and 'UTC' in $html
... log to console 2018年的UTC时间、
... ELSE IF '2018' in $html log to console 2018年 #ELSE IF之间只能有一个空格
... ELSE IF 'UTC' in $html log to console UTC时间 #ELSE必须大写。并不是rf中的关键字,是run keyword if里面处理的
... ELSE log to console 以上都不是
循环里面的判断
Exit For Loop 与 Continue For Loop
01(简单判断,知识点get value from user,是一个弹窗)
*** Settings ***
Library Dialogs
*** Test Cases ***
测试1
${weight}= get value from user 请输入你的体重 60 #get value from user是要用户输入的值,60是缺省值,可以填可以不填,返回的是用户输入的字符串
Log To Console 体重为${weight} #打印到终端上
run keyword if int($weight)>60 log to console 太重了 #这种条件判断是python里面的,所以要加int
02(把上面的判断做在循环里)
*** Settings ***
Library Dialogs
*** Test Cases ***
测试1
:FOR ${one} in range 9999999 #rf里面没有while循环,要想循环很多次,只能把数字写很大
\ ${weight}= get value from user 请输入你的体重 60 #多行输入的时候可以按住alt键,\相当于缩进
\ Log To Console 体重为${weight}
\ run keyword if int($weight)>60 log to console 太重了
03(退出循环)
*** Settings ***
Library Dialogs
*** Test Cases ***
测试1
:FOR ${one} in range 9999999 #rf里面没有while循环,要想循环很多次,只能把数字写很大
\ ${weight}= get value from user 请输入你的体重 60 #多行输入的时候可以按住alt键。\相当于缩进
\ run keyword if $weight=="over" Exit for loop #Exit for loop关键字,退出循环。$weight是py表达式,所以去掉{}
\ Log To Console 体重为${weight}
\ run keyword if int($weight)>60 log to console 太重了
04(有else)
*** Settings ***
Library Dialogs
*** Test Cases ***
测试1
:FOR ${one} in range 9999999 #rf里面没有while循环,要想循环很多次,只能把数字写很大
\ ${weight}= get value from user 请输入你的体重 60 #多行输入的时候可以按住alt键。\相当于缩进
\ run keyword if $weight=="over" Exit for loop #Exit for loop关键字,退出循环。$weight是py表达式,所以去掉{}
\ Log To Console 体重为${weight}
\ run keyword if int($weight)>60 log to console 太重了 ELSE log to console 太轻了
Dialog库是为半自动化操作提供的,collections库里面存放的是py里面列表和字典常用的操作在里面。这两个都是标准库里面的
创建列表,加一个元素,也可以加多个元素
01(加一个元素)
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${list}= Create List
Append To List ${list} hello
log to console ${list}
#结果
[“hello”]
02(加多个元素)
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${list}= Create List a b ${1} #创建一个列表里面原来包含ab和数字1
Append To List ${list} hello world #追加hello world
log to console ${list}
#结果
[‘a’, ‘b’, 1, ‘hello’, ‘world’]
03(创建字典)
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${var}= create dictionary a=1 b=2 #创建一个字典
set to dictionary ${var} c=3 #追加c=3
log to console ${var}
#结果
{‘a’: ‘1’, ‘b’: ‘2’, ‘c’: ‘3’}
Evaluate(他的参数会当做py表大会执行)
直接用python代码表达式来生成一个结果
${var}= set variable ${890}
完全可以写成
${var}= evaluate 890 #evaluate后面,python怎么写就怎么写
例如:
01创建一个整数变量
*** Settings ***
Library mylib4
*** Test Cases ***
测试1
${var}= evaluate 890 #创建一个整数变量
log to console ${var}
02创建一个列表
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${list}= evaluate ["hello",0] #python中怎么写,evaluate后面就怎么写
log to console ${list}
#结果
[‘hello’, 0]
02创建一个列表
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${list}= evaluate ["hello"]*20 #python中怎么写,evaluate后面就怎么写,一个列表里由0个hello
log to console ${list}
#结果
[‘hello’, 0]
03可以写py里面各种复杂的语法
*** Settings ***
Library Collections
*** Test Cases ***
测试1
${list}= evaluate ["hello"] *20 #python中怎么写,evaluate后面就怎么写。列表里面有20 个hello
log to console ${list}
#结果
[‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’, ‘hello’]
初始化和清除(自动化系统中非常重要的)
setup是测试一个用例(或者套件)前要做的事情
teardown是测试后要做的事情
一个例子
要测试登录功能,需要先注册1个用户,用这个用户验证登录功能
那么对于测试登录功能的套件(或者用例)来说,前面先注册好一个用户的操作,就是setup。
是否需要teardown,主要看这个用例执行后的结果是否会影响下面执行的用例
在RF中,每个测试套件目录,测试套件文件,测试用例,都可以有自己的setup和teardown
所有的setup和teardown操作都只能由一个关键字语句构成
测试用例的setup,teardown
写在测试用例(测试1)表的配置项中
*** Test Cases ***
测试1
[Documentation] 测试初始化、清除 #就是一些描述性的话
[Setup] log to console \n *** 测试用例1 setup ****
log to console 测试用例1主体部分 #执行主体部分的时候,会执行初始化和清除的部分
[Teardown] log to console \n *** 测试用例 1 teardown ****
测试2
log to console 测试用例2主体部分
测试3
log to console 测试用例3主体部分
还可以做整个文件的初始化和清除
写在测试套件文件的setting表中
两种类型
-
Suite setup/teardown #放在setting表中,对所有用例有效。
进入和退出这个suite执行用例前后必须执行且只分别执行一次 -
Test setup/teardown 如果suite内的用例本身没有setup/teardown,才执行
01(第一种类型:Suite setup/teardown。放在setting表中,对所有用例有效)
*** Settings ***
Suite Setup log to console \n --- Suite st2 Setup --- #套件的初始化,在执行用例的初始化
Suite Teardown log to console \n --- Suite st2 Teardown --- #最后执行套件的清除
*** Test Cases ***
测试1
[Setup] log to console \n *** case 测试1 setup ****
log to console 测试用例主体部分 11
[Teardown] log to console \n *** case 测试1 teardown ****
测试2
log to console 测试用例主体部分22
测试3
log to console 测试用例主体部分33
结果:
--- Suite st2 Setup --- #先执行套件的初始化
测试1
*** case 测试1 setup **** #执行用例的初始化
.测试用例主体部分 11
.
*** case 测试1 teardown **** #执行用例的清除
测试1
--------------------------------
测试2
.测试用例主体部分22
测试2
--------------------------------
测试3
.测试用例主体部分33
测试3
--------------------------------
--- Suite st2 Teardown --- #所有的用例执行完之后,最后执行套件的清除
02(第二种类型Test setup/teardown。就是每个用例的缺省的初始化和清除。如果套件里面某个用例没有初始化和清除,就会执行设置好的Test setup/teardown)
*** Settings ***
Suite Setup log to console \n --- Suite st Setup ---
Suite Teardown log to console \n --- Suite st Teardown ---
Test Setup log to console \n --- Test st Default Setup --- #如果测试用例没有自己的初始化清除,就使用这个
Test Teardown log to console \n --- Test st Default Teardown ---
*** Test Cases ***
测试1
[Setup] log to console \n *** case 1 setup ****
log to console 测试用例主体部分11
[Teardown] log to console \n *** case 1 teardown ****
测试2
log to console 测试用例主体部分22
测试3
log to console 测试用例主体部分33
结果:
--- Suite st Setup ---
测试1
*** case 1 setup ****
.测试用例主体部分11
.
*** case 1 teardown ****
测试1
-------------------------------------
测试2
--- Test st Default Setup ---
.测试用例主体部分22
.
--- Test st Default Teardown ---
测试2
-------------------------------------
测试3
--- Test st Default Setup ---
.测试用例主体部分33
.
--- Test st Default Teardown ---
测试3
-------------------------------------
--- Suite st Teardown ---
测试套件目录的setup,teardown(会存在一个就近原则,一个测试用例,既在初始化文件中有Test setup/teardown,套件里面有缺省的Test setup/teardown,会就近执行套件里面的Test setup/teardown。不会再执行初始化文件里面的Test setup/teardown)
在其目录下的初始化文件__init__.txt 或者 init.robot,(这两个文件是手动添加的)里的setting表中
两种类型
-
Suite setup/teardown
进入和退出这个suite执行用例前后必须执行且只分别执行一次
-
Test setup/teardown #只针对单个用例,不针对套件整体
如果suite内的用例,或者子套件 本身没有setup/teardown,才执行
执行一个用例文件:robot suite1(文件名) 如果只执行文件夹suite1里面的一个文件st1.robot。可以这样写:robot suite1/st1.robot 但是就不会执行suite1里面的初始化文件__init__.txt 或者 init.robot。 只能这样写robot --suite st1 suite1 :意思是执行suite1文件里面的st1。这样写就会执行初始化话文件里面的初始化和清除。多个是:robot --suite st1 --suite st2 suite1 意思是:执行suite1文件里面的st1,st2文件
源是suite1一定要是用例的根目录:robot --suite st1 --suite st2 suite1 (–suite是固定的写法)
如果套件的初始化里面用到了某一个库里面的关键字(mylib4里面定义函数),用之前一定要先导入他,导入的申明要写在前面
*** Settings ***
Library mylib4
Suite Setup opencalc #如果套件的初始化里面用到了某一个库里面的关键字(mylib4里面定义函数),用之前一定要先导入他,导入的申明要写在前面
Suite Teardown log to console \n --- Suite st Teardown ---
Test Setup log to console \n --- Test st Default Setup ---
Test Teardown log to console \n --- Test st Default Teardown ---