RF導入變量檔案
在Setting中導入
Setting中導入變量檔案時,和導入外部資源檔案類似。變量檔案的路徑可以包含參數,如果一個變量檔案接受參數,那麼它們也可以是變量。
Path最好使用相對路徑,如下:
*** Settings ***
Resource ../../eRes.txt
Variables ../test.py
Variables ../comVar.py product ${arg2}
Variables ${RESOURCES}/common.py
Ride 中導入變量檔案:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIzY2YWNiR2N2EmYygjM4ATY3MTZzYWNjZjM5IGZkNTMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
Ride how to import variable file
指令行導入
pybot --help
檢視相關幫助資訊如下:
import variable file
從指令行導入的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" #導入多個變量檔案
powershell
如果多個檔案導入時存在變量重名的情況,則最先導入的變量有效 。
建立變量檔案
直接建立
基本文法
在變量檔案中直接給變量指派,文法非常簡單,變量名大小寫不敏感。
# -*- 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)
Ride log
補充幾點:
- 變量檔案中建立的所有以下劃線開頭的變量不會被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中列印變量的值如下:
rf log
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中的值都會是更新後的值。如此,達到用例中間變更變量後續可用的目的。