1. 程式人生 > >Robot Framework - Variable file

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 中匯入變數檔案:
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

補充幾點:

  1. 變數檔案中建立的所有以下劃線開頭的變數不會被RF匯入,如 ”_pykey” ;初次之外,也可以使用”__all__” (雙下滑線)將真正要被RF匯入的Variables的加為一個lis;比如上面的例子中,就只有pyuser和pytags被認為是variable,而pyparams將會被忽略;
  2. 為了更明確的定義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
  1. 變數檔案中建立的Set型別或Tuple型別的變數,應該避免在RF中引用,否則可能會報語法錯誤;
  2. 通常來說,全域性變數名稱應該大寫,非全域性變數小寫;

使用物件最為變數的值

變數檔案中的變數不限於只有字串或其他基本型別作為值。相反,它們的變數可以包含任何物件。在下面的示例中,變數$ {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中的值都會是更新後的值。如此,達到用例中間變更變數後續可用的目的。注意,RF中使用Evaluate 時,注意變數的寫法,大括號建議都不寫。

參考文件