Robot Framework的變量分為標量, 列表和字典, 分別使用語法格式 ${SCALAR}
, @{LIST}
和 &{DICT}
來定義。
此外, 環境變量可以直接使用語法 %{ENV_VAR}
來獲取。
標量:可理解為單值變量,與之對應的是List這種多值變量。單值不僅僅像是字符串、數值這樣的,還有可能是個對象或者字典。
列表:只有帶@標識的變量能夠確認是List變量。而帶$標識的變量則要取決於它的變量名或者變量值,才能確定它到底是什么變量,特別是變量值。
因為變量之間是可以轉換的,例如使用$標識的變量,實際上也可以在接收List值后轉換成List變量。
變量在下面的情況中很有用:
- 當測試數據中的字符串經常變化時. 使用變量的話就只需要在一個地方修改.
- 當創建系統無關和平台無關的測試數據時. 使用變量替代硬編碼的字符串可以非常方便(例如,
${RESOURCES}
替代c:\\resources
,${HOST}
替代10.0.0.1:8080
). 因為變量值可以在測試執行時 通過命令行選項設置, 所以修改系統相關的變量非常容易(例如,--variable HOST:10.0.0.2:1234 --variableRESOURCES:/opt/resources
). - 當需要傳遞對象而不是字符串參數給關鍵字時. 這種情況下只能使用變量實現.
- 當不同的關鍵字(這些關鍵字可能來自不同的庫)之間需要通信時. 可以將一個關鍵字的返回值先賦值給一個變量, 然后再作為參數傳遞給另外一個關鍵字
- 當某個值太長或者太復雜時. 例如, 使用
${URL}
比直接使用http://long.domain.name:8080/path/to/service?foo=1&bar=2&zap=42
簡短很多.
Robot Framework 變量, 與關鍵字類似, 是不區分大小寫的, 同時其中的下划線和空格也會被忽略。推薦使用大寫字母來表示全局變量(如 ${PATH}
或 ${TWO WORDS}
), 小寫字母來表示局部變量(如 ${my var}
或 ${myVar}
)。
內置變量
內置的操作系統相關的變量,減少了測試數據對操作系統之間的差異性的關注
RF 中可用的操作系統相關的內置變量如下表:
變量 | 用途 |
${CURDIR} | 測試數據文件所在目錄的絕對路徑,該參數是大小寫敏感的 |
${TEMPDIR} | 操作系統臨時目錄的絕對路徑,在類 Unix 系統中,該路徑通常是 /tmp;在 Windows 系統中,通常是 c:\Documents and Settings\<user>\Local Settings\Temp |
${EXECDIR} | 到測試開始執行的目錄的絕對路徑 |
${/} | 操作系統文件路徑分隔符,在類 Unix 系統中為: ‘/’, 在 Windows 中則為: ‘\’ |
${:} | 操作系統路徑元素分隔符,在類 Unix 系統中為: ‘:’,在 Windows 中則為: ‘;’ |
${\n} | 操作系統行分隔符,在類 Unix 系統中為: ‘\n’,在 Windows 中則為: ‘\r\n’ |
*** Test Cases *** Example Create Binary File ${CURDIR}${/}input.data Some text here${\n}on two lines Set Environment Variable CLASSPATH ${TEMPDIR}${:}${CURDIR}${/}foo.jar
一、獲取列表項
使用下標語法 @{NAME}[index]
可以獲取到列表變量中指定項的值, 其中 index
是要獲取的項的下標。下標從0開始, 負數的下標等同於從列表末尾向前數。
下標長度超過列表范圍會導致錯誤。下標值自動轉換為整數, 同樣支持變量表示。獲取到的列表項基本等同於一個標量變量。
示例:
二、字典變量
2.1 字典中的項可以作為命名參數傳給關鍵字。假設有個字典變量 &{USER}
中有值 {'name': 'robot', 'password': 'secret'}
, 則下面兩個用例的效果是等價的。
2.2 獲取字典變量中的項
可以通過 &{NAME}[key]
這樣的語法格式獲取字典中某項的值, 其中 key
是鍵的名稱。鍵名當作字符串處理, 非字符串的鍵可以用變量代替。通過這種方式獲取到的值可作為標量變量使用。
如果鍵是字符串, 還可以使用另一種語法格式 ${NAME.key} (注意到這里是
$
)。
示例:
三、創建變量
3.1 創建標量變量
如果一個標量變量的值很長, 可以分割到多列甚至多行。默認情況下, 各個單元格中的值最終會使用空格拼接起來, 不過可以在第一格中使用 SEPARATOR=<sep>
來指定 連接符。
執行結果:
3.2 創建列表變量
3.3 創建字典變量
如果有多個項重名, 只保留最后那個. 如果項中包含字面的等號, 則該等號必須使用反斜杠進行 轉義, 如 \=
字典變量中的項是有順序的,也就是說字典總是會按定義時的順序迭代,這在把字典當作列表變量使用時(例如在 FOR循環 )很有用。當字典被當作列表迭代時, 實際返回的值是字典的鍵。例如, @{MANY}
變量的值是 ['first', 'second', 3]。
四、命令行中設置變量
變量可以在命令行中通過選項 --variable (-v)
單個設置, 也可以通過選項 --variablefile (-V)
設置變量文件。通過命令行設置的變量對所有執行的測試文件是全局可見的, 不過如果局部的變量表格或者局部導入的變量文件中存在重名的變量, 則這些變量也會被命令行中指定的值所覆蓋。
設置單個變量的選項格式是 --variable name:value
, 其中 name
是變量名, 不帶 ${}
value`是變量的值。有多個變量的話就使用這個選項多次。這種方式只能定義標量變量,很多特殊字符必須使用選項 :option:–escape` 經過轉義才能表示。
--variable EXAMPLE:value --variable HOST:localhost:7272 --variable USER:robot --variable ESCAPED:Qquotes_and_spacesQ --escape quot:Q --escape space:_
在上例中, 變量值分別是:
${EXAMPLE}
值為value
${HOST}
和${USER}
值分別為localhost:7272
和robot
${ESCAPED}
值為"quotes and spaces"
在命令行中指定變量文件的選項格式是 --variablefile path/to/variables.py
注:如果變量同時在命令行的變量文件中和單獨指定, 則單獨指定的變量有更高的優先級。
五、關鍵字的返回
關鍵字的返回值可以賦值給變量, 這樣不同的關鍵字之間就可以進行交互。
這種方式定義的變量和其它變量基本相同, 只是其作用域僅限於它們被創建的 local scope。也就是說 不可能 在一個測試用例里得到這樣一個返回值變量, 然后在另一個用例中使用。因為自動化測試用例通常需要保持相互獨立, 而不應該互相依賴。如果用例中定義的變量可以在其它用例使用, 這將導致很難定位的錯誤。
示例:
六、使用關鍵字創建變量
通過關鍵字 Set Test Variable 設置的變量在當前測試用例的作用域內處處可用。例如, 在一個測試用例中的一個用戶關鍵字中設置了一個變量, 該變量會在這個測試用例步驟可見, 同時當前用例中的其它用戶關鍵字也可以使用這個變量,這個關鍵字創建的變量在其它測試用例中不可用。
通過關鍵字 Set Suite Variable 創建的變量在當前執行的測試套件內處處可見。 使用這個方式創建變量和在測試數據文件的變量表格中定義變量, 以及從變量文件導入變量的效果一樣。這些變量對其它的測試套件, 包括子套件, 都不可見。
通過關鍵字 Set Global Variable 創建的變量在設置之后全局可見。這種方式創建的變量和在 setting variables in command line 中使用選項 --variable
或 --variablefile
定義變量效果一樣,因為這個關鍵字會改變任意地方的變量, 所以必須謹慎使用。
注:關鍵字 Set Test/Suite/Global Variable 直接在作用域內設置變量, 沒有返回值。而 Set Variable 設置局部變量, 並且有返回值。
七、數字變量
Robot Framework默認傳遞的是字符串,顯式的傳遞數字對那些預期接受參數是數字(而不是數字字符串)的關鍵字來說很有用。
*** Test Cases *** Example 1A Connect example.com 80 # Connect gets two strings as arguments Example 1B Connect example.com ${80} # Connect gets a string and an integer Example 2 Do X ${3.14} ${-1e-4} # Do X gets floating point numbers 3.14 and -0.0001
八、布爾值和None/null值
*** Test Cases *** Boolean Set Status ${true} # Set Status gets Boolean true as an argument Create Y something ${false} # Create Y gets a string and Boolean false None Do XYZ ${None} # Do XYZ gets Python None as an argument Null ${ret} = Get Value arg # Checking that Get Value returns Java null Should Be Equal ${ret} ${null}
注:這些變量也是大小寫不敏感的,所以 ${True} 和 ${true} 是一樣的。此外 ${None} 和 ${null} 是同義詞,因為用 Jython 解釋器執行用例時, Jython 會自動將 None 和 null 轉換成正確格式。
九、空格和空字符串/列表/字典
變量 ${SPACE}
和 ${EMPTY}
分別用來創建空格和空字符串,使用這些變量相對於使用反斜杠來轉義空格容易的多。同時還可以使用擴展變量語法表示連續的多個空格, 例如 ${SPACE * 5}
下面的例子中, 關鍵字 Should Be Equal 接收到兩個等價的入參, 可以看出使用變量的形式比使用反斜杠看上去容易理解的多。
*** Test Cases *** One Space Should Be Equal ${SPACE} \ \ Four Spaces Should Be Equal ${SPACE * 4} \ \ \ \ \ Ten Spaces Should Be Equal ${SPACE * 10} \ \ \ \ \ \ \ \ \ \ \ Quoted Space Should Be Equal "${SPACE}" " " Quoted Spaces Should Be Equal "${SPACE * 2}" " \ " Empty Should Be Equal ${EMPTY} \
還有兩個變量 @{EMPTY} 和 &{EMPTY},他們分別表示 ‘空列表’ 和 ‘空字典’ 變量。 這兩個變量也是有用的,例如在寫測試模板的時候,模板關鍵字不帶參數使用時。
*** Test Cases ***
Template
[Template] Some keyword
@{EMPTY}
Override
Set Global Variable @{LIST} @{EMPTY}
Set Suite Variable &{DICT} &{EMPTY}
十、自動變量
自動變量被RF框架創建和修改,在測試執行過程中值可能會變化;另外,某些自動變量在執行過程中並非總是可用。
修改自動變量,並不能對變量的初始值產生影響。
但可以用某些內建關鍵字來修改某些自動變量的值。
變量名 | 含義 | 可用范圍 |
---|---|---|
${TEST NAME} | 當前測試用例的名字 | Test case |
@{TEST TAGS} | 當前測試用例的標簽(按字母序)。可以使用"Set Tags"和"Remove Tags"關鍵字修改 | Test case |
${TEST DOCUMENTATION} | 當前測試用例的文檔說明。可以使用"Set Test Documentation"關鍵字修改 | Test case |
${TEST STATUS} | 當前測試用例的狀態: Pass或FAIL | Test teardown |
${TEST MESSAGE} | 當前測試用例的消息 | Test teardown |
${PREV TEST NAME} | 前一個測試用例的名字。如果還沒有用例被執行,值為空字符串 | Everywhere |
${PREV TEST STATUS} | 前一個測試用例的狀態: Pass或FAIL。如果還沒有用例被執行,值為空字符串 | Everywhere |
${PREV TEST MESSAGE} | 前一個測試用例的錯誤消息 | Everywhere |
${SUITE NAME} | 當前Suite的全名 | Everywhere |
${SUITE SOURCE} | Suite的文件或目錄的絕對路徑 | Everywhere |
${SUITE DOCUMENTATION} | 當前測試Suite的文檔說明。可以使用"Set Suite Documentation"關鍵字修改 | Everywhere |
&{SUITE METADATA} | 當前測試Suite的元數據。可以使用"Set Suite Metadata"關鍵字修改 | Everywhere |
${SUITE STATUS} | 當前測試Suite的狀態: Pass或FAIL | teardown |
${SUITE MESSAGE} | 當前測試Suite的消息, 包括統計信息 | Suite teardown |
${KEYWORD STATUS} | 當前測試關鍵字的狀態: Pass或FAIL | User keyword teardown |
${KEYWORD MESSAGE} | 當前測試關鍵字的錯誤消息 | User keyword teardown |
${LOG LEVEL} | 當前的日志級別 | Everywhere |
${OUTPUT FILE} | 輸出(output)文件的絕對路徑 | Everywhere |
${LOG FILE} | 日志(log)文件的絕對路徑。如果沒有日志文件,值為空字符串 | Everywhere |
${REPORT FILE} | 報告(report)文件的絕對路徑。如果沒有報告文件,值為空字符串 | Everywhere |
${DEBUG FILE} | 調試(debug)文件的絕對路徑。如果沒有調試文件,值為空字符串 | Everywhere |
${OUTPUT DIR} | 輸出(output)文件所在目錄的絕對路徑 |
使用例子:
-------
------
十一、變量的作用域
在通常情況下,每個變量默認都是局部變量,在默認情況下,變量的作用域為:
- 一個case里的變量,作用域在這個case內部
- 一個userkeyword里的變量,作用域在這個userkeyword內部
- 一個文件型suite里的變量,作用域在這個suite內部,所有下級case都可以使用
- 一個目錄型suite里的變量,作用域在這個目錄內,但是它下級文件型suite是無法使用的,所以一般在目錄下新增變量沒有太大意義
變量的作用域是可以改變的,通過一些關鍵字的處理,對變量進行作用域的改變,常用的關鍵字有:
- Set Global Variable為設定全局變量。當執行過這個設置后,這個變量在所有的測試案例和測試套件中都有效
- Set Suite Variable為設定File Suite級變量。當執行過這個設置后,這個變量在當前的File Suite內都有效
- Set Test Variable為設定Case級變量。當執行過這個設置后,這個變量在當前的Test Case內有效
原文地址:https://www.cnblogs.com/chengchengla1990/p/6725162.html
https://www.cnblogs.com/chengchengla1990/p/7056541.html