Robot Framework條件判斷,初始化與清除
條件判斷,初始化與清除
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 ---