文章目錄
轉載請註明原始鏈接:https://blog.csdn.net/a464057216/article/details/104396440
後續此博客不再更新,歡迎大家搜索關注微信公衆號“測開之美”,測試開發工程師技術修煉小站,持續學習持續進步。
閱讀本文前,請先閱讀85.Robot Framework測試數據基本語法。本文介紹如何創建測試用例,創建測試套的方法在後面的88.Robot Framework創建測試套中介紹。使用Robot Framework框架進行自動化測試可以使用測試用例(Test case),進行一般化的自動化任務建議使用任務(Task)。任務的語法大部分與測試用例一致,差異部分在下一篇87.Robot Framework創建任務中介紹。
測試用例語法
基礎語法
測試用例在測試用例表中定義,由關鍵字組成。關鍵字從測試庫文件、資源文件中導入,或者在測試用例文件的關鍵字表(Keywords)中定義。
測試用例表的第一列是測試用例名。測試用例從包含測試用例名的行開始,直到下一個包含測試用例名的行或測試用例表結束。測試用例名不要包含通配符?
、*
,它們通常用於選擇執行部分測試用例,例如--test 'Example *'
運行所有名字以Example
開頭的測試用例。測試用例表表頭和第一個測試用例之間不能包含其他內容。
測試用例表的第二列通常是關鍵字。在利用關鍵字返回的值設置變量的場景,第二列及後續列可能是變量名,然後纔是關鍵字。無論哪種情況,關鍵字後面的列通常包含關鍵字的參數。
測試用例示例:
*** Test Cases ***
Valid Login
Open Login Page
Input Username demo
Input Password mode
Submit Credentials
Welcome Page Should Be Open
Setting Variables
Do Something first argument second argument
${value} = Get Some Value
Should Be Equal ${value} Expected value
測試用例表中的設置
測試用例可以有自己的設置。設置名和關鍵字一樣在第二列,設置的值在後續的列中。測試用例中的設置名用方括號包圍以便和關鍵字區分。設置名列表如下:
[Documentation]
:測試用例說明。[Tags]
:測試用例標籤。[Setup]
、[Teardown]
:測試用例的setup、teardown。[Template]
:指定使用的模板關鍵字,測試用例中只包含作爲模板關鍵字的參數的數據。[Timeout]
:測試用例超時時間。
設置名大小寫不敏感,允許設置名和方括號之間存在空格。
帶設置的測試用例舉例:
*** Test Cases ***
Test With Settings
[Documentation] Another dummy test
[Tags] dummy owner-lmz
Log Hello, world!
設置表(Settings)中與測試用例相關的設置
設置表中存在如下與測試用例相關的設置(注意沒有方括號包圍),對測試文件中所有測試用例都生效:
Force Tags
、Default Tags
:測試用例中配置項[Tags]
的強制補充值和默認值。Test Setup
、Test Teardown
:測試用例中配置項[Setup]
和[Teardown]
的默認值。Test Template
:測試用例中默認使用的模板關鍵字。Test Timeout
:測試用例中配置項[Timeout]
的默認值。
關鍵字的參數
關鍵字可以接收不同的參數,參數可以有默認值,這些都取決於關鍵字如何實現。關鍵字的文檔中通常包含其參數的使用說明。Libtool
或javadoc
工具可以自動生成文檔。
位置參數
位置參數在關鍵字文檔中通過逗號分割的參數名區分,例如first, second, third
。位置參數本身叫什麼名字無所謂,重要的是參數的位置,但是參數名也最好能夠解釋位置參數的意義。使用關鍵字的時候,提供的參數個數要和關鍵字文檔中說明的參數個數一致。
下面的例子中,使用OperatingSystem
庫中的Create Directory
和Copy File
關鍵字,分別需要一個參數(path
)和兩個參數(source
、destination
)。Builtin
庫中的No Operation
關鍵字不需要參數。
*** Test Cases ***
Example
Create Directory ${TEMPDIR}/stuff
Copy File ${CURDIR}/file.txt ${TEMPDIR}/stuff
No Operation
默認值
有默認值的參數,在關鍵字文檔中參數名和默認值以=
號分割,例如name=default value
。有默認值的參數後面不能有位置參數。
下面的例子中,Create File
關鍵字參數爲path, content=, encoding=UTF-8
:
*** Test Cases ***
Example
Create File ${TEMPDIR}/empty.txt
Create File ${TEMPDIR}/utf-8.txt Hyvä esimerkki
Create File ${TEMPDIR}/iso-8859-1.txt Hyvä esimerkki ISO-8859-1
Java中一個方法可以通過不同簽名有多種實現,Robot Framework將這樣的多種實現作爲一個關鍵字。可以利用這個特性實現有默認值的參數,例如:
public void oneDefault(String arg) {
System.out.println("Argument has value " + arg);
}
public void oneDefault() {
oneDefault("default");
}
public void multipleDefaults(String arg1, String arg2, String arg3) {
System.out.println("Got arguments " + arg1 + ", " + arg2 + " and " + arg3);
}
public void multipleDefaults(String arg1, String arg2) {
multipleDefaults(arg1, arg2, "default 2");
}
public void multipleDefaults(String arg1) {
multipleDefaults(arg1, "default 1");
參數個數可變
關鍵字可以接收任意多個參數,所謂varargs
。位置參數、帶默認值的參數可以和varargs
共存,varargs
通常在參數列表的最後。在關鍵字文檔中varargs
通過一個星號開頭的*varargs
描述。
OperatingSystem
庫中的關鍵字Remove Files
和Join Paths
,參數描述分別是*paths
和base, *paths
:
*** Test Cases ***
Example
Remove Files ${TEMPDIR}/f1.txt ${TEMPDIR}/f2.txt ${TEMPDIR}/f3.txt
@{paths} = Join Paths ${TEMPDIR} f1.txt f2.txt f3.txt f4.txt
命名參數
調用關鍵字時,命名參數arg=value
可以明確爲關鍵字的哪個參數賦值。命名參數大小寫敏感(參數名必須大小寫一致),空格敏感(等號左邊不允許有空格,等號右邊的空格會被當做參數值的一部分)。
調用用戶自定義的關鍵字,命名參數不能使用${}
裝飾參數名。比如關鍵字的參數是${arg1}=first, ${arg2}=second
,如果爲arg1
參數提供參數值,必須是arg1=first
的形式。
位置參數不能出現在命名參數後面。命名參數之間的相對順序無關緊要。
命名參數與變量
命名參數的參數名和參數值都可以使用變量。如果變量是標量(scalar variable),標量會原樣傳遞給關鍵字,不會被轉換爲字符串。比如關鍵字的參數是arg=${object}
,會把${object}
對象原樣傳遞給關鍵字,而不是將${object}
轉換爲字符串後傳遞給關鍵字。
如果命名參數的參數名包含變量,先解析這些變量,再進行關鍵字的參數匹配。
命名參數需要明確寫出=
符號,只有參數值不算是命名參數,即使參數值包含foo=bar
的形式。關鍵字定義包含其他關鍵字時尤其需要注意。例如,關鍵字Run Program
通過數組形式@{args}
接收任意多個參數,再把任意多個參數用同樣的語法@{args}
傳給關鍵字Run Process
,測試用例中調用Run Program
使用的named=value
命名參數形式可能不會被正確地識別:
*** Test Cases ***
Example
Run Program shell=True # This will not come as a named argument to Run Process
*** Keywords ***
Run Program
[Arguments] @{args}
Run Process program.py @{args} # Named arguments are not recognized from inside @{args}
要在關鍵字間傳遞命名參數,需要使用自由命名參數(free named argument),自由命名參數也可以傳遞位置參數。
對命名參數轉義
有時位置參數的值可能是foo=bar
的形式,如果恰好還有一個帶默認值的參數foo
,會造成關鍵字參數值的錯誤解析。使用轉義語法foo\=bar
可以明確不使用命名參數語法,爲位置參數提供參數值。
支持命名參數的場景
導入庫文件、調用關鍵字都支持使用命名參數。用戶自定義關鍵字和大多數測試庫關鍵字支持命名參數。唯一例外是基於Java使用了靜態庫API的庫中的關鍵字。Libdoc
生成的文檔會說明庫是否支持命名參數。
下面的例子,展示了在引入庫文件(Telnet
)時、調用自定義關鍵字和測試庫中的關鍵字時,如何提供命名參數:
*** Settings ***
Library Telnet prompt=$ default_log_level=DEBUG
*** Test Cases ***
Example
Open connection 10.0.0.42 port=${PORT} alias=example
List files options=-lh
List files path=/tmp options=-l
*** Keywords ***
List files
[Arguments] ${path}=. ${options}=
Execute command ls ${options} ${path}
自由命名參數(Free Named Argument)
自由命名參數,也叫自由關鍵字參數或kwargs
。關鍵字可以用一個參數接收所有符合命名參數語法的參數值。支持自由命名參數語法的場景與支持命名參數語法的場景相同。
基於Python的關鍵字的自由命名參數語法是**kwargs
,用戶自定義關鍵字的自由命名參數語法是&{kwargs}
。
自由命名參數的參數名和參數值都支持變量,但是自由命名參數的參數名必須是字符串。
下面的例子中,Process
庫中的Run Process
關鍵字,參數描述爲command, *arguments, **configuration
:
*** Test Cases ***
Free Named Arguments
Run Process program.py arg1 arg2 cwd=/home/user
Run Process program.py argument shell=True env=${ENVIRON}
在命名參數教程中提到的傳遞位置參數和命名參數問題,可以通過自由命名參數解決:
*** Test Cases ***
Free Named Arguments
Run Program arg1 arg2 cwd=/home/user
Run Program argument shell=True env=${ENVIRON}
*** Keywords ***
Run Program
[Arguments] @{args} &{config}
Run Process program.py @{args} &{config}
強制名字參數
強制名字參數的思想來自Python的強制關鍵字參數。Robot Framework的關鍵字可以約束帶默認值的參數,在調用時必須使用命名參數語法提供參數值,例如:
*** Test Cases ***
Named-only Arguments
Run Program arg1 arg2 # 'shell' is False (default)
Run Program argument shell=True # 'shell' is True
*** Keywords ***
Run Program
[Arguments] @{args} ${shell}=False
Run Process program.py @{args} shell=${shell}
參數嵌入關鍵字名
向關鍵字提供參數,也可以將參數嵌入到關鍵字的名字中。測試庫關鍵字和用戶自定義關鍵字都支持這種用法,這會在後面的庫關鍵字和用戶自定義關鍵字的教程中介紹。
失敗
測試用例中任何一個關鍵字失敗,會導致測試用例失敗。測試用例失敗會終止測試用例的執行,如果存在teardown的話執行清理,再繼續執行下一個測試用例。如果測試用例失敗時不想立即終止測試用例的執行,可以使用可繼續的失敗(continuable failure)。
測試用例的失敗錯誤消息從失敗的關鍵字中獲取。
在可繼續的失敗場景中,測試用例可以失敗多次,此時錯誤消息是多次失敗的錯誤消息的組合。爲了提高可讀性,測試報告中較長的錯誤消息自動從中間截斷,但是完整的錯誤消息在日誌文件中仍然可見。
錯誤消息是純文本格式,也可以包含HTML。HTML格式使用*HTML*
標記開啓,在最終的測試報告和測試日誌中,不會出現標記符號*HTML*
。例如:
*** Test Cases ***
Normal Error
Fail This is a rather boring example...
HTML Error
${number} = Get Number
Should Be Equal ${number} 42 *HTML* Number is not my <b>MAGIC</b> number.
測試用例名和文檔
一個測試套內的測試用例名字唯一。在測試用例中、用戶自定義關鍵字中、測試用例的setup和teardown中,都可以使用自動變量${TEST_NAME}
獲取測試用例名。
[Documentation]
爲測試用例添加文檔。文檔會出現在命令行輸出、測試日誌、測試報告中。文檔可以使用HTML格式,支持使用變量。
如果說明文檔被分隔到多列,同一行的單元格被空格拼接到一起。這在使用HTML格式或者每一列比較狹窄時非常有用。如果文檔被分隔到多行,多行之間通過換行符拼接到一起。如果行尾已經以\n
結束或者包含一個反斜線轉義符(\
,表示續行),則不會再添加換行符。例如:
*** Test Cases ***
Simple
[Documentation] Simple documentation
No Operation
Formatting
[Documentation] *This is bold*, _this is italic_ and here is a link: http://robotframework.org
No Operation
Variables
[Documentation] Executed at ${HOST} by ${USER}
No Operation
Splitting
[Documentation] This documentation is split into multiple columns
No Operation
Many lines
[Documentation] Here we have
... an automatic newline
No Operation
測試用例標籤
標籤是簡單又強大的測試用例分類機制。標籤內容是任意文本,具體功能爲:
- 標籤展示在測試報告、測試日誌、測試用例中,屬於測試用例元信息。
- 測試用例統計,每個標籤下的測試用例總數、通過數、失敗數自動統計。
- 通過標籤包含或排除某些測試用例的執行。
- 通過標籤可以指定關鍵性測試用例,關鍵性測試用例會影響測試結論是通過還是失敗。
下面介紹如何設置標籤:
- 設置表(Settings)中的
Force Tags
: 測試文件中所有測試用例都追加該標籤。如果在測試套初始化文件中使用Force Tags
,測試套中所有測試用例都追加該標籤。 - 設置表中的
Default Tags
:測試用例中沒有[Tag]
標籤的,都使用Default Tags
的標籤。測試套初始化文件不支持Default Tags
標籤。 - 測試表中的
[Tags]
標籤(注意有方括號):配置測試用例的標籤,不包含設置表中Defaults Tags
的標籤。[Tags]
使用空值或NONE
也可以覆蓋設置表中Default Tags
的設置。 --settag
命令行選項:所有被執行的測試用例附加該選項指定的標籤。Set Tags
、Remove Tags
、Fail
、Pass Execution
關鍵字:這些Builtin
庫中的關鍵字可以在測試用例執行過程中動態修改測試用例的標籤。
雖然標籤內容允許是任意值,但是它們通常被標準化爲全小寫,並刪除所有的空格。標籤值可以包含變量(前提是變量存在)。
*** Settings ***
Force Tags req-42
Default Tags owner-john smoke
*** Variables ***
${HOST} 10.0.1.42
*** Test Cases ***
No own tags
[Documentation] This test has tags owner-john, smoke and req-42.
No Operation
With own tags
[Documentation] This test has tags not_ready, owner-mrx and req-42.
[Tags] owner-mrx not_ready
No Operation
Own tags with variables
[Documentation] This test has tags host-10.0.1.42 and req-42.
[Tags] host-${HOST}
No Operation
Empty own tags
[Documentation] This test has only tag req-42.
[Tags]
No Operation
Set Tags and Remove Tags Keywords
[Documentation] This test has tags mytag and owner-john.
Set Tags mytag
Remove Tags smoke req-*
保留標籤
RF框架的保留標籤以robot:
開頭,用戶使用的標籤不要包含這個前綴。目前框架中只有兩個保留標籤:robot:exit
用於測試用例的平滑結束,robot:no-dry-run
用於抑制演練(dry run)模式,演練模式不會真正執行測試庫中的關鍵字,只用於測試數據的語法驗證。
測試用例setup和teardown
setup是測試用例執行前的準備動作,teardown是測試用例執行後的清理動作。RF框架的setup和teardown是兩個關鍵字。如果準備動作和清理動作需要很多步驟才能完成,定義更高級的關鍵字或者使用Builtin
庫中的Run Keywords
關鍵字依次調用更多的關鍵字。
即使測試用例執行失敗,teardown中的清理動作也會執行。另外,即使teardown中的某個關鍵字執行失敗,後面的關鍵字也會繼續執行。這種“失敗後繼續”的功能可以在其他關鍵字中開啓,在teardown中默認開啓。
設置表(Settings)中Test Setup
和Test Teardown
設置可以爲一個測試用例文件中的所有測試用例配置setup和teardown。測試用例表中每個測試用例自己的[Setup]
和[Teardown]
可以覆蓋Test Setup
和Test Teardown
的設置。[Setup]
、[Teardown]
後面沒有關鍵字意味着setup和teardown不做任何操作,或者使用NONE
明確說明。
*** Settings ***
Test Setup Open Application App A
Test Teardown Close Application
*** Test Cases ***
Default values
[Documentation] Setup and teardown from setting table
Do Something
Overridden setup
[Documentation] Own setup, teardown from setting table
[Setup] Open Application App B
Do Something
No teardown
[Documentation] Default setup, no teardown at all
Do Something
[Teardown]
No teardown 2
[Documentation] Setup and teardown can be disabled also with special value NONE
Do Something
[Teardown] NONE
Using variables
[Documentation] Setup and teardown specified using variables
[Setup] ${SETUP}
Do Something
[Teardown] ${TEARDOWN}
setup和teardown要執行的關鍵字可以是變量,這使得可以在不同的環境上通過命令行參數令setup、teardown執行不同的操作。
測試套可以有自己的setup、teardown,測試套的setup在所有測試用例及子測試套的執行前執行,teardown在他們執行後執行。
測試模板
採用測試模板的測試用例是數據驅動型。關鍵字驅動的測試用例由關鍵字及其可能的參數組成,採用測試模板的測試用例只包含模板關鍵字的參數,能夠做到同樣的關鍵字在每個測試用例文件中只出現一次,而不用出現在每個測試用例中。
模板關鍵字接受位置參數、命名參數、嵌入到關鍵字名中的參數。不能使用變量定義模板。
基本用法
例如下面的例子中,兩個測試用例其實是一樣的:
*** Test Cases **
Normal test case
Example keyword first argument second argument
Templated test case
[Template] Example keyword
first argument second argument
測試用例可以使用[Template]
定義模板關鍵字。設置表(Settings)中Test Template
設置會對測試用例文件中的所有測試用例生效。測試用例的[Template]
設置會覆蓋設置表的Test Template
設置。爲[Template]
提供空值或者NONE
表示測試用例不使用模板關鍵字。
如果包含模板關鍵字的測試用例有很多行參數數據,模板關鍵字依次被應用到參數數據的每一行,每次都執行相同的關鍵字。如果某行參數數據導致包含模板關鍵字的測試用例失敗,剩餘的數據還會繼續執行。常規測試用例中也可以開啓這種“失敗後繼續”的功能,包含模板關鍵字的測試用例是自動開啓的。
一個使用設置表中Test Template
指定的模板關鍵字的例子如下:
*** Settings ***
Test Template Example keyword
*** Test Cases ***
Templated test case
first round 1 first round 2
second round 1 second round 2
third round 1 third round 2
包含模板關鍵字的測試用例,仍然支持參數默認值、varargs
、命名參數、自由命名參數等。在參數或參數值中使用變量的支持也和之前一樣。
模板關鍵字名字包含嵌入的參數
模板的關鍵字支持在關鍵字名字中嵌入參數,例如:
*** Test Cases ***
Normal test case with embedded arguments
The result of 1 + 1 should be 2
The result of 1 + 2 should be 3
Template with embedded arguments
[Template] The result of ${calculation} should be ${expected}
1 + 1 2
1 + 2 3
*** Keywords ***
The result of ${calculation} should be ${expected}
${result} = Calculate ${calculation}
Should Be Equal ${result} ${expected}
模板關鍵字有嵌入參數時,爲模板關鍵字提供的參數個數,必須和關鍵字本身定義的參數個數一致,但不一定和關鍵字本身定義的參數名一致:
*** Test Cases ***
Different argument names
[Template] The result of ${foo} should be ${bar}
1 + 1 2
1 + 2 3
Only some arguments
[Template] The result of ${calculation} should be 3
1 + 2
4 - 1
New arguments
[Template] The ${meaning} of ${life} should be 42
result 21 * 2
帶for循環的模板
如果模板使用了for循環,也支持“失敗後繼續”,即使循環中某個步驟失敗,後續的步驟也會繼續執行。例如:
*** Test Cases ***
Template and for
[Template] Example keyword
FOR ${item} IN @{ITEMS}
${item} 2nd arg
END
FOR ${index} IN RANGE 42
1st arg ${index}
END
不同的測試用例風格
涉及流程的測試用例可以採用關鍵字驅動或行爲驅動。爲同樣的流程測試多組不同的輸入可以採用數據驅動。
關鍵字驅動
即本文介紹的通常由多個關鍵字及其參數組成的測試用例形式。一般流程是系統初始化,然後在系統中執行測試操作,最後驗證系統表現符合預期。
數據驅動
如果多個測試用例調用同一個關鍵字,區別只是輸入、輸出數據不同,就可以採用藉助測試模板的數據驅動形式,例如:
*** Settings ***
Test Template Login with invalid credentials should fail
*** Test Cases *** USERNAME PASSWORD
Invalid User Name invalid ${VALID PASSWORD}
Invalid Password ${VALID USER} invalid
Invalid User Name and Password invalid invalid
Empty User Name ${EMPTY} ${VALID PASSWORD}
Empty Password ${VALID USER} ${EMPTY}
Empty User Name and Password ${EMPTY} ${EMPTY}
根據85.Robot Framework測試數據基本語法對測試數據表的說明,與
*** Test Cases ***
同行的USERNAME、PASSWORD都會被忽略,起到了註釋作用。
上面的測試用例包含6個不同的測試用例,每個測試用例都包含非法的用戶名、密碼組合。下面是另一種寫法:
*** Test Cases ***
Invalid Password
[Template] Login with invalid credentials should fail
invalid ${VALID PASSWORD}
${VALID USER} invalid
invalid whatever
${EMPTY} ${VALID PASSWORD}
${VALID USER} ${EMPTY}
${EMPTY} ${EMPTY}
行爲驅動
測試用例可以寫得像需求文檔,這樣非技術人員也可以維護。這種可執行測試的需求,可以用在驗收測試驅動的開發中。
行爲驅動開發流行GIVEN-WHEN-THEN
的格式,在GIVEN
中進行系統初始化,在WHEN
中進行系統測試,在THEN
中進行系統狀態驗證。如果某個環節需要更多步驟,使用and
或but
關鍵字。例如:
*** Test Cases ***
Valid Login
Given login page is open
When valid username and password are inserted
and credentials are submitted
Then welcome page should be open
掌握測試用例的複雜語法後,會感覺下一篇87.Robot Framework創建任務非常簡單。