天天看點

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 中導入變量檔案:

Robot Framework - Variable file

Ride how to import variable file

指令行導入

pybot --help

檢視相關幫助資訊如下:

Robot Framework - Variable file

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"  #導入多個變量檔案
           
Robot Framework - Variable file

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)
           
Robot Framework - Variable file

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中列印變量的值如下:

Robot Framework - Variable file

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檔案時不輸入參數,則變量的值列印結果為:

Robot Framework - Variable file

如果輸入參數product,則變量的值列印結果為:

Robot Framework - Variable file

切換運作環境

一般來說,自動化測試的用例不僅隻在測試環境運作,可能情況下有三套運作環境:測試環境、灰階環境(沙盒/預釋出)、生産環境。調試或者輔助驗證測試時,切環境改變量甚是麻煩。這些變量包括但不限于:一些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中的值都會是更新後的值。如此,達到用例中間變更變量後續可用的目的。

Robot Framework - Variable file
Robot Framework - Variable file

參考文檔