轉載地址:http://blog.csdn.net/whackw/article/details/48812291
1 測試文件語法
1.1 測試用例文件和目錄的組織層次結構
- 測試用例在測試用例文件中創建;
- 一個測試用例文件自動的創建一個包含文件中所有測試用例的測試集;
- 一個包含測試用例文件的目錄構成一個更高級的測試集,這個測試集(目錄)包含每一個測試用例文件形成的子測試集;
- 測試集目錄可以包含子測試集目錄,子測試集目錄又可以包含孫子測試集目錄,只有需要,可以嵌套多層;
- 測試集目錄可以有一個特殊的初始化文件(init.txt,類似於python)。
此外:測試庫包含最低級的關鍵字;資源文件包含變量和更高級的用戶自定義關鍵字;變量文件提供比資源文件更靈活的定義變量的形式。
1.2 支持文件格式
Robot Framework的測試數據被定義為表格形式,支持HTML\TSV\reST\Txt(從2.7.6開始,txt文件后綴名可以為.robot,方便與普通txt文件區分)。Robot Framework根據文件后綴判斷文件類型,進行解析。后綴名不區分大小寫。
因為txt文件可以很方便的用各種編輯器編輯,並且能很好的進行版本控制,所以它成為了使用最多的數據格式。
注:本文推薦使用txt文件,並且本文暫且只詳細講解txt文件的書寫規范。
最最基本的,txt文件中單元格的分隔符有兩種:兩個或多個空格;前后有空格的管道符。測試用例文件中可包含四個表格:Settings\Variables\Test Cases\Keywords,每個表格名稱前必須有至少一個星號。第一個表之前的任何東西都會被忽略,但最好不要在前邊瞎寫東西,別找麻煩。
推薦:用四個單元格作為分隔符,像python那樣;表頭格式:*** Settings ***;所有文件編碼都用UTF-8。
注:使用空格做分隔符時,所有有意義的空格都要通過反斜線或者${SPACE}全局變量轉義。
在一個txt文件中分隔符空格和管道可以混用,但在一行中只能用其中一種。用管道分隔的行,行首的管道符必須有,結尾的可有可無。管道符的兩側至少有一個空格(開頭和結尾的管道符除外)。
1.3 測試用例表格:
-
Setting table:導入測試庫、資源文件、變量文件,為測試集和測試用例定義元數據。有效的表名:Settings\Setting\Metadata。
-
Variable table:定義變量,此處變量可用在測試數據的其他地方。有效表名:Variables\Variable。
-
Test case table:創建測試用例。有效表名:Test Cases\Test Case。
-
Keyword table:用低級別關鍵字創建更高級關鍵字。有效表名:Keywords\Keyword\User Keyword\User Keywords。
1.4 解析測試數據的規則:
Robot Framework在解析數據的時候,以下數據將被忽略
- 第一個單元格不是以1.1.3中有效表名開頭的所有單元格。
- 表格第一行除了第一個單元格的所有東西。
- 第一個表前面的所有數據。如果數據格式允許表格之間存在數據,這些數據也被忽略。
- 所有空行。(在測試數據中適當加空行,可增加測試用例文件可讀性)
- 行末的所有非轉義空單元格。
- 所有單獨的反斜杠(\)。(輸入單反斜杠用\)
- #號后的所有字符。(井號用於注釋)
- 在用HTML\reST時,所有與格式定義相關的數據。
被Robot Framework忽略的數據不會顯示在測試結果報告中,大部分Robot Framework的第三方工具也會忽略這些數據。所以想使某些信息出現在結果報告中,要寫成documentation或者測試用例測試集的元數據,或者用內置關鍵字Log。
處理空格
Robot Framework處理空格的方式和HTML源碼中空格處理方式是一樣的:
- 換行符、回車和制表符被轉換成空格。
- 所有單元格開頭結尾的空格被忽略。
- 連續多個空格轉換為一個空格。
除此之外,非換行空格被普通空格替換。這樣避免了當一個非換行空格意外地被作為一個普通空格使用時難以調試的問題。如需換行符、回車、制表符、非換行空格時請使用轉義序列:\n,\r,\t,\xA0。
轉義
Robot Framework中轉義字符為反斜杠(\),另外內置變量${EMPTY}和${SPACE}也常被用來做轉義。
轉義特殊字符: \$, \@, \%, #, \=, |, \
兩/四/八位十六進制字符: \xhh, \uhhhh, \Uhhhhhhhh(從2.8.2版本開始)
注:
所有字符串都是Unicode字符串,如果需要byte strings,需用關鍵字Encode String To Bytes顯示轉換。
如果\x,\u,\U后跟無效的十六進制值,得到的結果是去掉反斜杠后的字符串。
跨平台的換行符可用內置變量${\n}實現。
緊跟\n后的未轉義空格將被忽略。
在txt文件中空單元格都要用\或${EMPTY}轉義,特別注意for循環從第二行開始每行第一個單元格都要用反斜杠轉義。
將測試數據拆分為多行
如果測試數據寫成一行太長,可以拆分為多行,使用省略號(...)。在測試用例和用戶關鍵字表格中,省略號前必須至少有一個空單元格。在設置和變量表中,省略號可直接放在表名下面。所有表格中,省略號前的所有單元格都將被忽略。
此外,一個單獨的值也可以寫成多行,在執行時Robot Framework會自動將多行合並成一行。從2.7開始,如果documentation和測試集元數據被分為多行,那它們的實際效果就是多行。
2 創建測試用例
2.1 基本語法
測試用例是在測試用例表格中用關鍵字組織起來的。理論上關鍵字可以使測試庫、資源文件或者在關鍵字表格中定義的關鍵字,但推薦使用資源文件或者關鍵字表格中定義的用戶關鍵字,不推薦使用測試庫提供的基本關鍵字(這句原文檔沒有,把測試庫提供的關鍵字組織成高級別的通俗易懂的關鍵字,這樣測試用例讀起來也容易)。
測試用例表格第一列是case name,后變的列可以是關鍵字或者變量。有返回值的關鍵字,如果想獲得返回值那就在關鍵字前面一個表格提供一個臨時變量名稱。
測試用例表格中可有以下幾種設置項:[Documentation] [Tags] [Setup] [Teardown] [Template] [Timeout]
看單詞就能猜出他們都是干什么的吧:
- 第一個Documentation是給測試用例加注釋的,但好的測試用例不需要只是,所以它基本沒用;
- 第二個Tags,加標簽的;
- 第三四個效果同python unittest中的setup、teardown,測試前后執行,用於准備恢復測試環境;
- 第五個Template,這個設置后跟某個需要傳參數的關鍵字,后邊值提供一組組參數就行,是為數據驅動;Timeout設置超時。
注:設置名稱用中括號括起來,總是在一行的第二個單元格,也就是第二列,后面幾列跟值。
設置表格中與測試用例相關的設置:
Force Tags,Default Tags,Test Setup,Test Teardown,Test Template,Test Timeout 這些設置會被測試用例中的相應設置覆蓋。特別要說的是,Test Setup和Test Teardown會在每條case開始結束都運行一遍!
2.2 使用參數
傳參數,關鍵字后跟兩個以上空格,然后要傳幾個參數就寫幾個單元格就行了。有些參數有默認值,可傳值也可不傳,方法和普通的一樣。實際上所有參數都可以有默認值,但帶默認值的參數后邊不能再有其他參數。另外Robot Framework支持可變數目的參數,在定義時可變數量的參數前帶星號,並且這種參數必須放最后。
另外還有一種參數叫命名參數,它和默認參數相似,只不過等號后可不帶默認值。
帶默認值的參數和命名參數傳值的時候可用=形式,比如有三個命名參數時,可以不管前兩個,直接給第三個參數賦值。另外命名參數是大小寫敏感的,並且等號兩邊不能隨便加空格。使用命名參數時,${}都不要了,直接寫里面的參數名=參數值,如${one}, 傳值時直接寫one=hello。
# TODO named arguments
Free keyword arguments,這種參數和可變數目參數對應,可變數目參數傳遞的是一個序列,而這種參數傳遞一個字典。在定義時前面帶兩個星號。從版本2.8.3開始,支持所有類型測試庫,但暫且不支持用戶關鍵字。
2.3 失敗
一個測試用例執行失敗,一般正常情況下后邊的關鍵字就不執行了,繼續執行下條case。當然即使失敗,teardown中的關鍵字也是會執行的。可以使用關鍵字或設置使測試用例失敗時繼續執行。
關於Error Messages,大部分關鍵字帶默認的messages,有些特別是帶should的關鍵字可以由用戶設置錯誤信息。從2.8開始錯誤信息可通過在信息前加HTML來增加HTML信息。
2.4 測試用例名稱和文檔
測試用例名稱盡可能清晰,通俗易懂,最好不要用到文檔。如果一個測試用例需要加文檔注釋,說明這個測試用例不夠好,里面的關鍵字還需改進。另外,一些原數據,如環境、用戶信息最后用標簽指定。
2.5 為測試用例添加標簽
使用標簽,通常有以下幾點好處:
- tag可以顯示在測試報告和日志中,在測試文件中,可為測試用例提供元數據。
- 用於測試用例的統計(可以給予tag自動收集測試用例總數、pass和fail的測試用例)。
- 在運行測試用例的時候可以指定某些帶特定tag的測試用例執行。
- 可用於指定測試用例的級別。
設置tag的方法:
- Force Tags:在Setting table中設置所有case的tags,可用戶測試集目錄初始化文件中。用次方法,在具體的測試用例中設置的tag就無效了。
- Default Tags:在Setting table中設置,可被testcase中的tag覆蓋。
- [Tags]:在Test Cases目錄中設置。
- --settag:命令行設置
另外可以通過關鍵字設置:Set Tags, Remove Tags, Fail and Pass Execution keywords
2.6 Setup和Teardown
用法:在設置表格中通過Test Setup和Test Teardown設置;在測試用例中通過[Setup]和[Teardown]設置。
Setup、Teardown后一般跟一個關鍵字,如果需要跟多個關鍵字有兩種方法:定義一個更高級的關鍵字;使用Run Keywords。注意在設置表格中定義的setup,teardown在每條case運行時都運行一次,如果不希望它們運行,可用case中的setup、teardown覆蓋設置表格中的。
2.7 測試模版
用法:在設置表格中通過Test Template設置;在測試用例中通過[Template]設置。測試用例中的模版會覆蓋設置表格中的模版。
如果一個測試用例中設置了測試模版,那這個測試用例就有關鍵字驅動變為了數據驅動。也就是說只提供關鍵字的參數就行不用寫關鍵字的名稱。關鍵字模版支持各種參數類型的關鍵字,包括內嵌式的。測試模版也可與for循環配合使用,循環體中的數據作為參數。
2.8 三種測試用例形式
- 關鍵字驅動:用於測試一個流程,Robot Framework中主要用到的。
- 數據驅動:通過測試模版設置一個關鍵字,通常為用戶定義的封裝了復雜過程的高級關鍵字,在測試的時候只需提供一組組數據就行。通常用於測試相同的流程不同的輸入輸出時用到。
- 行為驅動: # TODO
3 創建測試集
在本文1.1中說了,一個測試用例文件就是包含文件中所有測試用例的測試集,包含測試用例文件的目錄是更高級別的測試集,包含測試集目錄的目錄又是更高級別的測試集,如此目錄一層層嵌套,測試級別越來越高。
3.1 測試用例文件
測試用例文件是最低級別的測試集,里面至少包含一個表Test Cases(當然空文件也行,但那又有什么意義)。理論上,文件中的case個數可以是任意多個,但除了數據驅動外,強烈建議一個測試用例文件中的case最多不要超過10個。(數據驅動只需一個關鍵字,可提供任意多組參數)
3.2 測試集目錄
測試集目錄包含子測試集目錄或者測試用例文件,不能直接包含case(這句話有必要嗎,怎么直接包含?此題已解,不能再初始化文件中包含)。當一個測試目錄被執行的時候,用例文件和子目錄按如下方式遞歸處理:
- 以點(.)或下划線(_)開頭的文件或目錄將被忽略。
- 目錄名是CVS的將被忽略(大小寫敏感)。
- 文件擴展名不是html、xhtml、htm、tsv、txt、rst、rest、robot的被忽略(大小寫不敏感)。
- 其他所有文件目錄都將被Robot Framework解析。
注:如果一個文件中不包含case,此文件被忽略,程序跳過該文件繼續執行,同時一條信息寫入syslog。從2.5.5開始可是使用命令行參數--warnonskippedfiles,使該信息已一條warn級別log顯示在報告中。
初始化文件
它就和python中的init.py差不多,文件名必須是init.ext(有效的ext:html、xhtml、htm、tsv、txt、rst、rest、robot),主要作用是為測試集提供設置,該文件中不能包含測試用例。
初始化文件除了可以指定測試集相關設置外,還可以指定一些與test case相關的設置。導入或者創建的變量和關鍵字是不能再低級別測試集中使用的,如果需共享變量或關鍵字可以將他們定義在資源文件中。(# TODO)
初始化文件中支持的設置:
- Documentation,Metadata,Suite Setup,Suite Teardown這些設置用法和在資源文件和測試用例文件中的用法一樣。
- Force Tags:將該目錄及子目錄下所有測試用例文件中的case強行打上某標簽。在低級別測試集或case中設的標簽就不起作用了。
- Test Setup,Test Teardown, Test Timeout:用法和普通文件一樣,可被低級別的設置覆蓋。
- Default Tags,Test Template:暫不支持!
3.3 測試集名稱和文檔注釋
Robot Framework會根據文件和目錄名稱自己組織測試集名。規則如下:
- 文件名中擴展名被去掉。
- 下划線被替換成空格。
- 將全是小寫字母的單詞,轉換成首字母大寫。
注:為使測試用例按期望順序執行,文件和目錄名可包含一個前綴。前綴與有效文件名之間必須有兩個下划線,如001__test_one.txt,此文將名被轉換為測試集名時,前綴和下划線都被忽略。(例子中的測試集名為Test One)
測試用例名稱和文檔注釋,都可以通過命令行參數--name和--doc被替換。
3.4 測試集元數據
# TODO
3.5 測試集Setup和Teardown
上面有介紹,此處不再贅述。特別提醒的是:
- 如果setup失敗了,case直接被標為fail,不再運行case中任何關鍵字,直接運行teardown;
- 如果teardown失敗了,即使前面全pass,測試用例也會被標為fail;
- teardown中某一關鍵字失敗了,會繼續執行下一關鍵字,也就是說teardown中每個關鍵字都會被執行到,不會跳出。
- 給Setup和Teardown傳的keyword名可以是一個變量,這樣可以方便的通過命令行設置變量為不同的環境指定不同的setup和teardown。
4 使用測試庫
測試庫提供最最低級的關鍵字,這些關鍵字通常是和被測系統交互的。在實際測試中,通常將測試庫關鍵字組織長更高級別的用戶關鍵字,test case中直接使用用戶關鍵字。
4.1 導入測試庫
測試庫是大小寫敏感的,所以必須嚴格按照測試庫的原名導入。另外在導入測試庫的時候可以為其提供參數,如果需要,方法就和給關鍵字傳參數一樣。
導入測試庫有以下幾種方法:
- 在設置表格中使用Library導入。(只有在資源文件的Settings中導入的Library才能在其他導入該資源文件的文件中使用)
- 使用內置關鍵字Import Library。導入的測試庫只在當前測試集中有效,這種方法適用於動態生成的測試庫。
測試庫的搜索路徑和python包的搜索路徑一樣(如果用java就是java的搜索路徑)。可通過命令行參數--pythonpath指定搜索路徑。
另外在導入測試庫的時候還可以使用物理路徑的形式。如果測試庫是一個文件,導入的時候必須包含文件擴展名;如果是一個目錄,末尾必須有斜線(/)。對於python來說如果測試庫是一個python類,那么類名要和模塊名相同。這種機制不支持導入JAR和ZIP包。
4.2 為測試庫制定別名
方法:按4.1中方法導入測試庫,在后邊加入單元格WITH NAME(大小寫不敏感),然后再加一個單元格寫上別名就行。
如下情況,可考慮為測試庫定義別名:
- 需以不同的參數導入同一個測試庫多次。
- 測試庫名太長。
- 希望通過變量的形式在不同環境導入不同的測試庫,並想使用統一的名稱。
- 測試庫的原名起的太爛。(當然,這種情況更改測試庫的實際名稱是中更好的選擇)
4.3 標准庫
Robot Framework中提供的標准庫如下:
- BuiltIn
- Collections
- Dialogs
- OperatingSystem
- Process
- Screenshot
- String
- Telnet
- XML
BuiltIn庫不用手動導入,它是Robot Framework默認導入的,其他的庫如果要使用需按4.1中測試庫導入方法導入測試庫。
另外還有Remote library,支持分布式編程。(# TODO)
5 變量
5.1 簡介
變量是Robot Framework的一個組成特性,它可以用在測試數據的很多地方。一般他們用來給關鍵字傳參數,另外所有的Settings都允許變量作為它們的值。正常情況下,關鍵字名不能用變量指定,但可以使用內置關鍵字Run Keyword達到想要的效果。
Robot Framework本身有兩種變量:scalars和lists。它們的語法分別為:${SCALAR} and @{LIST}。除此之外,環境變量可直接使用語法:%{VARIABLE}。(大括號是必須的,大括號中可以是任意字符,但強烈推薦中用字母數字下划線和空格!) # TODO environment variables
以下幾種情況推薦使用變量:
- 當測試數據中某字符串經常變化時。使用變量,當字符串變化時只需改動一個地方。
- 當創建跨平台的測試數據的時候。(例如:變量${RESOURCES}替代c:\resources.txt)因為變量可以很方便的在測試開始的時候通過命令行定義,所以對於跨平台或者本地化測試來說着可以大大簡化測試流程開發。(使用命令行設置變量的方法:--variable RESOURCES:/tmp/resources.txt)
- 當關鍵字需要一個對象而不是字符串作為參數的時候。
- 想獲取關鍵字的返回值。
- 當某值過於長過於復雜的時候,可用變量替代。
5.2 變量類型
Robot Framework中變量和關鍵字一樣也是大小寫不敏感的,並且變量中的空格和下划線將被忽略。但是,建議全局變量全用大寫字母,相對局部變量全用小寫字母。Much more importantly, though, cases should be used consistently. (# TODO)
標量變量Scalar variables
標量變量就是帶$的變量,在測試數據中它們被其所代表的值代替。標量變量最常見的就是作為字符串使用,當然,你也可以將任何值賦給它,包括lists。(語法和shell、Perl相似?沒用過他倆)
當一單元格中只有一個標量變量時,該變量被它代表的值代替;當標量變量和其他值在一個單元格時,首先該變量的值被轉換為Unicode字符串(調用對象的unicode或str),然后和其它值拼接在一起。
# TODO note byte sequences
列表變量List variables
像python一樣,列表中可以包含字符串,子列表,字典,列表可以很長很長,也可以為空。當在測試數據中使用列表的時候,列表中的每個元素占用一個單元格,也就是說,如果一個列表中有兩個元素,那列表占用的那個單元格會被轉化成兩個單元格,一個單元格存一個元素。注意,包含列表變量的單元格不能再有其它數據。(語法是從Perl抄來的)
訪問列表變量中的單個元素和python中訪問列表元素是一樣的,@{name}[index],index是元素所在的索引,從0開始。
如果每個關鍵字需多個參數,或者設置表格中某設置需多個參數,可以把列表變量傳給它們。其他的,想setup、teardown之類的后面只跟一個關鍵字的,不能用列表變量。
列表變量可以當標量變量來使,只需將@換為$(注意如果有某標量變量和列表變量同名,那就沒轍了,該是誰就是誰吧。命名的時候注意!)。某些對列表操作的關鍵字只接受標量變量參數,如:Length should be; Append to list; Remove from list...
同時,標量變量也可當列表變量來用,但前提要求標量變量應該為列表類型(list-like)。用法是將$換成@。這種情況主要用於for循環中。
列表變量時可變的,也就是說如果想更改列表又不想破壞原來的列表,應該用Copy List關鍵字拷貝一個備份。
環境變量Environment variables
語法:%{EVN_VAR_NAME},指向的值必須是字符串類型
環境變量是在測試執行前設置在操作系統中的,在整個測試中的全局變量。OperatingSystem庫提供了設置和刪除環境變量的關鍵字:Set Environment Variable和Delete Environment Variable。在測試運行過程中,對某環境變量的更改時無效的。
5.3 創建變量
創建變量有以下幾種方法:
-
變量表格:Variable table是最常用的一種定義變量的形式,可以定義標量變量和列表變量,語法很簡單,變量名 + 值。在變量表格中定義的變量的值只能是字符串,如果想要其他形式的值可以用關鍵字或者變量文件生成變量。(如果不提供值,默認變量為空。另外可以在變量名后加=)
-
變量文件:就是一個python文件,里面定義各種變量對象。
-
從命令行定義變量:個別變量用--variable(-v);變量文件用--variablefile(-V)。從命令行定義的變量時全局變量,並且會覆蓋測試文件中的同名變量。如果同時用-v和-V傳了變量,-v的變量有最高優先級;如果用-v將統一變量傳了多次,后邊的優先級高;如果多個變量文件中定義個相同的變量,第一個變量文件的變量有最高優先級。
-
從關鍵字返回值:關鍵字的返回值可以賦給某個變量。這也是關鍵字之間傳遞數據的方法。賦值的時候變量在前,關鍵字在后,變量后面可加=。如果關鍵字返回一個list,也可以將值賦給幾個標量變量。用這種方法得到的變量是局部變量,只在當前作用域生效。
-
使用Set Test/Suite/Global Variable關鍵字:設置不同作用域的變量。
5.4 內置變量
# TODO
系統變量
數字變量:${80} ${3.14} ${-1e-4} # 80, 3.14, -0.0001
布爾類型和空變量
空格和空單元格變量
Robot Framework支持的變量
5.5 變量優先級和范圍
命令行參數和內置參數擁有最高優先升級,並且都是全局變量;變量表格中定義的變量只對當前文件有效,優先級大於資源文件和變量文件中的變量;測試執行過程中設置的變量優先級很高但作用域很小。(注意:從資源文件和變量文件中導入的變量不能用在變量表格中,因為Robot Framework執行的時候,是先處理變量表格的)
5.6 高級變量特性
# TODO