86.Robot Framework創建測試用例

轉載請註明原始鏈接: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 TagsDefault Tags:測試用例中配置項[Tags]的強制補充值和默認值。
  • Test SetupTest Teardown:測試用例中配置項[Setup][Teardown]的默認值。
  • Test Template:測試用例中默認使用的模板關鍵字。
  • Test Timeout:測試用例中配置項[Timeout]的默認值。

關鍵字的參數

關鍵字可以接收不同的參數,參數可以有默認值,這些都取決於關鍵字如何實現。關鍵字的文檔中通常包含其參數的使用說明。Libtooljavadoc工具可以自動生成文檔。

位置參數

位置參數在關鍵字文檔中通過逗號分割的參數名區分,例如first, second, third。位置參數本身叫什麼名字無所謂,重要的是參數的位置,但是參數名也最好能夠解釋位置參數的意義。使用關鍵字的時候,提供的參數個數要和關鍵字文檔中說明的參數個數一致。

下面的例子中,使用OperatingSystem庫中的Create DirectoryCopy File關鍵字,分別需要一個參數(path)和兩個參數(sourcedestination)。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 FilesJoin Paths,參數描述分別是*pathsbase, *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 TagsRemove TagsFailPass 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 SetupTest Teardown設置可以爲一個測試用例文件中的所有測試用例配置setup和teardown。測試用例表中每個測試用例自己的[Setup][Teardown]可以覆蓋Test SetupTest 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中進行系統狀態驗證。如果某個環節需要更多步驟,使用andbut關鍵字。例如:

*** 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創建任務非常簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章