最近項目中使用了開源的自動化測試框架Robot Framework,總結一下,希望對大家有幫助。
安裝
首先,確保系統安裝了python。然后就可以使用pip安裝了:
pip install robotframework
安裝完成后,使用下面的命令查看版本:
robot --version
然后我們可以創建一個簡單的測試腳本:
*** Settings ***
Documentation Example using the space separated format.
Library OperatingSystem
*** Variables ***
${MESSAGE} Hello, world!
*** Test Cases ***
My Test
[Documentation] Example test.
Log ${MESSAGE}
My Keyword ${CURDIR}
Another Test
Should Be Equal ${MESSAGE} Hello, world!
*** Keywords ***
My Keyword
[Arguments] ${path}
Directory Should Exist ${path}
然后,可以使用robot運行這個測試腳本:
robot helloworld.robot
運行結果如下:

還可以安裝使用IDE工具RIDE,使用這個工具可以很方便地創建自動測試項目,編寫測試腳本。使用pip可以很方便地安裝:
pip install robotframework-ride
字符串操作
Robot Framework字符串拼接需要使用catenate關鍵字,下面的代碼將Hello和World合並
${s}= catenate Hello World
得到的結果是Hello World。如果我們希望中間沒有空格,需要使用SEPARATOR參數:
${s}= catenate SEPARATOR= Hello World
這樣得到的結果就是HelloWorld。SEPARATOR參數聲明了拼接中的連接字符,下面的代碼輸出結果是Hello|World:
${s}= catenate SEPARATOR=| Hello World
如果字符串中包含特殊字符,比如#等,需要使用轉義,示例如下:
${k}= catenate SEPARATOR= \#val_ ${key} \#
使用String庫中的Split String關鍵字可以將字符串分隔,比如v1,v2,v3使用逗號分隔,處理后的結果保存在列表中。使用示例如下:
FOR ${str} IN @{dic}
${ss}= String.Split String ${str} :
Set To Dictionary ${data} ${ss}[0] ${ss}[1]
END
這個例子中,傳入參數的鍵和值用冒號分隔,比如:
Name:Jone Age:13
這里使用Split String 將鍵和值分開,保存到字典中。
需要注意的是,使用Split String 關鍵字,需要引用String庫。
測試Web API
使用Robotframework的RequestsLibrary可以很方便地測試Web Api。首先需要安裝RequestLibrary:
pip install robotframework-requests
然后就可編寫測試腳本了。
首先需要聲明使用Library:
*** Settings ***
Library RequestsLibrary
接下來定義訪問的地址:
*** Variables ***
${HOST} http://localhost/myapi
然后就可以寫用例了:
*** Test Cases ***
API Test Example
Create Session my_session ${HOST}
${headers}= Create Dictionary Accept=application/json Content-Type=application/json charset=utf-8
# POST request with params
${data}= Create dictionary field1=value1 field2=value2
${response}= Post Request my_session my-endpoint headers=${headers} data=${data}
Should be equal as strings ${response.status_code} 200
Log ${response}
這里使用的是POST方法,向api發送的鍵值對定義在data中,這里使用了創建鍵值對字典的關鍵字Create Dictionary。返回的對象定義在變量${response}中,使用Post Request可以執行訪問。
數據庫相關測試
在測試時,我們可以直接訪問數據庫查看數據是否正確,這時可以使用Robot Framework DatabaseLibrary。
首先從https://github.com/franz-see/Robotframework-Database-Library下載,解壓后,執行python setup.py install進行安裝。安裝完成后就可以使用了。
在RIDE中創建一個新的測試,在Library中引入DatabaseLibrary,按F5打開SearchKeywords窗口,選擇DatabaseLibrary,可以列出所有相關的關鍵字:

還需要安裝特定的數據庫訪問模塊,如果訪問sqlserver,可以安裝pymssql:
pip install pymssql
然后就可以寫測試用例了,比如:
*** Settings ***
Library DatabaseLibrary
*** Test Cases ***
DBTEST
Connect To Database Using Custom Params pymssql database='dbname',user='username',password='pwd',host='localhost'
Table Must Exist AUTH_USER_TB
Disconnect From Database
Database Library中有兩個關鍵字可以用來連接數據庫:
Connect To DataBase 和 Connect To Database Using Custom Params,Connect To DataBase需要聲明參數或者將參數保存在配置文件中,參數如下:
dbapiModuleName=None, dbName=None, dbUsername=None, dbPassword=None, dbHost=localhost, dbPort=5432, dbConfigFile=./resources/db.cfg
這里需要注意,如果沒有顯示聲明dbName、dbUserName、dbPassword、dbHost或者dbPort,都會去指定的配置文件中查找相應的配置項,如果找不到配置文件,就會報錯。配置文件的格式如下:
[default]
dbapiModuleName=pymysqlforexample
dbName=yourdbname
dbUsername=yourusername
dbPassword=yourpassword
dbHost=yourhost
dbPort=yourport
可以使用的關鍵字如下:
- Check If Exists In Database:參數為select語句,如果有查詢結果,返回ture,否則為false。
- Check If Not Exists In Database: 與上面的關鍵字結果相反。
- Delete All Rows From Table:參數為表名,刪除表中所有數據。
- Description: 參數為select語句,返回為查詢結果字段的描述數組,比如name='id', type_code=1043, display_size=None, internal_size=255, precision=None, scale=None, null_ok=None)。
- Execute Sql Script: 執行sql腳本,多個sql語句使用分號分隔。
- Query: 執行查詢語句。
- Row Count: 返回查詢語句的行數。
- Row Count Is 0: 返回查詢行數是否為0。
- Row Count Is Equal To X :返回查詢行數是否為給定的行數X。
- Row Count Is Greater Than X: 返回查詢行數是否大於給定的行數X。
- Row Count Is Less Than X: 返回查詢行數是否小於給定的行數X。
- Table Must Exist: 指定表是否存在。
自定義關鍵字
使用Robotframework對Api接口進行測試,每次測試都需要先登錄,為了減少重復的登錄腳本,使用Robotframework自定義關鍵字簡化登錄過程的腳本。代碼如下:
*** Keywords ***
登錄到平台
[Arguments] ${host} ${username} ${password}
Create Session my_session ${host}
${data}= Create dictionary UserName=${username} Password=${password}
${response}= POST On Session my_session url=/api/Account/Login json=${data}
Log ${response}
[Return] my_session
為了方便使用,我們使用中文作為關鍵字的名稱。然后定義三個輸入變量,${host}是需要登錄的網址,${username}和${password}是用戶名和密碼。使用POST On Session實現登錄,登錄后返回登錄過程創建的會話。這個關鍵字可以在測試用例中使用,比如:
*** Test Cases ***
TestLogin
${mysession}= 登錄到平台 host=${HOST} username=saleuser1 password=1
${datalist}= Create dictionary WorkFlow_Name=LeaveApply1
${responselist}= POST On Session ${mysession} url=${GetActivateListUrl} json=${datalist}
Log ${responselist}
我們可以將自定義的關鍵字保存在資源文件中,便於在多個測試用例中共用。資源文件的結構與測試文件基本相同,只是沒有測試用例,變量和自定義關鍵字部分完全相同。在測試文件的設置部分引用資源文件,比如:
*** Settings ***
Library RequestsLibrary
Resource ../../Resources/flowresources.robot
資源文件的位置相對於當前路徑,路徑中也可以包含變量,比如${RESOURCES}/common.tsv。
如果多個資源文件中包含相同的自定義關鍵字,在使用這些關鍵字時,需要使用資源文件名作為前綴。如果多個資源文件中包含相同的變量,那么先加載的變量起作用。
很多情況下,我們需要自定義關鍵字可以接收多個參數,且參數的個數不確定,這種情況下,可以將參數聲明為列表,使用@修飾符,示例代碼如下:
MultiArguments
[Arguments] ${par1} @{dic}
Log ${par1}
FOR ${v} IN @{dic}
Log ${v}
END
在上面的例子中${par1}是固定參數,后面的@{dic}是可變參數列表,在自定義關鍵字中采用循環處理列表中的參數。調用的示例如下:
MultiArgumetns para1 u1 u2 u3 u4
為Robotframework開發自定義庫
Robotframework基於Python開發,我們使用Python開發自定義庫,對Robotframework提供擴展。開發和使用都非常簡單,由於python是解釋語言,自定義庫不需要編譯部署等等步驟,使用任何文本編輯器都可以實現。這里通過實現一個簡單的需求說明創建和使用過程。需求很簡單,需要從一個字符串中獲取flowid=后面的值。
首先我們創建一個python文件,代碼如下:
def get_flow_id(url):
idx = url.index('flowid=')+7
le = len(url)
flow_id = url[idx:le]
return flow_id
然后就可以在robot文件中引用這個庫了,在Settings中增加:
*** Settings ***
Library ../pylibs/getflowid.py
這里庫的位置相對於當前文件的位置。
在測試用例或者關鍵字中就可以使用自定義庫中定義的新關鍵字了,這里get_flow_id對應的新關鍵字是Get Flow Id,"_"符號被空格替換,並且后面的字符變為大寫。下面是使用的示例:
${fid} Get Flow Id ${rurl}
