Robot Framework - Variable file
RF匯入變數檔案
在Setting中匯入
Setting中匯入變數檔案時,和匯入外部資原始檔類似。變數檔案的路徑可以包含引數,如果一個變數檔案接受引數,那麼它們也可以是變數。
Path最好使用相對路徑,如下:
*** Settings ***
Resource ../../eRes.txt
Variables ../test.py
Variables ../comVar.py product ${arg2}
Variables ${RESOURCES}/common.py
Ride 中匯入變數檔案:
命令列匯入
pybot --help
從命令列匯入的Varialbe File,作用域範圍是全域性可用的。注意,pybot -v 是匯入變數,pybot -V 才是匯入變數檔案。如果通過 pybot -v 和 pybot -V 建立的變數名存在衝突,則pybot -v選項建立的變數將會被保留。
如果變數檔案需要引數,則可以使用冒號來分隔path和params。如果在Winodws系統中使用絕對路徑匯入變數檔案,則驅動器號後面的冒號不會被認為是一個分隔符:如下:
pybot --variablefile /relative_path/variables.py #相對路徑
pybot -V /absolute_path/common.py #絕對路徑
pybot -V C:\path\variables.py #絕對路徑
pybot -V ../common.py:product #變數檔案有一個引數
pybot -V needTwoParams.py:arg1:arg2 #變數檔案有多個引數
pybot -V "../common.py:product" -V "../test.py" #匯入多個變數檔案
如果多個檔案匯入時存在變數重名的情況,則最先匯入的變數有效 。
建立變數檔案
直接建立
基本語法
在變數檔案中直接給變數賦值,語法非常簡單,變數名大小寫不敏感。
# -*- coding: utf-8 -*-
# python
pyuser = 'Brian' # 在RF中等同於:${pyuser} |Set Variable |'Brian'
pytags = ["大宗商品","供應鏈金融",'2C電商'] # list
pyparams = {'username':'Brian','passwd':'20171219'}
_pykey = "f007688f401311e782617cd30ab49afc"
__all__ = ['pyuser','pytags'] #變數名需要加引號
RF中的寫法:
#rf中的寫法
log many ${pyuser} ${pytags} ${pyparams}
${pytags} Evaluate '${pytags}'.decode('utf8')
${type_pyuser} Evaluate type($pyuser)
${type_pytags} Evaluate type($pytags)
${type_pyparams} Evaluate type($pyparams)
補充幾點:
- 變數檔案中建立的所有以下劃線開頭的變數不會被RF匯入,如 ”_pykey” ;初次之外,也可以使用”__all__” (雙下滑線)將真正要被RF匯入的Variables的加為一個lis;比如上面的例子中,就只有pyuser和pytags被認為是variable,而pyparams將會被忽略;
- 為了更明確的定義list變數或者dict變數,可以在變數名稱中加上字首”LIST__” (兩個下劃線)或者 “DICT__”。RF中引用該變數時,不會把字首當成變數名的一部分。字首的作用是告訴RF該變數將會是”list-like”或者”dict-like”型別,框架會執行響應的檢查驗證。
LIST__pytags = ["大宗商品","供應鏈金融",'2C電商'] # prefix,list-like
DICT__pyparams = {"username":"pyuser", "passwd":"20171219"} # prefix,dict-like
- 變數檔案中建立的Set型別或Tuple型別的變數,應該避免在RF中引用,否則可能會報語法錯誤;
- 通常來說,全域性變數名稱應該大寫,非全域性變數小寫;
使用物件最為變數的值
變數檔案中的變數不限於只有字串或其他基本型別作為值。相反,它們的變數可以包含任何物件。在下面的示例中,變數$ {MAPPING}包含一個具有兩個值的Java Hashtable(這個示例只在Jython上執行測試時才起作用)。
from java.util import Hashtable
MAPPING = Hashtable()
MAPPING.put("one", 1)
MAPPING.put("two", 2)
第二個示例建立了$ {MAPPING}作為Python字典,並且還包含兩個從同一個檔案中實現的自定義物件建立的變數。
MAPPING = {'one': 1, 'two': 2}
class MyObject:
def __init__(self, name):
self.name = name
OBJ1 = MyObject('John')
OBJ2 = MyObject('Jane')
動態建立變數
由於Variable File本質上是程式語言進行變數的建立,所以可以達到動態建立變數的效果。
import os
import random
import time
import datetime
PATH = os.getcwd() #獲得當前路徑
RANDOM_INT = random.randint(0,9999) #random integer in range [0,9999]
CURRENT_TIME = time.time() # 1513661957.0591035
NOW = datetime.datetime.now() #2017-12-19
YEAR = NOW.year
MONTH = NOW.month
HOUR = NOW.hour
RF中列印變數的值如下:
YAML語法
變數檔案也可以YAML檔案實現。官方例子如下:
string: Hello, world!
integer: 42
list:
- one
- two
dict:
one: yksi
two: kaksi
with spaces: kolme
#RF中的寫法
*** Variables ***
${STRING} Hello, world!
${INTEGER} ${42}
@{LIST} one two
&{DICT} one=yksi two=kaksi
使用特殊函式
如果在Variable File中存在特殊函式(getVariables、get_variable),可以通過特殊函式來得到變數,此機制使得變數的建立變的非常靈活。
如果特殊函式存在,RF框架會呼叫此函式來獲取函式。 函式的預期返回應該是Python的dict 或者 Java的Map, 其中key為Variable名稱, value為Variable值。 其他規則和直接建立變數的情形一樣:,既可以建立scalar, list, dict各種型別的變數,也支援特殊字首”LIST__” 和 “DICT__”等。
# -*- coding: utf-8 -*-
def getVariables(env = 'test'):
if env == 'product':
#production environment
DICT__variables = {
"dbPort" : "3308",
"dbUser": "qt_product",
"dbPasswd" : "qt_product",
}
else :
#test environment
DICT__variables = {
"dbPort" : "3309",
"dbUser": "qt_test",
"dbPasswd" : "qt_test",
}
#全域性變數,不區分執行環境
globalvars = {'projectID':'3456','userID':'6'}
DICT__variables['globalvars'] = globalvars #RF中取值用${globalvars['userID']}
return DICT__variables
如果在RF中引入該Variable file檔案時不輸入引數,則變數的值列印結果為:
如果輸入引數product,則變數的值列印結果為:
切換執行環境
一般來說,自動化測試的用例不僅只在測試環境執行,可能情況下有三套執行環境:測試環境、灰度環境(沙盒/預釋出)、生產環境。除錯或者輔助驗證測試時,切環境改變數甚是麻煩。這些變數包括但不限於:一些url資訊,資料庫資訊,預置使用者資訊等等。
對應以上需求,提供以下解決思路。
第一種思路是按照執行環境,把變數寫入不同的變數檔案。說測試環境的用到的變數寫入testVars.py,生產環境下的變數寫入productionVars.py,執行時根據環境pybot -V匯入檔案。
第二種思路是使用特殊函式,在一個檔案中建立所有環境下需要的變數,函式入參為測試環境,預設引數為test,變數檔案樣例在上面已經給出了。
最後,我們來探討一下,所謂的RF的全域性變數,想要只在用例裡改變它的值,並且後續用例裡用改變後的值,提供思路:通過變數檔案,利用字典update方法將改變記憶體裡的值的特性。
如上面的例子中,變數檔案中定義了一個變數projectID:
globalvars = {'projectID':'3456','userID':'6'}
DICT__variables['globalvars'] = globalvars
下圖中兩個suite 檔案Test1和Test2都匯入了該變數檔案,在Test1下的case1中更新該變數的值,在Test2的case2下,它的值還是6666,如果再次用update的方法更新時,後續所有的Case中的值都會是更新後的值。如此,達到用例中間變更變數後續可用的目的。注意,RF中使用Evaluate 時,注意變數的寫法,大括號建議都不寫。