在上一篇RobotFrameWork接口報文測試-----(二)demo的升級版基礎上,將接口的xml的格式保存在xml文件中,然后程序如果增加一個接口,在xml文件里添加即可,無需修改自動化測試里的其他模塊,然后在工具加case就可以了,但是接口取值的數據全部都是直接在case里面錄入的,也就是說,每增加一條測試用例,就需要在工具內添加一條case,測試數據始終都是在工具內控制,這讓以前使用excel管理過測試數據的我感覺很不爽,總感覺得把數據放到excel內,然后實現數據驅動測試。
圍繞着這個想法,先給出一個大致的業務流程圖。
.xml : 每個接口的xml定義的標准規范文檔。如下:

.xls : 每個接口的測試數據,保存在xls內。如下:

從xml文件中讀取接口的字段,再從excel中讀取相應的數據,然后組裝成sendbuf,調用報文處理模塊,將報文進行預處理后(在dll內實現,在會話層添加一些數據,然后再進行加密操作 )發往服務器端,服務器處理報文后,返回響應報文,報文處理模塊將報文解析后,提取出狀態碼,將實際狀態碼與預期狀態碼進行對比,測試完成。在(二)的基礎上,增加一個excel的處理模塊,將excel內的數據全部讀入到list中,簡單的代碼如下所示:
def readDataFromExcel(): data = xlrd.open_workbook('D:\logincase.xls') table = data.sheets()[0] nrows = table.nrows nclos = table.ncols listAll=[] for row in range(3,nrows): alist=[] for col in range(1,nclos): alist.append(table.cell(row,col).value) listAll.append(alist) return listAll
然后在RF工具內修改case,如下所示:

到此,已經把數據從case中剝離到了excel內,上圖只讀取了一條數據,如果要去讀多條數據,直接在里面寫個簡單的for循環即可,於是我以為我完全實現了數據驅動測試,開心了好幾天。。。。
一天無意間點到一位大師的博客,看了看,似乎覺得好像真有點道理,像我上面那樣實現,就算實現了數據驅動測試了么?那什么又是數據驅動測試呢?
數據驅動測試是從數據文件(如Excel文件、文本文件、XML文件或數據庫等)中讀取測試數據,然后通過變量傳入事先編寫或錄制好的測 試腳本中,這些變量既可傳遞測試輸入數據也可傳遞測試輸出的驗證數據。測試數據只出現在數據文件中,測試腳本負責測試邏輯業務過 程、測試狀態以及數據文件讀取,因此,測試數據和測試腳本是分開存放的。數據文件中的每一行表示一組測試數據,通過循環遍歷數據文件中的每一行,將數據逐一注入到相同的測試流程進行反復的測試驗證。
對比下手工測試的場景:當一個手工測試人員A發現在測試數據存儲目錄下多了一套測試數據時,他就會意識到應該馬上執行測試用例,並輸入這套新的測試數據。其實是測試數據的變化觸發了A的測試行為。再抽象一下,可以這樣來看:當測試數據變化時,測試用例就會被執行,並且按照預先定義的規則去讀取測試數據並執行測試用例。那么這種情況我們是不是可以理解為一種數據驅動呢?也就是說只要有了新的測試數據或者測試數據發生了變化,那么A就會去執行測試用例。這一過程的目的就是為了讓所有的測試數據都得到輸入並返回相應的輸出結果。
很顯然,這個概念強調了兩點:第一:測試數據與測試腳本,模塊的分離;第二:程序讀取測試數據,自動完成一些列的測試流程並返回測試結果。很多時候,我們大部分人都是做了第一點,忽略了第二點;大多數都能實現測試數據的參數化處理,卻無法完成自動運行相應的測試用例。了解數據驅動測試的相關概念后,自我審視覺得自己寫的確實沒法達到能完全自動運行的地步,至少存在以下幾個問題:
第一:測試A接口,怎么確定使用哪個sheet的數據呢?
第二:測試A接口,有10條用例,放在一個RF的case內管理,那這10個用例內,冒煙測試只要運行3條,集成需要10條,這怎么設置?而且如果一個case里存在一個測試用例失敗,則整個case是處於failed狀態的,這該怎么辦?
鑒於上面2個問題,實際上以前我都解決過;第一個問題好辦,既然id能確定接口的xml的標准格式,那就可以以這個id作為測試數據的sheet的名稱,就可以拿到具體接口的sheet數據。第二個辦法運行幾條case也好辦,在每個xls最后一列加一列,是否執行列,讀取為否,則不發送數據即可。但是第二個小問題,在RF內就無法解決了,應該是因為工具自身的局限性導致,一個RF的case不管里面實際跑了多少個測試用例,只要一個失敗,就是全部失敗狀態。所以在RF內測試用例的管理有2種形式:
第一:一個suit 就是一個接口,一個case就是一條測試用例。
第二: 一個suit是一個模塊,一個case是一個接口。
顯然第一個可以更方便的控制執行粒度,但是每一個測試用例就得新建一個case,測試數據直接寫在case內即可,是有點麻煩。如果碰到一個接口有四五十條測試用例,就只能呵呵了~~~第二個不太好控制執行粒度,但是在excel內管理數據,可以更好的管理測試數據。而且RF一直在說能實現數據驅動測試,但一直沒找到相關資料,大多都是實現到這一層基本就沒了下文,看了很多文檔,基本也差不多就到此為止了,看來也是時候需要去看看官方各種文檔了~~~~
