2.2.1測試用例語法
基本語法
測試用例由關鍵字在測試用例表中構建。關鍵字可以從測試庫或資源文件導入,也可以在測試用例文件本身的關鍵字表中創建。
測試用例表中的第一列包含測試用例名稱。測試用例從包含此列的內容的行開始,並繼續到下一個測試用例名稱或表的末尾。
第二列通常具有關鍵字名稱。此規則的一個例外是從關鍵字返回的值設置變量,當第二列或后面的幾列包含變量名稱,且關鍵字名稱位於它們之后時。在任何一種情況下,關鍵字名稱后面的列都包含指定關鍵字的參數。
Test Case | Action | Argument | Argument |
---|---|---|---|
Valid Login | Open Login Page | ||
Input Name | 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]
指定測試設置和拆卸。也有同義詞 [Precondition]和[Postcondition]。
-
[Template]
指定要使用的模板關鍵字。測試本身將僅包含用作該關鍵字的參數的數據。
-
[Timeout]
用於設置測試用例超時。超時在后續章節討論。
Test Case | Action | Argument | Argument |
---|---|---|---|
Test With Settings | [Documentation] | Another dummy test | |
[Tags] | dummy | owner-johndoe | |
Log | Hello, world! |
設置表中的測試用例相關設置
設置表具有以下與測試用例相關的設置。這些設置主要是前面列出的測試用例特定設置的默認值。
-
Force Tags, Default Tags
標簽的強制值和默認值。
-
Test Setup, Test Teardown
測試設置和拆卸的默認值。同時也有同義詞 Test Precondition和Test Postcondition。
-
Test Template
要使用的默認模板關鍵字。
-
Test Timeout
測試用例超時的默認值。超時在后續章節討論。
2.2.2使用參數
前面的示例已經演示了使用不同參數的關鍵字,本節將更全面地討論這一重要功能。如何實際實現具有不同參數的用戶關鍵字和庫關鍵字將在單獨的部分中討論。
關鍵字可以接受零個或多個參數,而某些參數可能具有默認值。關鍵字接受的參數取決於其實現,通常搜索此信息的最佳位置是關鍵字的文檔。在本節的示例中,預計文檔將使用libdoc工具生成 ,但是有關通用文檔工具(如javadoc)生成的文檔的相同信息 。
必需的參數
大多數關鍵字都必須始終給出一定數量的參數。在關鍵字文檔中,這通過指定以逗號(如第一,第二,第三)分隔的參數名稱來表示。在這種情況下,參數名稱實際上並不重要,除了它們應該解釋參數的作用,但重要的是具有與文檔中指定的完全相同數量的參數。使用太少或太多的參數將導致錯誤。
下面的測試使用的屬於OperatingSystem庫的關鍵字Create Directory
和Copy File
。它們的參數被指定為 path
和(source
,destination
),這意味着它們分別采用一個和兩個參數。最后一個關鍵字,來自BuiltIn的No Operation
, 不帶任何參數。
Test Case | Action | Argument | Argument |
---|---|---|---|
Example | Create Directory | ${TEMPDIR}/stuff | |
Copy File | ${CURDIR}/file.txt | ${TEMPDIR}/stuff | |
No Operation |
默認值
參數通常具有默認值,可以給出或不給出。在文檔中,默認值通常與參數名稱分隔,其名稱與name = default value相同。所有參數都可能具有默認值,但在具有默認值的參數之后不能存在任何位置參數。
下面的示例說明了使用默認值,該示例使用 具有參數path,content =,encoding = UTF-8
的Create File
關鍵字。試圖在沒有任何參數或超過三個參數的情況下使用它是行不通的。
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Example | Create File | ${TEMPDIR}/empty.txt | ||
Create File | ${TEMPDIR}/utf-8.txt | Hello world | ||
Create File | ${TEMPDIR}/iso-8859-1.txt | Hello world | ISO-8859-1 |
可變數量的參數
也可以創建接受任意數量參數的關鍵字。這些參數可以與必填參數和帶有默認值的參數組合,但所謂的varargs只能放在參數列表的最后一個。在文檔中,它們通常在參數名稱之前有一個星號,如* varargs。
以下示例中使用的Remove Files
和Join Paths
關鍵字分別包含參數*paths
和base,*parts
。前者可以與任意數量的參數一起使用,但后者至少需要一個參數。
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Example | Remove Files | ${TEMPDIR}/f1.txt | ${TEMPDIR}/f2.txt | ${TEMPDIR}/f3.txt |
@{paths} = | Join Paths | ${TEMPDIR} | f1.txt | |
... | f2.txt | f3.txt | f4.txt |
命名參數
當關鍵字接受具有默認值的多個參數時,不能使用位置參數僅覆蓋最后一個參數。例如,如果在下面的測試中使用具有參數arg1 = a,arg2 = b,arg3 = c
的關鍵字,則其參數 arg1和arg2都將空字符串作為值而不是其默認值。
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Positional Arguments | [Documentation] | 1st and 2nd | argument get | empty strings |
Example Keyword | value |
為了只給出一些期望默認值更容易的參數,在Robot Framework 2.5中添加了新的命名參數語法。使用此語法,需要覆蓋其默認值的參數將在格式為argname = value的必填參數之后立即給出。可以簡單地省略使用默認值的參數。以下示例測試說明了這在實踐中如何工作,該測試使用與上述示例相同的關鍵字。在此示例中,未指定的參數將獲取其默認值。
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Named Arguments | [Documentation] | Not specified | arguments get | default values |
Example Keyword | arg3=value | |||
Example Keyword | arg2=xxx | arg3=yyy |
當沒有參數遺留時,命名參數語法自然可以與接受默認值的參數一起使用。這可以使參數含義比僅顯示值時更清晰。但是,以這種方式命名必填參數是不可能的。此外,不能先給出第一個命名參數,然后是varargs。
命名參數功能的最大限制是它目前僅適用於用戶關鍵字和使用Python實現的庫關鍵字,它們使用靜態庫API或混合庫API。
注意
當命名參數語法與用戶關鍵字一起使用時,參數名稱不帶
${}
裝飾。例如,帶參數${arg1} = default,${arg2} = second
的用戶關鍵字, 必須這樣使用:arg2 = override
。
僅當等號前面的參數部分與具有默認值的參數名稱匹配時,才使用命名參數語法。此匹配從給定參數列表的末尾開始,並在沒有匹配時停止。在偶然匹配的極少數情況下,可以使用\ 來轉義此語法,如nomatch\=here
。
注意
命名參數語法既是大小寫也是空格敏感的。前者意味着如果你有一個參數 arg,你必須這樣使用:
arg=<value>
,並且Arg=<value>
或ARG=<value>
不起作用。后者意味着在=
號之前不允許使用空格 ,並且在它之后的空格被視為默認值本身的一部分。
以下示例演示了在不同方案中使用命名參數,包括在測試庫導入中。
Setting | Value | Value | Value |
---|---|---|---|
Library | Telnet | prompt=$ |
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Example | Open connection | 10.0.0.42 | port=${25} | |
List files | options=-lh | |||
List files | path=/tmp | options=-l |
Keyword | Action | Argument | Argument | Argument |
---|---|---|---|---|
List files | [Arguments] | ${path}=. | ${options}= | |
Execute command | ls ${options} ${path} |
2.2.3測試用例名稱和文檔
測試用例名稱直接來自Test Case表:它正是輸入測試用例列的內容。一個測試套件中的測試用例應具有唯一的名稱。與此相關,您還可以使用測試中的自動化變量 ${TEST_NAME}
來引用測試名稱。無論何時執行測試,它都可用,包括所有用戶關鍵字,以及測試設置和測試拆解。
[Documentation]可以為測試用例設置文檔。該文本顯示在命令行輸出中,以及生成的測試日志和測試報告。
如果文檔很長,它可以拆分成幾個 與空格一起連接的單元格。可以使用簡單的 HTML格式,並且可以使用變量使文檔動態化。從Robot Framework 2.7開始,如果文檔分為多行,則使用換行符連接多行 。如果行已經以換行符結尾或者以轉義的反斜杠結束,則不會添加換行符。
Test Case | Action | Argument | Argument |
---|---|---|---|
Simple | [Documentation] | Simple documentation | |
No Operation | |||
Splitting | [Documentation] | This documentation is a bit longer and | it has been split into several columns. |
No Operation | |||
Many lines | [Documentation] | Here we have | |
... | an automatic newline | ||
No Operation | |||
Formatting | [Documentation] | *This is bold*, _this italic_ and |
here is a link: http://robotframework.org |
No Operation | |||
Variables | [Documentation] | Executed at ${HOST} by ${USER} |
|
No Operation |
測試用例具有清晰且具有描述性的名稱非常重要,在這種情況下,它們通常不需要任何文檔。如果測試用例的邏輯需要記錄,那么通常表明測試用例中的關鍵字需要更好的名稱並且要加強它們,而不是添加額外的文檔。最后,通常使用標簽更好地指定元數據,例如上面最后一個示例中的環境和用戶信息。
2.2.4標記測試用例
在Robot Framework中使用標簽是一種簡單但功能強大的機制,用於對測試用例進行分類。標簽是自由文本,它們至少可用於以下目的:
- 標簽顯示在測試報告,日志中,當然還包括測試數據中,因此它們為測試用例提供元數據。
- 測試用例的統計信息(總計,通過,失敗是根據標簽自動收集的)。
- 使用標記,您可以包含或排除要執行的測試用例。
- 使用標記,您可以指定哪些測試用例被認為是關鍵的。
在本節中,僅解釋了如何為測試用例設置標記,下面列出了不同的方法。這些方法當然可以一起使用。
-
在設置表中強制標記
Force Tags
具有此設置的測試用例文件中的所有測試用例始終都會獲得指定的標記。如果在測試套件初始化文件中使用它,則子測試套件中的所有測試用例都會獲得這些標記。
-
設置表中的默認標簽
Default Tags
沒有自己[Tags]設置的測試用例會獲得這些標記。從Robot Framework版本2.5開始,測試套件初始化文件中不再支持默認標記。
-
測試用例表中的
[Tags]
測試用例總是獲得這些標簽。此外,它不會獲取使用默認標記指定的可能標記,因此可以使用空值覆蓋默認標記。從Robot Framework 2.5.6開始,也可以使用值NONE 來覆蓋默認標記。
-
--settag
命令行選項除了他們在別處獲得的標簽之外,所有執行的測試用例都使用此選項設置標簽。
-
設置標簽
Set Tags
和刪除標簽Remove Tags keywords
關鍵字這些BuiltIn關鍵字可用於在測試執行期間修改標記。
標簽是自由文本,但它們已標准化,框架會將它們轉換為小寫並刪除所有空格。如果測試用例多次獲得相同的標簽,則刪除除第一個之外的其他地方的標簽。可以使用變量創建標記,當然這些變量必須已經存在。
Setting | Value | Value | Value |
---|---|---|---|
Force Tags | req-42 | ||
Default Tags | owner-john | smoke |
Variable | Value | Value | Value |
---|---|---|---|
${HOST} | 10.0.1.42 |
Test Case | Action | Argument | Argument |
---|---|---|---|
No own tags | [Documentation] | This test has tags | owner-john, smoke, req-42 |
No Operation | |||
With own tags | [Documentation] | This test has tags | not_ready, owner-mrx, req-42 |
[Tags] | owner-mrx | not_ready | |
No Operation | |||
Own tags with variables | [Documentation] | This test has tags | host-10.0.1.42, req-42 |
[Tags] | host-${HOST} | ||
No Operation | |||
Empty own tags | [Documentation] | This test has tags | req-42 |
[Tags] | |||
No Operation | |||
Set Tags and Remove Tags Keywords | [Documentation] | This test has tags | mytag, owner-john |
Set Tags | mytag | ||
Remove Tags | smoke | req-* |
2.2.5 setup和teardown
Robot Framework具有與許多其他測試自動化框架類似的測試設置
和測試拆卸
功能。簡而言之,測試設置是在測試用例之前執行的,並且在測試用例之后執行測試拆卸。在Robot Framework中,設置和拆卸只是可能帶有參數的普通關鍵字。
設置和拆卸只能是一個關鍵字。如果他們需要處理多個單獨的任務,則可以為此目的創建更高級別的用戶關鍵字。另一種解決方案是使用Robot Framework 2.5中添加的BuiltIn關鍵字 Run Keywords
來執行多個關鍵字。
測試拆卸在兩個方面是特殊的。首先,它也在測試用例失敗時執行,因此它可以用於不管測試用例狀態的情況下進行的清理活動。從Robot Framework 2.5開始,即使其中一個關鍵字失敗,也會執行拆卸中的所有關鍵字。
在測試用例文件中為測試用例指定設置或拆卸的最簡單方法是使用“設置”表中的“ 測試設置”和“ 測試拆卸”設置。個別測試用例也可以有自己的設置或拆卸。它們使用測試用例表中的[Setup]
或[Teardown]
設置進行定義, 並且會覆蓋設置表的Test Setup和 Test Teardown設置。在[Setup]
或[Teardown]
設置后沒有關鍵字 意味着沒有設置或拆卸。從Robot Framework 2.5.6開始,也可以使用值NONE來指示測試沒有設置/拆卸。
Setting | Value | Value | Value |
---|---|---|---|
Test Setup | Open Application | App A | |
Test Teardown | Close Application |
Test Case | Action | Argument | Argument |
---|---|---|---|
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] | Using special NONE, | works with 2.5.6 |
Do Something | |||
[Teardown] | NONE | ||
Using variables | [Documentation] | Setup and teardown | given as variables |
[Setup] | ${SETUP} |
||
Do Something | |||
[Teardown] | ${TEARDOWN} |
通常在創建類似用例的測試用例時,術語前置條件 和后置條件優於術語設置和拆卸。Robot Framework也支持這個術語,因此前提條件是設置的同義詞,后置條件是拆卸的同義詞。
Test Setup | Test Precondition |
---|---|
Test Teardown | Test Postcondition |
[Setup] | [Precondition] |
[Teardown] | [Postcondition] |
作為設置或拆卸執行的關鍵字的名稱可以是變量。通過從命令行提供關鍵字名稱作為變量,這有助於在不同環境中進行不同的設置或拆卸。
注意
測試套件可以自行設置和拆卸。套件設置在該測試套件中的任何測試用例或子測試套件之前執行,同樣在它們之后執行套件拆卸。
2.2.6測試模板
測試模板將正常的關鍵字驅動的測試用例轉換為 數據驅動的測試。正常測試用例的主體是由關鍵字及其可能的參數構成的,而帶有模板的測試用例僅定義了template關鍵字的參數。以下示例測試用例在功能上完全相同。
Test Case | Action | Argument | Argument |
---|---|---|---|
Normal test case | Example keyword | first argument | second argument |
Templated test case | [Template] | Example keyword | |
first argument | second argument |
如上例所示,可以使用[Template]
為單個測試用例指定模板。另一種方法是使用 Setting表中的Test Template
設置,在這種情況下,該模板將應用於該測試用例文件中的所有測試用例。[Template]
會覆蓋設置表中的Test Template
設置,當[Template]
設置為一個空值,表示該用用例沒有模板,即使設置表中設置了。從Robot Framework 2.5.6開始,也可以使用值NONE來指示測試沒有模板。
如果模板化測試用例的主體中有多個數據行,如下例所示,則模板將應用於所有行。這意味着多次執行相同的關鍵字,每次執行一次數據。模板化測試也很特殊,因此即使出現故障也會執行所有輪次。在正常測試中也可以使用這種continue-on-failure模式,但是通過模板化測試,模式會自動啟動。
Test Case | Action | Argument | Argument |
---|---|---|---|
Templated test case | [Template] | Example keyword | |
first round 1 | first round 2 | ||
second round 1 | second round 2 | ||
third round 1 | third round 2 |
如果模板與for循環一起使用,則模板將應用於循環內的所有步驟。在這種情況下,continue-on-failure模式也在使用,這意味着即使存在故障,所有步驟也將使用所有循環元素執行。
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Template and for | [Template] | Example keyword | ||
:FOR | ${item} | IN | @{ITEMS} | |
${item} | 2nd arg | |||
:FOR | ${index} | IN RANGE | 42 | |
1st arg | ${index} |
測試模板的主要用途是減少數據驅動測試的重復。不是在文件中對所有測試重復相同的關鍵字,而是可以在設置表中僅使用它一次。下一節將更詳細地說明此用法。
注意
測試模板是Robot Framework 2.5中的一項新功能。
注意
目前不能使用變量指定模板關鍵字。在將來的版本中可能會取消此限制。
2.2.7不同的測試用例風格
可以通過幾種不同的方式編寫測試用例。描述某種工作流程的測試用例可以用關鍵字驅動
或行為驅動
的方式編寫。數據驅動
的樣式可用於使用不同的輸入數據測試相同的工作流程。
關鍵字驅動的風格
工作流測試(例如前面描述的有效登錄測試) 是根據幾個關鍵字及其可能的參數構建的。它們的正常結構是首先將系統置於初始狀態(有效登錄示例中的打開登錄頁面),然后對系統執行某些操作(輸入名稱,輸入密碼,提交憑證),最后驗證系統按預期運行(歡迎頁面應該打開)。
數據驅動的風格
編寫測試用例的另一種方式是數據驅動方法,其中測試用例僅使用一個更高級別的關鍵字,通常創建為 用戶關鍵字,隱藏實際的測試工作流程。當需要使用不同的輸入和/或輸出數據測試相同的場景時,這些測試非常有用。每次測試都可以重復相同的關鍵字,但測試模板功能允許指定關鍵字只使用一次。
Setting | Value | Value | Value |
---|---|---|---|
Test Template | Login with invalid credentials should fail |
Test Case | User Name | Password | |
---|---|---|---|
Invalid User Name | invalid | ${VALID PASSWORD} | |
Invalid Password | ${VALID USER} | invalid | |
Invalid User Name And Password | invalid | whatever | |
Empty User Name | ${EMPTY} | ${VALID PASSWORD} | |
Empty Password | ${VALID USER} | ${EMPTY} | |
Empty User Name And Password | ${EMPTY} | ${EMPTY} |
上面的示例有六個單獨的測試,每一個都是無效的用戶/密碼組合,下面的示例說明了如何只對一個測試進行所有組合。使用測試模板時,即使出現故障,也會執行測試中的所有輪次,因此這兩種樣式之間沒有真正的功能差異。在上面的示例中,單獨的組合被命名為更容易看到他們測試的內容,但是大量的這些測試可能會弄亂統計數據。使用哪種風格取決於具體場景和個人偏好。
Test Case | User Name | Password | |
---|---|---|---|
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} |
提示
在上述兩個示例中,列標題已更改為與數據匹配。這是可能的,因為在第一行中忽略除第一個之外的其他單元。
行為驅動的風格
也可以將測試用例編寫為非技術項目利益相關者必須理解的要求。這些可執行要求通常稱為驗收測試驅動開發 (ATDD)的基石。
編寫這些需求/測試的一種方法是由行為驅動開發(BDD)推廣的Given-When-Then風格。在以這種方式編寫測試用例時,初始狀態通常用一個以單詞Given開頭的關鍵字表示,操作用以When開頭的關鍵字,並用以Then開頭的關鍵字來描述期望 。如果某個步驟有多個操作,則可以使用以And開頭的關鍵字。
Test Case | Step |
---|---|
Valid Login | Given login page is open |
When valid username and password are inserted | |
and credentials are submitted | |
Then welcome page should be open |
忽略Given/When/Then/AND前綴
如果找不到與全名匹配的關鍵字,則在搜索匹配關鍵字時刪除Given,When,Then和And前綴。這適用於用戶關鍵字和庫關鍵字。例如,在以上示例中打開給定登錄頁面可以實現為具有或不具有單詞Given的用戶關鍵字。忽略前綴還允許使用具有不同前綴的相同關鍵字。例如 Welcome page should be open
也可以用作And welcome page should be open
。
將數據嵌入關鍵字
在編寫具體示例時,能夠將實際數據傳遞給關鍵字實現是很有用的。用戶關鍵字通過允許將參數嵌入關鍵字名稱來支持此功能。