Robot Framework(八) 資源和變量文件


2.7資源和變量文件

測試用例文件測試套件初始化文件中的用戶關鍵字和變量只能在創建它們的文件中使用,但資源文件提供了共享它們的機制。由於資源文件結構非常接近測試用例文件,因此很容易創建它們。

變量文件提供了一種創建和共享變量的強大機制。例如,它們允許除字符串以外的值,並允許動態創建變量。它們的靈活性來自於它們是使用Python代碼創建的,這也使它們比Variable表更復雜

2.7.1資源文件

使用資源文件

使用“ 設置”表中的“ 資源”設置導入資源文件資源文件的路徑在設置名稱后面的單元格中給出。

如果路徑以絕對格式給出,則直接使用。在其他情況下,首先相對於導入文件所在的目錄搜索資源文件。如果在那里找不到該文件,則從PYTHONPATH中的目錄中搜索該文件。路徑可以包含變量,建議使用它們使路徑與系統無關(例如,$ {RESOURCES} /login_resources.html或 $ {RESOURCE_PATH})。此外,路徑中的斜杠(“/”)會自動更改為Windows上的反斜杠(“\”)。

導入資源文件
設置
資源 myresources.html  
資源 ../data/resources.html  
資源 $ {}資源/common.tsv  

資源文件中定義的用戶關鍵字和變量在獲取該資源文件的文件中可用。同樣可用的還有來自由所述資源文件導入的庫,資源文件和變量文件的所有關鍵字和變量。

資源文件結構

資源文件的更高級結構與測試用例文件的結構相同,但是,當然,它們不能包含測試用例表。此外,資源文件中的設置表只能包含導入設置(資源, 變量)和文檔Variable表和Keyword表的使用方式與測試用例文件完全相同。

如果多個資源文件具有相同名稱的用戶關鍵字,則必須使用它們,以便關鍵字名稱以不帶擴展名的資源文件名為前綴(例如,myresources.Some Keywordcommon.Some Keyword)。此外,如果多個資源文件包含相同的變量,則首先導入的變量將被使用。

記錄資源文件

可以使用 [Documentation]設置記錄在資源文件中創建的關鍵字從Robot Framework 2.1開始,資源文件本身也可以像設置測試套件一樣在設置表中使用文檔

無論libdocRIDE使用這些文檔,和他們自然可以為任何人打開資源文件。關鍵字文檔的第一行在運行時會被記錄,但在測試執行期間會忽略資源文件文檔。

示例資源文件

設置
文檔 示例資源文件    
圖書館 SeleniumLibrary    
資源 $ {}資源/common.html    
變量
$ {HOST} 本地主機:7272    
$ {} LOGIN_URL HTTP:// $ {HOST} /    
$ {} WELCOME_URL HTTP:// $ {HOST} /welcome.html    
$ {} BROWSER 火狐    
關鍵詞 行動 爭論 爭論 爭論
打開登錄頁面 [文檔] 打開瀏覽器 登錄頁面  
  打開瀏覽器 $ {} LOGIN_URL $ {} BROWSER  
  標題應該是 登錄頁面    
         
輸入名稱 [參數] $ {NAME}    
  輸入文本 username_field $ {NAME}  
         
輸入密碼 [參數] $ {}密碼    
  輸入文本 password_field $ {}密碼  

2.7.2變量文件

變量文件包含可在測試數據中使用的變量變量也可以使用變量表創建或從命令行設置,但變量文件允許動態創建它們,並且它們的變量可以包含任何對象。

變量文件通常實現為Python模塊,有兩種不同的方法可用於創建變量:

直接創建變量
變量被指定為模塊屬性。在簡單的情況下,語法非常簡單,不需要真正的編程。例如,  MY_VAR ='my value'創建一個變量 $ {MY_VAR},並將指定的文本作為值。
從特殊函數中獲取變量
變量文件可以有一個特殊的 get_variables (或getVariables)方法,它將變量作為映射返回。因為該方法可以采用參數,所以這種方法非常靈活。

或者,變量文件可以實現為 框架將實例化的Python或Java類同樣在這種情況下,可以將變量創建為屬性或從特殊方法獲取它們。

使用可變文件

設置表

所有測試數據文件都可以使用“ 設置”表中的“ 變量”設置導入變量 ,方法與使用“ 資源” 設置導入資源文件的方式相同 與資源文件類似,導入變量文件的路徑被認為是相對於導入文件所在的目錄,如果沒有找到,則從PYTHONPATH中的目錄中搜索。路徑也可以包含變量,斜杠在Windows上轉換為反斜杠。如果參數文件接受參數,則它們在路徑之后的單元格中指定,並且它們也可以包含變量。

導入變量文件
設置
變量 myvariables.py    
變量 ../data/variables.py    
變量 ${RESOURCES}/common.py    
變量 taking_arguments.py arg1 ${ARG2}

變量文件中的所有變量都可以在導入它的測試數據文件中找到。如果導入了多個變量文件並且它們包含具有相同名稱的變量,則最早導入的文件中的變量文件將被使用。此外,在變量表中創建並從命令行設置的變量會覆蓋變量文件中的變量。

命令行

使用變量文件的另一種方法是使用命令行選項 --variablefile可變文件是使用將它們的路徑引用的,以及可能的參數被連接到路徑用冒號():

--variablefile myvariables.py
--variablefile path / variables.py
--variablefile /absolute/path/common.py
--variablefile taking_arguments.py:arg1:arg2

這些文件中的變量在所有測試數據文件中全局可用,類似於使用--variable選項設置的 單個變量如果同時使用了--variablefile和 --variable選項,並且存在具有相同名稱的變量,那么使用--variable選項單獨設置的變量 優先。

直接創建變量

基本語法

當使用變量文件時,它們將作為Python模塊導入,並且所有不以下划線(_開頭的全局屬性都被視為變量。由於變量名稱不區分大小寫,因此可以使用小寫和大寫名稱,但通常,建議使用大寫字母表示全局變量和屬性。

VARIABLE = "An example string" ANOTHER_VARIABLE = "This is pretty easy!" INTEGER = 42 STRINGS = ["one", "two", "kolme", "four"] NUMBERS = [1, INTEGER, 3.14]

在上面的示例中,創建了變量$ {VARIABLE}, $ {ANOTHER VARIABLE}等。前兩個變量是字符串,第三個是整數,后兩個是列表。所有這些變量都是標量變量,甚至是包含列表作為值的變量要創建列表變量,變量名稱必須以LIST__為前綴(注意兩個下划線)。

LIST__STRINGS = ["list", "of", "strings"] LIST__MIXED = ["first value", -1.1, None, True]

上面兩個示例中的變量也可以使用下面的Variable表創建。

Variable Value Value Value Value
${VARIABLE} An example string      
${ANOTHER_VARIABLE} This is pretty easy!      
${INTEGER} ${42}      
${STRINGS} one two kolme four
${NUMBERS} ${1} ${INTEGER} ${3.14}  
@{STRINGS} list of strings  
@{MIXED} first value ${-1.1} ${None} ${True}
使用對象作為值

變量文件中的變量不僅限於將字符串或其他基類型作為變量表之類的值。相反,它們的變量可以包含任何對象。在下面的示例中,變量 $ {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')
動態創建變量

因為變量文件是使用真實的編程語言創建的,所以它們可以具有用於設置變量的動態邏輯。

import os import random import time USER = os.getlogin() # current login name RANDOM_INT = random.randint(0, 10) # random integer in range [0,10] CURRENT_TIME = time.asctime() # timestamp like 'Thu Apr 6 12:45:21 2006' if time.localtime()[3] > 12: AFTERNOON = True else: AFTERNOON = False

上面的示例使用標准Python庫來設置不同的變量,但您可以使用自己的代碼來構造值。下面的示例說明了這個概念,但同樣地,您的代碼可以從數據庫,外部文件中讀取數據,甚至可以從用戶那里獲取數據。

import math def get_area(diameter): radius = diameter / 2 area = math.pi * radius * radius return area AREA1 = get_area(1) AREA2 = get_area(2)
選擇要包含的變量

當Robot Framework處理變量文件時,所有不以下划線開頭的屬性都應該是變量。這意味着即使在變量文件中創建或從其他地方導入的函數或類也被視為變量。例如,除了$ {AREA1}和 $ {AREA2}之外,最后一個示例將包含變量$ {math} 和$ {get_area }

通常,額外的變量不會導致問題,但是它們可能會覆蓋其他一些變量並導致難以調試的錯誤。忽略其他屬性的一種可能性是在前面添加下划線:

import math as _math def _get_area(diameter): radius = diameter / 2.0 area = _math.pi * radius * radius return area AREA1 = _get_area(1) AREA2 = _get_area(2)

如果存在大量其他屬性,而不是為它們添加前綴,則通常更容易使用特殊屬性 __all__並為其提供要作為變量處理的屬性名稱列表。

import math __all__ = ['AREA1', 'AREA2'] def get_area(diameter): radius = diameter / 2.0 area = math.pi * radius * radius return area AREA1 = get_area(1) AREA2 = get_area(2)

注意

當使用modulename import*中的語法時,python還最初使用uu all_uuu屬性來決定導入哪些屬性。

從特殊函數中獲取變量

獲取變量的另一種方法是在變量文件中使用特殊的 get_variables函數(也可以使用camelCase語法 getVariables)。如果存在這樣的函數,Robot Framework會調用它並期望將變量作為Python字典或Java Map接收,其中變量名稱作為鍵,變量值作為值。變量被認為是標量,除非前綴為LIST__,值可以包含任何內容。下面的示例在功能上與上面直接創建變量的第一個示例相同 

def get_variables(): variables = {"VARIABLE ": "An example string", "ANOTHER_VARIABLE": "This is pretty easy!", "INTEGER": 42, "STRINGS": ["one", "two", "kolme", "four"], "NUMBERS": [1, 42, 3.14], "LIST__STRINGS": ["list", "of", "strings"], "LIST__MIXED": ["first value", -1.1, None, True]} return variables

get_variables也可以使用參數,這有助於更改實際創建的變量。該函數的參數設置與Python函數的任何其他參數一樣。考慮可變文件到使用在所述測試數據,自變量在細胞中的路徑,變量文件后指定,並且在命令行它們從用冒號路徑分離。

下面的虛擬示例顯示了如何將參數與變量文件一起使用。在一個更現實的例子中,參數可以是外部文本文件或數據庫的路徑,從中讀取變量。

variables1 = {'scalar': 'Scalar variable', 'LIST__list': ['List','variable']} variables2 = {'scalar' : 'Some other value', 'LIST__list': ['Some','other','value'], 'extra': 'variables1 does not have this at all'} def get_variables(arg): if arg == 'one': return variables1 else: return variables2

將變量文件實現為Python或Java類

從Robot Framework 2.7開始,可以將變量文件實現為Python或Java類。

履行

由於變量文件始終使用文件系統路徑導入,因此將它們創建為類具有一些限制:

  • Python類必須與它們所在的模塊具有相同的名稱。
  • Java類必須存在於默認包中。
  • Java類的路徑必須以.java.class結尾兩種情況下都必須存在類文件。

無論實現語言如何,框架都將使用無參數創建類的實例,並且將從實例獲取變量。與模塊類似,變量可以直接在實例中定義為屬性,也可以從特殊的get_variables (或getVariables)方法獲取。

當直接在實例中定義變量時,將忽略包含可調用值的所有屬性,以避免從實例具有的可能方法創建變量。如果您確實需要可調用變量,則需要使用其他方法來創建變量文件。

例子

第一個示例使用Python和Java從屬性創建變量。它們都從類屬性創建變量$ {VARIABLE}@ {LIST}從實例屬性創建$ {ANOTHER VARIABLE}

class StaticPythonExample(object): variable = 'value' LIST__list = [1, 2, 3] _not_variable = 'starts with an underscore' def __init__(self): self.another_variable = 'another value' 
public class StaticJavaExample { public static String variable = "value"; public static String[] LIST__list = {1, 2, 3}; private String notVariable = "is private"; public String anotherVariable; public StaticJavaExample(String arg1, String arg2) { anotherVariable = "another value"; } }

第二個例子利用動態方法獲取變量。它們都只創建一個變量$ {DYNAMIC VARIABLE}

class DynamicPythonExample(object): def get_variables(self, *args): return {'dynamic variable': ' '.join(args)} 
import java.util.Map; import java.util.HashMap; public class DynamicJavaExample { public Map<String, String> getVariables(String arg1, String arg2) { HashMap<String, String> variables = new HashMap<String, String>(); variables.put("dynamic variable", arg1 + " " + arg2); return variables; } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM