Robot Framework 介紹
RobotFramework是一款基於python的開源自動化測試框架,遵守Apache License 2.0協議,在此協議下所有人都可以免費開發和使用。因為Robot Framework 是靈活和可擴展的,所以它很合適用於測試具有多種接口的復雜軟件:用戶接口,命令行,web service,編程接口等。RF提供很多的擴展庫供使用。Robot的測試用例和配置使用HTML,TXT等格式文件進行編輯,html是比較常用的一種格式。
關鍵字驅動
關鍵字驅動使得我們的自動化用例具備非常高的可讀性,只要由測試開發人員封裝好關鍵詞庫,即使是業務測試人員也可以很方便地編寫自動化用例;其次,可以在基本關鍵詞的基礎上構造高級關鍵詞,這使得我們的自動化有了無限擴展的可能;例如以測試計算器功能為例:這邊其實包括了4個測試用例,及連續輸入、簡單加、復雜運算、復位功能,“Push Button”、“Result should be”都是我們在關鍵詞庫中預先定義好的關鍵詞,實現了簡單的操作及斷言功能;
數據驅動
數據驅動引入了一個非常有效的“模板”概念,在很多測試場景下,測試人員輸入的操作是有一定重復性的,區別只在於輸入的數據,還是以登陸為例,除了包含正常的測試用例,還需要有其他的異常用例覆蓋才能保證登陸接口的正確性。基於橫向構造不同的測試數據輸入來判斷不同的測試結果,即為數據驅動。行為可以封裝成模板。
該用例定義了兩個模板,一個是Calculate計算模板,一個是錯誤模板。然后直接根據測試數據執行即可。
行為驅動
行為驅動是一種在關鍵詞驅動之上更加抽象更加高級的自動化測試手段;通常結構是“Given-When-and-Then”,即在一個什么樣的前置條件下,當用戶觸發了什么操作,產生了一個什么樣的結果,結果該是怎么樣。還是以測試及計算器為例。
一、RF轉義字符
Rf的測試數據轉義字符是反斜杠 ( \ )
二、Robot Framework文件類型
1.RF文件
Robot Framework測試數據以表格形式進行定義,可以使用的格式包括超文本標記語言(HTML),制表符分隔值(TSV),純文本或者新結構化文本(reST)。Robot Framework根據文件的擴展名來為這些以不同格式存儲的測試數據選擇解析器。擴展名不區分大小寫,可識別的擴展名包括HTML的.html,.htm和.xhtml,TSV的.tsv,純文本的.txt和新結構化文本的.rest。針對HTML和TSV格式有不同的測試數據模板,使你輕易就可以開始動手編寫用例。在HTML文件中,測試數據通過分隔的表格進行定義。Robot Framework基於首個單元格里的文本來識別這些測試數據表。所有可識別表格之外的參數都自動忽略。你可以使用任何你喜歡的編輯器來編輯HTML文件中的測試數據,但是推薦使用可以實實在在看到表格的圖形化編輯器。
RF文件通常以.robot為后綴名,並且提供了很多的編輯工具,方便的進行robot文件的編輯。官方的RIDE是很好的選擇,純圖形化界面,方便團隊沒有開發經驗的人參與其中。一個RF文件通常包括三個節點(也稱為表):
表格名稱 |
作用 |
別名 |
Setting表 |
1、 加載測試庫文件、資源文件和變量文件; 2、 為測試文件和測試用例定義中間變量; |
Setting, Settings, Metadata |
Variable表 |
變量定義,這些變量能在整個測試數據中使用。 |
Setting, Settings, Metadata |
Test Case表 |
利用存在的關鍵字創建測試用例; |
Test Case, Test Cases |
Keywords 表 |
利用已存在的低級關鍵字創建用戶級關鍵字; keyword可以理解為一個公用的方法,供test case使用 |
Keyword, Keywords, User Keyword, User Keywords |
2.Resource資源文件的結構
其實resource文件與普通robot文件沒多大區別,只不過它是被導入的庫文件,通常用來定義一些公用的變量和keywords:
三、變量
變量是RF的完整特征,它們能在測試數據的大多數地方被使用。最常見的是在測試用例表和關鍵字表中被用於關鍵字的參數。一個普通的關鍵字名稱不能使用變量來指定,但使用內建關鍵字Run Keyword 可以。RF的變量無需特定聲明,只要有初始化賦值即可使用。不區分大小寫、空格和下划線
•標量變量:${scalar}。當在測試數據中使用標量變量時,他們將被分配的值所代替。
•列表變量:@{LIST}。列表變量是復合變量,可以分配多個值給它。
•字典變量:& {DICT}。
•數字變量:可以用來創建一個全是整型和浮點型的數字:整形80、浮點型80、浮點型{3.14}
•Boolean變量:${true/false}
•Null/None變量: ${null/None}
•空格SPACE和空SPACE和空{EMPTY}變量
•操作系統變量
1、標量變量、列表變量、元組變量、字典變量
訪問單個列表項
可以訪問一個特定值的變量列表的語法 @ {名稱}(指數) ,在那里 指數 是選擇的索引值。 指數 從0開始,負指標可以用來訪問項目的結束, 和試圖訪問一個值太大索引會導致一個錯誤。 指數會自動轉換為整數,還可以 使用變量指標。 可以使用列表項以這種方式訪問 同樣作為標量變量。
*** Test Cases ***
List Variable Item
Login @{USER}
Title Should Be Welcome @{USER}[0]!
Negative Index
Log @{LIST}[-1]
Index As Variable
Log @{LIST}[${INDEX}]
標量變量、列表變量、字典變量創建和引用有何區別:
實際案例展示
這里我們直接創建了這三種數據,
然后,我們新建一個case,來驗證一下我們能否引用這些數據類型
1行為單個數據scalar,2、3、4行是list,5行是dic
我們中間在2、3行使用了一個循環語法,來循環的輸出列表中的內容
2、數字變量
3、布爾變量和None/null
4、space和empty
5、操作系統變量
變量 |
解釋 |
$ { CURDIR } |
目錄的絕對路徑,測試數據文件所在的位置。 這個變量是區分大小寫的。 |
$ { TEMPDIR } |
系統臨時目錄的絕對路徑。 在類unix系統通常 / tmp ,在窗戶 c:\Documents and Settings\ <用戶> \ Temp \本地設置。 |
$ { EXECDIR } |
目錄的絕對路徑測試執行 從開始的。 |
$ { / } |
系統目錄路徑分隔符。 / 在類unix 系統和 \ 在Windows。 |
$ {:} |
系統路徑元素分隔符。 : 在類unix 系統和 ; 在Windows。 |
$ { \ n } |
系統行分隔符。 \ n 在類unix系統和 \ r \ n 在Windows。 2.7.5新版本。 |
*** Test Cases ***
Example
Create Binary File CURDIRCURDIR{/}input.data Some text here${\n}on two lines
Set Environment Variable CLASSPATH TEMPDIRTEMPDIR{:}CURDIRCURDIR{/}foo.jar
四、RF庫
1、標准庫
Robot Framework可以直接導入使用的庫,包括:
•Builtin:包含經常需要的關鍵字。自動導入無需import,因此總是可用的
•Dialogs:提供了暫停測試執行和從用戶的輸入方式。
•Collections:提供一組關鍵詞處理Python列表和字典。
•OperatingSystem:允許執行各種操作系統相關的任務。允許執行各種操作系統相關的任務,使各種操作系統相關的任務在robotframework正在運行的系統中執行。
•Remote:遠程庫接口的一部分。沒有自己的任何關鍵字,作為robotframework和測試庫之間的代理的特殊庫。實際測試庫可以在不同的機器上運行,可以使用任何編程語言支持XML-RPC協議的實現。
•Screenshot:提供關鍵字來捕獲和存儲桌面的截圖。
•String:用於處理字符串並驗證它們的內容的庫,用於生成、修改和驗證字符串
•Telnet:支持連接到Telnet服務器上打開的連接執行命令。
•XML:用於生成、修改和驗證XML文件的庫。
•Process:系統中運行過程的庫。
•DateTime:日期和時間轉換的庫,支持創建和驗證日期和時間值以及它們之間的計算
2、擴展庫
Robot Framework需要下載安裝后才能使用的庫,包括:
•Android library:所有android自動化需要的測試庫,內部使用的是Calabash Android
•iOS library:所有iOS自動化需要的測試庫,內部使用Calabash iOS服務
•appiumlibrary:Android和iOS測試庫,內部使用的是appium
•HTTP library (livetest):內部使用LiveTest工具的HTTP測試的庫。
•HTTP library (Requests):內部使用request工具的HTTP測試的庫。
•MongoDB library:使用pymongo和MongoDB交互的庫。(MongoDB是一個基於分布式文件存儲的數據庫)
•Database Library (Java):基於Java的數據庫測試庫。也可使用Jython和Maven central.
•Database Library (Python):基於Python數據庫測試庫。支持任何Python解釋器,包括Jython。
•watir-robot:使用Watir的工具的Web測試庫。
•seleniumlibrary:Web測試庫,內部使用比較流行的selenium工具。利用早期的selenium1.0和本身已經過時。
•selenium2library:使用selenium2的Web測試庫。替換了大部分老的seleniumlibrary。
•selenium2library java:selenium2library的java接口
•Django Library:為Django的庫,一個Python Web框架。
•sudslibrary:一種基於泡沫基於SOAP的Web服務的功能測試庫,動態的SOAP 1.1的客戶端。
•Archive library:處理.zip和.tar壓縮包的庫。
•Diff Library:比較兩個文件的庫。
•FTP library:Robot Framework上測試和使用FTP服務的庫。
•SSHLibrary:通過SSH連接的在遠程機器上執行命令。還支持使用SFTP進行文件傳輸
•rammbock:通用的網絡協議測試庫;提供簡單的方法來指定網絡數據包,並檢查發送和接收數據包的結果。
•imagehorizonlibrary:跨平台、基於圖像識別的GUI自動化純Python庫。
•autoitlibrary:Windows的GUI測試庫,使用AutoIt的免費工具作為驅動。
•Eclipse Library:使用SWT窗口小部件測試Eclipse RCP應用程序的庫。
•robotframework-faker:一個服務faker的庫,faker的測試數據生成器。
•swinglibrary:用Swing GUI測試java應用程序庫
•remoteswinglibrary:使用swinglibrary庫測試和連接一個java進程,尤其是java web
start的應用。(Java Web Start 是基於 Java 技術的應用程序的一種部署解決方案,它是連接計算機和 Internet
的便捷通道,允許用戶在完全脫離 Web 的情況下運行和管理應用程序)
•MQTT library:測試MQTT brokers和應用的庫。
3、用戶自定義的Test Library庫
在實際的工作中,肯定會發現有些功能RF自身的Library,或者第三方的Library都無法實現,這個時候我們就得自己寫library來實現它了。
1)編寫Library
假設你有3個方法,你需要寫成自己的library
1:公式:(a+b)的a次方,a,b是正整數
2:有一網址(字符串),http://www.example.com?ip=192.187.111.198&code=12345&name=cat,想得到ip內容,即192.187.111.198
3:(用戶名+10位隨機數+一個key)進行md5加密
比如我這樣子已經寫好了,編譯調試一下,確保自己沒有錯誤哦。若是有錯誤,導入RF會失敗。然后,將這個文件保存的文件名要和這個class的類名一樣,所以我把他保存成MyLibrary.py
2)放置位置及導入
最后,我們把這個文件放在了RF項目的同一目錄下,即可。如果你放在其他地方,也是可以的,但是導入的時候,地址要寫對哦
來到RF中,我們導入它(記得寫.py)
3)確認導入成功
按F5,是不是看到自己寫的那些關鍵字了?而且還有自己的中文注解哦
4)使用library
使用這3個關鍵字,我們跑一下
5)查看結果
運行結果
4、Robot Framework自定義Library
RobotFrame Work為我們提供了包括OS、Android、XML、FTP、HTTP、DataBase、Appium、AutoIt、Selenium、 Watir等大量的庫。在使用過程中,除這些庫之外,對於某些我們自己特定的應用邏輯,我們還需要開發自己的Library,以便於進行自動化測試。本篇我們以baidu搜索英文時的自動翻譯為例,介紹一下如何開發自己的Library。
我們這次使用的示例的業務邏輯如下,打開baidu,搜索英文單詞“Test”,查看頁面中是否含有Test的自動翻譯結果(我們以翻譯結果“檢驗”做驗證),手動執行效果如圖
1.編寫腳本
我們使用Python的urllib編寫測試腳本,並保存到當前RobotFrame Work的測試項目目錄下,文件名為MyLibrary.py 。
# -*- coding=utf-8 -*-
import urllib
import urllib2
class MyLibrary():
def Is_Translate(self,english,chinese):
u'''
檢查輸入的英文單詞在進行baidu搜索時,是否調用了baidu英文翻譯引擎
'''
#url地址
#url='https://www.baidu.com/s'
url='http://www.baidu.com/s'
#參數
values={
'ie':'UTF-8',
'wd':'test'
}
#進行參數封裝
data=urllib.urlencode(values)
#組裝完整url
#req=urllib2.Request(url,data)
url=url+'?'+data
#訪問完整url
#response = urllib2.urlopen(req)
response = urllib2.urlopen(url)
html=response.read()
x=chinese in html
print x
def test():
lib=MyLibrary()
lib.Is_Translate( "Test", "測驗")
if __name__ == '__main__':
test()
print 'finished'
在本地運行腳本,檢驗腳本的正確性。
2.引用自定義Library
在TestSuit節點上進行編輯,添加Library,Library名稱為我們的腳本文件名MyLibrary.py 。
按F5鍵,查看剛剛引入的Library
3.添加測試用例
新建一個測試用例,命名為“百度翻譯”。添加測試步驟“Is Translate”
此時看到所編輯行的兩個單元格變為了紅色,表示該關鍵字需要兩個必填變量,對應我們的腳本中的兩個參數。
添加變量,英文輸入“Test”,對應檢驗結果為“測驗”
4.運行測試
運行測試,此時,測試不通過
檢查錯誤信息,錯誤信息為
Starting test: 百度搜索測試.兼容性測試.百度翻譯
20150824 16:59:37.014 : FAIL : UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 490: ordinal not in range(128)
Ending test: 百度搜索測試.兼容性測試.百度翻譯
表示是我們的TestCase中的中文字符編碼格式錯誤,此時需要調整以下RobotFrame Work在調用腳本進行運行時的系統編碼格式。
5.增加中文支持
向腳本中添加代碼,設置系統默認編碼為utf8
#添加中文支持
reload(sys)
sys.setdefaultencoding('utf8')
6.再次執行
再次執行測試,測試通過,結果為Pass,表示被打開的頁面中出現了我們所需要的“測驗”字符。(作為簡單示例,此時暫不考慮其它搜索結果中的輸出問題,如 果要進行嚴格的測試,應該對搜索后返回的html做解析,先定位到baidu翻譯引擎的div位置,再對位置中的翻譯結果做檢查。)
5、Robot Framework開發系統關鍵字
對於特定的需求,工具沒提供相關的Library和關鍵字的時候,就只能放棄了。還好robot framework提供了 Evaluate 關鍵字,對於Evaluate 關鍵字的使用等有時間再講。當robot framework 不能解決需求,我是直接寫個.py 程序,通過Evaluate 關鍵字調用。然后,就受到了批評,不能這么玩,動不動就這么干的話其實robot framework 就成了雞肋,所以,規范的做法是去封裝系統關鍵字。
其實我的需求也非常簡單,接收一個目錄路徑,自動遍歷目錄下以及子目錄下的所有批處理(.bat)文件並執行。
首先在..\Python27\Lib\site-packages目錄下創建CustomLibrary目錄,用於放自定義的library庫。在其下面創建runbat.py 文件:
#-*- coding:utf-8 -*-
from robot.api import logger
import os
class Runbat(object):
def run_all_bat(self,path):
u'''接收一個目錄的路徑,並執行目錄下的所有bat文件.例
| run all bat | filepath |
'''
for root,dirs,files in os.walk(path):
for f in files:
if os.path.splitext(f)[1] == '.bat':
os.chdir(root)
#print root,f
os.system(f)
def __execute_sql(self, path):
logger.debug("Executing : %s" % path)
print path
def decode(self,customerstr):
return customerstr.decode('utf-8')
if __name__ == "__main__":
path = u'D:\\test_boject'
run = Runbat()
run.run_all_bat(path)
注意在run_all_bat()方法下面加上清晰的注釋,最好給個實例。這樣在robot framework 的幫助中能看到這些信息,便於使用者理解這個關鍵字的使用。
對於創建普通的模塊來說這樣已經ok了。但要想在robot framework啟動后加載這個關鍵字,還需要在CustomLibrary目錄下創建__init__.py文件,並且它不是空的。
from runbat import Runbat
class CustomLibrary(Runbat):
"""
這里也可以裝x的寫上我們創建的CustomLibrary如何如何。
"""
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
這個文件中其實有用的信息就三行,但必不可少。robot framwork 在啟動時會加載這個文件,因為在這個文件里指明了有個runbat文件下面有個Runbat類。從而加載類里的方法(run_all_bat())。
下面,啟動robot framework RIDE,按F5:
找到了我們創建的關鍵字,下面就是在具體的項目或測試套件中引用CustomLibrary
然后,在具體的測試用例中使用“run all bat” 關鍵字。
6、Robot Framework 連接Oracel數據庫
Robot Framework 提供了多種Library。其中Database Library可用來連接操作數據庫。
1.安裝Database Library
打開Robot Framework官網,找到Database Library,選擇Python版的。地址:http://franz-see.github.io/Robotframework-Database-Library/
Database Library的運行需求包括:
Python環境
Robotframework
Database API Specification 2.0 Python Module
其中的Python與Robot Framework我們已經安裝過,現在需要安裝一個Database API Specification 2.0 Python Module,也就是用於連接數據庫的Python模塊。這里的邏輯是這個樣子的,Database Library實際上是一個處在Robot Framework和Database Interfaces 中間的代理模塊,Robot Framework 通過Database Library 所提供的接口,間接的調用各數據庫的Database Interfaces,從而實現操作數據庫的目的。
打開Database Interfaces頁面,找到Oracle的API驅動及下載地址,找到你對目前python環境對應版本的安裝文件,下載安裝http://sourceforge.net/projects/cx-oracle/files/
之后,下載安裝DatabaseLibrary。安裝完成后,在你的 \Python27\Lib\site-packages目錄下,可以看到Database Library文件夾和cx_Oracle.pyd文件
2.編寫測試腳本
我們編寫一個數據庫查詢的測試用例,腳本如下:
Connect To Database Using Custom Params cx_Oracle 'bpm','bpm','orcl'
@{data} query select * from sys_user
log many @{data}
log ${data[0][1]}
countGetlengthcountGetlength{data}
log ${count}
Disconnect From Database
運行腳本,結果如下
運行后查看Log,表中的中文全部變成了亂碼。cx_Oracle的默認編碼不是Utf-8,需要人工轉換一下。DataBaseLibrary自身沒有提供轉換函數,為了解決這個問題,我們需要對DataBaseLibrary進行擴展。
3.解決Database Library中文亂碼問題
打開安裝目錄下的 query.py文件,添加一個decode函數,用於對字符串進行解碼
def decode(self,customstr,mode):
return customstr.decode(mode)
更改測試腳本,增加轉碼過程
再次運行,得到系統輸出,測試通過
7、Robot Framework 使用條件表達式
主要對如何在Robot Framework中使用條件表達式做過程控制作說明。按照Robot Framework的官方文檔介紹,Robot Framework並不建議在TestCase或Keyword的編寫中使用條件表達式,應為這樣做會使TestCase變得難以理解。它提倡的是將邏輯過程寫在自定義的Test Library中,之后再執行Test Library中的方法,並獲取其執行結果。盡管如此,RobotFramework還是提供了一些Keyword可以用於條件判斷。
1. Run Keyword
Run Keyword可以將一個關鍵字作為一個參數,並執行該關鍵字,同時,該關鍵字可以是從之前的內容中動態獲取的變量。舉例來說。
我們在自定義的MyLibrary.py庫中,增加一個方法,用於進行條件判斷,並返回結果。
def get_result(self,arg):
if int(arg) > 0:
return 'LOG'
else:
return 'FAIL'
建立TestSuite“IF測試”,建立TestCase“Run_Keyword”,引用MyLibrary.py,編寫腳本。
1)編寫輸入數據>0的腳本
運行,並查看測試結果,此時,“Log”作為“Get Result”的返回結果,賦值給了${key},並在Run Keyword時被執行
2)編寫輸入數據=0的腳本
運行,並查看測試結果,此時,“Fail”作為“Get Result”的返回結果,賦值給了${key},並在Run Keyword時被執行
2. Run Keyword If / Run Keyword Unless
Run Keyword If 和 Run Keyword Unless 當滿足條件表達式要求時,執行指定關鍵字。可以用於簡單的IF/ELSE 邏輯。例如。我們編寫腳本如下:
其中 … 用於語句分段。運行測試用例,執行結果為:
對應的Run Keyword Unless的用例及執行結果為:
3. Set Variable If
Set Variable If用於根據表達式,動態的設置變量值。我們編寫腳本如下:
執行測試用例,執行結果為:
以上的方法可以用於做if/else簡單分支的邏輯處理,對於存在else if等情況時,可以采用如下方法:
對應的執行結果為:
8、Robot Framework使用For循環
在自動化測試過程中,使用For循環來對某個動作進行重復操作是很普遍的行為。在Robot Framework中,各種測試庫中均提供了多種方式的For循環結構,在其中覆蓋了大部分類型的循環類型。而Robot Framework自身也包含了多種的For循環語法結構,可用於獨立編寫帶循環結構的測試腳本。
For循環可以在TestCase中進行使用,也可以在KeyWrod中進行使用。除了特別簡單的測試用例外,一般建議在Keyword中進行使用,以便於將For循環的復雜性隱藏起來,保持測試用例結構上盡可能的簡單。
1.普通的For循環
在一個普通的For循環中,循環開始的關鍵字是 :FOR ,其中的:用於與一般關鍵字做區分,對於循環結構體內的每一行,使用 \ 作為改行的行首關鍵字。對於循環中的變量,可以在 IN 關鍵字后給出所有變量,也可以從一個列表中進行賦值,每次循環從列表中取出一個值。例如:
1)給出所有變量
2)從列表中進行賦值
執行測試用例,輸出結果為:
2.嵌套循環
Robot Framework本身並不支持直接使用嵌套循環,但是可以通過在一個循環結構中使用另一個包含有循環結構的關鍵字來實現。例如
*** Keywords ***
Handle Row
[Arguments] @{row}
: FOR ${cell} IN @{row}
\ log ${cell}
Handle Table
[Arguments] @{table}
: FOR @{row} IN @{table}
\ Handle Row @{row}
在使用時,調用Handle Table,Handle Table再調用內層循環Handle Row,從而實現嵌套循環的目的。
3.For-in-range循環
除了針對序列的循環之外,有些時候還需要能夠進行特定迭代次數的循環。Robot Framework中通過FOR index IN RANGE limit來實現,其語法與Python中的使用方式相似。
1)只使用數據上限
只使用數據上限時,數據從0開始,每次+1,數據從0直到指定數據,但不包含該數據。例如:
輸出結果為0、1、2、3、4、5、6、7、8、9,數據從0開始至9結束,輸出結果不包含10.
2)使用開始和結束數據
使用開始和技術數據時,數據從“開始數據”開始,每次+1,至“結束數據”結束,但不包含結束數據。例如:
輸出結果為2、3、4、5、6、7、8、9、10,數據從2開始至10結束,輸出結果不包含11.
3)使用開始、結束、步長
使用 開始、結束、步長 時,數據從“開始數據”開始,每次+“步長數據”,至“結束數據”結束,但不包含結束數據。例如:
輸出結果為2、5、8,數據從2開始至11結束,每次累加3,輸出結果不包含11.
4.For-in-enumerate循環
有些時候需要知道當前循環中的循環位置的index編號,此時可以使用FOR index ... IN ENUMERATE ...關鍵字。在取index編號時,固定使用 ${index} 作為變量名,例如
運行結果為
5.多變量循環
與Python中的for循環類似的是,當列表中的變量數量可以被一定數量整除時,可以直接使用等於該數量的變量做循環。例如
6.For-in-zip 循環
對於有些測試來說,可能會用到多個列表的數據,在循環中需要對這些數據進行組合使用。Robot Framework提供了一個叫做For-in-zip的關鍵字,該關鍵字來自於python內置的zip函數,可用於對列表進行組合。例如
這里注意,我們在定義一個列表變量時,可以使用列表名,也可以使用@列表名,而在for−in−zip循環中使用該關鍵字時,只能使用列表名,也可以使用@列表名,而在for−in−zip循環中使用該關鍵字時,只能使用{列表名}。執行測試用例,結果如下:
7.跳出循環
一般來說一個循環結構的用例需要遍歷完所有數據后再退出。某些情況下,需要提前終止並跳出循環時,可以使用Exit For Loop 或者 Exit For Loop If。例如
或是使用
執行測試用例,輸出結果為:
8.在循環中使用continue
有些時候,需要在循環中使用continue來跳過循環結構體中的某些過程。在Robot Framework中,可以使用Continue For Loop 或者 Continue For Loop If。具體用法與跳出循環時的Exit用法一致,這里不再做演示。
9.重復執行單一關鍵字
某些情況下,循環結構可能只需要對一個關鍵字做執行次數的循環。Robot Framework提供了一個關鍵字Repeat Keyword,只需指明循環次數和循環中的關鍵字即可。而在描述循環次數時,有時為了讓測試用例易於理解,可以在次數后面添加一個times 或 x 例如:
五、Robot Framework分層思想
談到Robot Framework 分層的思想,就不得不提“關鍵字驅動”。在程序設計的講究設計模式,設計模式其實就是根據需求使用抽象與封裝,其實就是分層思想。把一個實現過程分成不同多層。提高的靈活性,從而達到可擴展性和可維護性。再回到自動化的話題上,我們可以把操作步驟封裝一個一個的方法(關鍵字),通過調用關鍵字來實現測試用例。
我現在要寫5條百度搜索的用例:
可以在Search測試套件下創建5條測試用例。其實對於每一條測試用例來說,只是搜索的內容不同,腳本步驟是完全一樣的。這樣做無疑增加的腳本的冗余,而且不便於維護。假如,百度輸入框的定位方式變了,我不得不打開每一條用例進行修改。
我們可以過創建關鍵字的方式,從而實現分層的思想來解決這個問題。
Robot Framework 關鍵字
1、創建資源
右鍵“測試項目”選擇“new resource”創建資源。
輸入資源名稱:
2、創建關鍵字
右鍵“業務關鍵字”選擇“new User Keyword” 來創建用戶關鍵字。
輸入關鍵字的名稱:
3、編輯關鍵字
分析:
對於一個測試用例來說,用戶關心的是輸入什么內容,得到什么結果。
所以,對於“百度搜索”關鍵字來說,需要創建兩個接口變量search和search和{result} 兩個變量,用於接收輸入內容和預期結果。
點擊Arguments輸入框,定義變量,多個變量從用“|”隔開。
在百度用戶中使用參數化變量。
4、添加創建的資源
切換到測試套件(Search)頁面,添加資源(業務關鍵字.txt)
5、調用關鍵字
現在就可以在測試用例中使用創建的關鍵字了(百度搜索)。
對於每一條用例來說,調用“百度搜索”關鍵字,輸入搜索內容,輸入預期結果即可。不同關心用例是如何執行的。如果百度輸入框的定位發生了變化,只用去修改“百度搜索”關鍵字即可,不用對每一條用例做任何修改。大大提高的用例的維護性和擴展性。
繼續分層的設計:
到此,Robot Framework +selenium 自動化測試粗獷的講完了。當然還有更多API 的使用,和細枝末節的設置沒有介紹。但我們已經可以拿它來開展自動化工作了。
流程與數據分離
將搜索測試中的內容繼續分層,還是要把一些底層的代碼級關鍵字繼續拆分出來
下面對res1.txt進行操作
1.打開瀏覽器
2.輸入搜索內容
3.點擊搜索
4.校驗標題
5.關閉瀏覽器
接着我們把對應的搜索測試中的代碼都換成相應的關鍵字,記得添加參數${url}
最后該運行了
至此,我們這個案例就已經完成分層了,因為案例比較簡單,所以只分了3層,分別是案例層,流程層,元素層。他們的調用關系也是逐層深入的
流程與數據分離的好處不單是為了以后維護方便,也使得案例的架構層級清晰。越是靠近上層的部分,腳本越貼近自然語言,或者說很像我們的測試案例;越靠近下層的部分,越是接近頁面元素的代碼級部分。這樣以后如果發生維護的時候,根據需要維護的內容,只需要在很少的地方進行調整即可。比如一個元素的id變了,那我只要在elements里面更新就行了。比如測試的流程調整了,以前是ABC的頁面順序,現在是ACB的頁面順序,那么只要在testflow層進行調整即可。實際上目前我們的流程都集中在testflow以及下面的部分,而數據一般都是在案例層去給流程層傳遞,這就是我們的流程與數據分離了。當然,我們還可以再進一步的分離,把數據放到外面,脫離我們的案例,在運行的時候才傳遞進行,也是可以實現的。后面我會做個簡單的例子給大家看。
Robotframework+jenkins配置
假設我們完成了一個模塊的用例設計,可是想晚上9點或凌晨運行,這時候該怎么實現呢?jenkins可以很好解決我們的疑難。
Jenkins安裝
這里簡單說下安裝,建議下載war包在tomacat中啟動或是直接在cmd中使用命令啟動jenkins(如果已經使用.msi安裝成windows服務了,下面會提到解決方法)。
配置
- 基本信息
在jenkins主頁中,新建 一個自由風格的項目,配置項目的名稱等基本信息如圖
因為這里沒有使用svn或git,文件直接保存在本地,所以沒有使用源碼管理,如果使用了源碼管理的可以根據實際情況配置源碼管理的配置信息。
- 構建觸發器
這里選擇使用Build periodically,進行定時構建,如圖
這里設置的是每天凌晨2點進行構建。
這里注意選擇的是build Periodically,選擇的是定時構建,不管代碼是否有更新;而另外一個構建方式Poll SCM,則是svn或git代碼有更新才會再制定的時間內進行構建
- 構建
接下來就是構建過程,這里是windows環境,所以使用的是Execute Windows batch command
使用命令執行要運行的用例如pybot.bat -d F:\outputdir F:\test\cswx\,這里-d是將執行結果保存在F:\outputdir目錄下,而F:\test\cswx\是需要執行用例的文件夾
- 構建后操作
這里提前需要安裝一個插件Public Robot Framework test result
如果構建的時候,使用的是默認的輸出目錄,那么這里的Directory of Robot output 默認為空。
- 添加接收郵箱
- 執行結果
構建之后查看結果如圖