2小時入門Robot Framework
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、介紹
1.1、介紹Robot
Robot Framework是一個基於關鍵字驅動的自動化測試框架。通過該框架,測試人員可使用python
1.2、安裝
1.2.1、Robot Framework
Robot Framework支援Python和Jython,本文件針對ubuntu下Python進行講解
下載地址:https://pypi.python.org/pypi/robotframework,下載最新版本安裝包如果是windows可直接下載exe安裝包,ubuntu可使用tar.gz包進行原始碼安裝,當然windows也支援原始碼安裝
下載完後解壓tar包並進入資料夾內執行sudo pythonsetup.py install便可完成安裝。安裝完成後可在終端執行pybot--version
1.2.2、Robot Framework IDE(RIDE)
RIDE是Robot的第三方測試用例編輯器,可編輯用例,編輯關鍵字等並生成HTML,TXT等格式的檔案。同時RIDE可直接可進行測試執行。RIDE是基於wxPython進行開發,所以安裝RIDE前需要先行安裝wxPython,其官方網站為:http://www.wxpython.org/
windwos下可位元組下載exe包進行安裝
ubuntu下通過終端命令列方式進行安裝,方法如下:
1,curl http://apt.wxwidgets.org/key.asc | sudo apt-key
add –
2,修改/etc/apt/sources.list檔案,追加如下內容
deb http://apt.wxwidgets.org/ gutsy-wx main
deb-src http://apt.wxwidgets.org/ gutsy-wx main
3,sudo apt-get update
4,sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
5,sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev libgtk2.0-dev
完成wxPython安裝後可進行RIDE安裝
1.2.3、官方快速入門和example
下載入門手冊:robotframework-quickstart-20090113.zip並解壓,進入資料夾後可看見一個quickstart.html,開啟該檔案可看到官方的快速入門的文件。同時在終端中進入到該資料夾執行命令pybot quickstart.html便可看到robot執行了一系列測試。這種幫助文件就是example本身的例子並不多見,其原理就是robot可識別html頁面中的表格,只要表格的內容和robot執行用例的語法,便可成功執行用例。執行完畢後可看見當前資料夾下生成了report檔案,可檢視這份報告
2、簡單使用Robot Framework
2.1、Hello World
在/home下建立demo用的資料夾例如名為robot_test。在終端中使用命令ride.py開啟RIDE編輯器。點選RIDE選單欄File->Open Directory選中robot_test資料夾,然後確定。
在robot_test目錄下新建一個RobotTest.py然後再檔案內編寫python程式碼,如下
import os
import sys
class RobotTest:
def first_keyword(self):
fp = open("/tmp/robot_fk", "a")
fp.write("this is the first keyword\r\n")
fp.close()
這樣一個TestLib檔案就建立完成了,之後在RIDE中建立測試用例:
在RIDE的最上側選單欄選擇File->New Project後如下
在右側編輯框拉開Setting選項如下
點選Documentation的大文字編輯框,輸入一下文字,可輸入中文然後儲存,便在可在robot_test目錄下生成一個robot_test.html的檔案可開啟檢視樣式
首先需要載入剛編輯的RobotTest.py這個庫,方法為,點選左側Robot_Test,在右側找到Library按鈕點選,並點選瀏覽找到RobotTest.py檔案
然後新增用例
在RIDE中右鍵點選Robot_Test選擇New Test Case,輸入用例名,比如first case
後點擊first case便可看到用例編輯框,在下面的表格中加入第一個關鍵字first keyword如下
這樣一條簡單的用例就完成了
用例執行:
點選RIDE最上測得按鈕如圖
便可看到RIDE開始執行測試用例,執行完畢後如下圖
之後進入/tmp目錄下看到一個robot_fk檔案,可開啟看到一串字元this isthe first keyword,這意味著我們的測試成功了。
2.2、Robot工作原理簡述
Robot的測試用例和配置使用HTML,TXT等格式檔案進行編輯,html是比較常用的一種格式,通過html繪製的表格形式來編輯用例可閱讀性較高。
Robot通過識別html表格中的表頭來確定該表格的配置是做合使用,例如Settings用來配置資源庫,Test Cases用來編輯測試用例,Variables用來配置預設的變數等等。
每個robot工程開始工作時會通過Settings載入相關的資源,通常為TestLib,或者匯入其他的配置檔案等等,然後找到所有的Test Cases表格並順序執行每個case。每個測試用例的每個步驟通常都是有一個關鍵字來執行操作該步驟。Robot會去Settings中指定的library中尋找該關鍵字,如果找到則執行該關鍵字所對應的程式碼,如果在Lib程式碼中無法找到該關鍵字,則尋找html的表中表頭為Keywords的表格,如果也無法找到則會報錯。執行測試用例時每個步驟都執行完且沒有報錯,則認為該條用例為pass。
3、Robot Framework詳解
3.1、Robot的格式
官方文件所描述的配置如下圖
而是用RIDE編輯所生成的html檔案格式如下:
如果使用其他html編輯器來編輯robot相關配置,建議編輯成官方說明中的標準樣式。
3.2、TestLib
TestLib是robot框架關鍵字部分的核心,它的作用就是用來封裝底層關鍵字。Robot自帶了一部分非常常用的TestLib如XML,String等,也有別人開發的第三方的TestLib比如web頁面測試相關,Database相關,在robot中只需要正確匯入這些庫,那麼就可以使用這些lib中封裝的關鍵字。而在自動化測試開發中,最重要的過程就是開發出優秀的TestLib,封裝出複用性強,清晰明瞭的關鍵字。
TestLib編寫規則:
1,TestLib是一個python檔案,裡面寫的python程式碼,所以TestLib通常是.py結尾的。
2,TestLib只且只有一個class,並且該class的名字和TestLib檔名相同。如2.1介紹的RobotTest.py中定義的class的名字也是RobotTest
3,class中所定義的函式便是robot中的底層關鍵字,所以一些私有函式,不打算作為關鍵字對外開放的建議將函式名以“__”開頭
4,class中函式名定義通常為defabc_def_ghi(self, xxx):這樣的格式,單詞之間使用下劃線分隔,這樣的定義的函式名在編輯測試用例時可直接使用關鍵字abc def ghi或者Abc Def Ghi也是允許的。所以class中定義函式的時候建議只使用小寫字母和下劃線的方式,這也符合python的程式設計規範。
5,其他規範符合python的規範,比如使用os,sys等系統函式該import的就還是要import
符合上述條件的TestLib就可以被robot使用。讀者可以自行建立一個TestLib並實現一兩個關鍵字並在RIDE中匯入,匯入方法參考2.1的例子,匯入後如果RIDE中該庫顏色顯示是紅色的,說明很有可能該TestLib有點問題,最直接的問題就是class名和檔名不同導致找不到該Lib,或者頭部import某庫就出錯了。
3.3、Robot的主配置(html)
凡是使用RIDE編輯的html無需太關心格式問題,所以具體跟表格格式相關的問題不再贅述,現介紹一些常用的配置,這些配置通常在RIDE中都能找到,只需要填寫內容即可。以下描述還是以2.1節中的example為例
3.3.1、Setting
點選RIDE中的Robot Test看到右側的Settings開啟可看到較多配置
3.3.1.1、Documentation
描述文件,通常用來描述該html的作用,類似幫助文件或者說明
3.3.1.2、Suite Setup
每個Test Suite啟動時執行的動作,用法同測試用例中的關鍵字
3.3.1.3、Suite Teardown
每個Test Suite結束的時候執行的動作,用法同測試用例中的關鍵字。
3.3.1.4、Test Setup
每個Test Case啟動時執行的動作,用法同測試用例中的關鍵字。如果在某個具體的Test case中指定了Setup則執行case裡的setup而不執行setting裡的Test Setup
3.3.1.5、Test Teardown
每個Test Case結束的時候執行的動作,用法同測試用例中的關鍵字。同樣case裡的Teardown會將setting裡Test Teardown覆寫。
3.3.1.6、Test Timeout
用例超時時間,超過該時間還未執行完畢的用例將被強制退出。單位為秒,也可以寫成如下形式,用RIDE輸入的時間自動會轉成如下形式
3.3.1.7、Tags
Tags作為用例的標記,在robot中是非常常用的。在setting中可配置Force Tags和Default Tags,也可在用例中配置Tag,Tag的作用在後面描述
3.3.1.8、Library
指定TestLib,系統自帶的或者已經安裝的TestLib可直接輸入名字,自己編寫的TestLib就需要加入路徑,相對路徑絕對路徑均可,相對的是該html檔案的路徑
3.3.1.9、Resource
引入一個資原始檔。通常一份比較好的robot用例中包含就是跟該用例相關的關鍵字,用例和一些基本配置等等,如果需要用到很多公共的模組,公共的關鍵字,這些公共資源通常會編輯成一個獨立的html,這樣業務相關的html便可引用
3.3.2 、Testcases
本節開始描述如何編寫測試用例。
3.3.2.1、編寫方法
上圖是官方的幫助文件中描述的Test Case表格的樣式。第一列為用例名,第二例開始往後便是用例的動作。如果該用例不止一個動作那麼步驟2的動作要寫到步驟1動作的下方,即步驟2的第一列要空出,如下例子
Case One | Keyword A | arg1 | arg2 |
Keyword B | arg1 | arg2 | arg3 |
Case Two | Keyword C | ||
Keyword D | arg1 | arg2 |
兩個case均有2個步驟,而robot識別case就通過如果第一列為非空則認為該行是一個新的case。
上例的表格缺少表格頭,官方的樣式表頭是第一列是Test Case,第二列是Action,第三列以後的是Argument,事實上不一定所有的case的第二例都是Action,有可能的是返回值,有些keyword可能還會返回2個返回值甚至更多,那麼在Action之前可能還要佔用更多格的空間。RIDE編輯生成的用例表表頭只有Test Cases。所以一般的用例的形式通常為:
用例名 | 返回值 = | 關鍵字 | 引數1 | 引數2 |
3.3.3.2、變數
在編寫測試指令碼時,每個步驟之間並不是獨立的。往往需要前一步驟的輸出傳入給後一步驟的輸入。在程式碼中可以使用變數來傳遞這些值,但是如果在表格中編寫測試用例,想要傳遞引數並不是那麼容易的事。Robot提供了這樣的變數機制,能夠在編寫用例輕鬆傳遞引數。
變數的定義方式為${變數名},通過該方式可定義變數,並給變數賦值,和作為引數傳入。舉個例子,定義個測試用例名為var case,並且有兩個關鍵字第一個為get var,有1個返回值,沒有輸入引數,功能獲取var的值。另一個關鍵字為set var,有1個輸入引數,沒有返回值,功能設定var值。Var case的步驟先呼叫get var獲取var然後呼叫set var並傳入該值。如下:
var case | ${test_var}= | get var |
set var | ${test_var} |
上述用例中定義了${test_var}這個變數用來取值和賦值。如果作為返回值需要複製,就寫在關鍵字操作前並加入=,如果作為引數傳值寫在關鍵字操作後,引數需要注意順序。
學會使用變數,並知道關鍵字如何使用,基本就可以編寫測試用例了,下面介紹Test case中一些常用的配置。在case中的配置需要使用”[ ]”進行標示
3.3.2.3、Documentition
和setting中的一樣,用來做一些註釋,描述等等,在robot執行時會把這些內容打印出來
3.3.2.4、Setup
當case啟動時首先會執行的操作,如果這裡定義的Setup則setting中的Test Setup將失效。
3.3.2.5、Teardown
當case結束最後會執行的操作,如果在這裡定義了Teardown則setting中的Test Teardown將失效
3.3.2.6、Timeout
用例超時時間。
3.3.2.7、Tags
和setting中tags一致,用於給用例做標記。
3.3.3、Keyword
Robot作為關鍵字驅動的測試框架,Keyword是其用例層最核心的內容。TestLib中定義的函式,可作為Keyword在用例編輯時使用。同時使用者可自定義Keyword,而使用者自定義的Keyword通常是底層TestLib中的Keyword的組合和封裝。TestLib中的keyword的功能是最為簡單單一的。如果測試用例全部使用Testlib中的keyword那極有可能一個用例包含十幾個步驟甚至更多。這樣的用例邏輯性和可讀性是很差的。閱讀用例的人可能只關心某一步驟做什麼,並不關心是怎麼做的,比如資料處理完的下一步驟是驗證結果。驗證結果可能需要處理資料庫,寫檔案,解析資料結構等等。這些事應該上層寫用例的人可能不關心,或者也不想關心。良好的Keyword封裝能夠讓用例編寫更輕鬆,用例質量也越高
3.3.3.1、Keyword編寫方法
官方定義的Keyword表格樣式如下
和Test case定義方式是一樣的。在RIDE中可以如下建立一個Keyword。右鍵點選Robot Test選擇New User Keyword,並取名為my keyword。
這裡使用2.1中的例子,在my keyword中呼叫兩次first keyword
儲存後的html樣式為
然後編輯first case,讓它的測試步驟為呼叫一次my keyword
編輯完成執行first case用例,然後檢視/tmp/下的robot_fk檔案,每執行一次就會增加兩行”this is the first keyword”。
需要注意的是,使用者定義的Keyword不能和Testlib中的Keyword重複。由於robot在執行用例時首先回去TestLib中搜索Keyword,如果使用者定義了和TestLib中重複的Keyword,那該Keyword將無法被執行到。
3.3.3.2、Keyword的輸入和輸出
如果把一個Keyword當成一個函式,那除了函式處理流程,使用者最關心的便是輸入和輸出。輸入便是引數,輸出便是Keyword的返回值。下面通過一個例子來說明關鍵字的輸入和輸出。首先在2.1中使用的RobotTest.py中增加兩個方法,第一個方法名為plus,輸入引數2個,功能是返回兩個引數的和。另一個方法名為multi,輸入引數為3個,功能是返回3個引數的乘積。定義個關鍵字名字為alg keyword,有3個輸入引數,1個返回值,其功能是三個引數兩兩求和,將3個和求乘積並返回。在RobotTest.py新增如下程式碼
import os
import sys
class RobotTest:
def first_keyword(self):
fp = open("/tmp/robot_fk", "a")
fp.write("this is the first keyword\r\n")
fp.close()
def plus(self, arg_a, arg_b):
return int(arg_a) + int(arg_b)
def multi(self, arg_a, arg_b, arg_c):
return int(arg_a) * int(arg_b) * int(arg_c)
在RIDE中新建一個keyword命名為alg keyword。使用[Arguments]宣告引數如下所示。
在RIDE中編輯引數的方式為
然後在alg keyword編輯測試步驟,如下
儲存後html頁面為
這裡RIDE在生成html頁面時為了限制表格列數,將${c}另起一行並在前使用...表示這是與上一行的連線。最後加入[Return]返回${d}的值
在RIDE中在Return Value中新增返回值,完整的keyword編輯如下
完成Keyword後在RIDE中新增一個測試用例命名為second case,呼叫alg keyword並傳入引數1,2,3,並將返回的值進行列印
編輯完後勾選second case並點選按鈕執行。
執行結果如下
上面的執行結果顯示alg keyword在second case裡被正確使用了,也返回了正確的值。通過這種函式可以將單一的關鍵字封裝成高階關鍵字。Keyword也還有其他常用配置
3.3.3.3、Documentation
和setting中的一樣,用來做一些註釋,描述等等。
3.3.3.4、Teardown
關鍵字執行完成時最後會執行的操作。關鍵字在執行過程中如果遇到錯誤便會終止,如果後續操作中有資源釋放,這些操作就不會執行,可能會導致系統崩潰,記憶體洩露等,所以可以在Teardown中加入資源釋放的操作。
3.3.4、Variable
Robot可以在case之外單獨定義一些變數,這些變數可以設定預設值。這個更像是程式碼中的全域性變數。當有一些公共的配置,在每個測試用例都可能用到,比如ip地址,埠號,預設的使用者名稱和密碼等等。全域性變數的定義時建議全部使用大寫字母。在3.3.3的示例中,second case使用alg keyword使用了引數1,2,3,這裡可以使用全域性變數來替換。
首先在RIDE中建立全域性變數,在RIDE中右鍵點選Robot Test選擇New Scalar,然後給變數命名並設定預設
同樣方法再建立兩個全域性變數,完成後可檢視html表格
之後修改second用力,將這三個引數代替原本的1,2,3傳入到用例中
之後點選執行檢視結果。
4、Robot高階應用
掌握上述Robot應用便可完成大部分測試用例,另外Robot還提供了一些功能更強大的關鍵字可讓用例編寫更靈活
4.1、If分支
Robot支援if判決能讓用例執行時根據不同情況執行不同操作。If相關的關鍵字是”Run Keyword If”,”ELSE IF”,”ELSE”
利用3.3.3中建立的plus關鍵字,建立一個用例呼叫plus輸入兩個引數,如果返回的值小於0,則列印loga,大於等0,小於10列印logb,大於等於10列印logc。首先在RobotTest.py裡增加三個函式分別列印loga,logb,logc,呼叫robot中的logger需要匯入robot的api包
然後新建一個用例名為third case之後編輯用例,如下
之後可以嘗試修改plus的引數進行測試檢視結果。
If有個比較特殊的地方,如果判斷一個變數是否為某個字串,不能直接用${ret}去判斷,需要給${ret}加引號如下:
RunKeyword If | ‘${ret}’== ‘abc’ | Dosomething | arg1 |
如果不加引號,使用 ${ret} == ‘abc’,假設${ret}的值是qwe,執行時會報錯,告訴你qwe這個變數沒有定義。這種情況看來,robot將變數的值,當做程式碼裡的變數名處理,所以需要加上引號當字串處理。這是python的強大之處吧,可以通過字串轉化成一個變數的名字。
關於if的用法還有許多技巧,詳細看官方的幫助文件
4.2、迴圈
Robot可以使用For迴圈反覆執行一些操作,比較常用的做法是假如某個操作返回一各列表,而下一步需要分別處理列表裡的每個元素,那麼需要如下操作:
${table_list}= | Dosomething | ||
:FOR | ${table} | IN | @{table_list} |
Dofirst step | ${table} | ||
Dosecond step | arg2 |
使用:FOR 和IN便可遍歷列表中的元素,不過需要注意的是使用FOR遍歷時需要將變數通過@轉換成一個列表,否則無法正確遍歷。遍歷過程中可通過關鍵字” Exit For Loop”終止迴圈。FOR迴圈也支援多種方式,比如IN RANGE可以設定遍歷次數,或者直接在某幾項元素中遍歷,詳細可以看幫助文件for loop一節
4.3、Tags
之前提到過Tags的概念,是用於給用例做標記。使用者可以在setting中設定force tags和default tags,也可以在用例中使用[Tags]來給用例標記。Tags最直接的應用就是,可以有選擇的執行測試用例。比如有10個用例,其中5個用例使用[Tags]標記為group_a,另外5個標記為group_b。當使用pybot執行用例時假如加上引數--includegroup_a那麼robot只會執行有group_a標記的用例,如果使--excludegroup_a那麼robot除了group_a的用例不執行,其他都執行,並且一個用例可以加多個tags。在版本測試中,可以通過給用例增加tags,比如某個產品有100個用例,1.0版本需要測試的用例都加上1.0的tags,1.1的版本需要測試用例都加上1.1的tags,這樣在執行用例時就可以通過tags來區分版本,很方便。
在setting中可以設定Default Tags和Force Tags。使用這兩個配置後可以不用單獨給每個用例增加Tags,使用這些配置會讓用例增加哪些Tags,請看
上述連結中描述了Force Tags,Default Tags和用例自身的Tags是如何並存的。
4.4、pybot
pybot是robot的執行程式,事實上RIDE執行用例也是利用pybot,所以瞭解pybot的使用方法很重要。
最簡單的用例執行就是pybot xxx,其中xxx就是robot的資原始檔。就像1.2.3中的quickstart.html。使用該命令就可執行測試。通過pybot--help可以看到幫助手冊。常用的如--include,--exclude,--argumentfile,--listener,--variable,還可以設定日誌輸出的路徑等,等使用者需要使用時可檢視幫助