首頁>技術>

Diff概念介紹

Diff是Unix系統的一個很重要的工具程式。它用來比較兩個文字檔案的差異,是程式碼版本管理的基石之一。

介面Diff測試

介面Diff測試,簡單來說就是比對相同介面在不同版本不同環境下面的返回內容是否符合預期。對於日常迭代的介面來說,Diff測試是我們介面基本功能測試的有效補充!當測試的介面響應中包括100+的欄位需要校驗時,對欄位逐一校驗的傳統方式效率差的問題就會突顯出來了。這種場景我們可以把某一版本(v1)介面的響應作為基準,然後再對比新版本(v2)的響應,透過工具或者編寫程式碼直接檢視響應的異同,進而快速定位介面響應資訊。透過工具比對介面在這裡就不重點介紹了,有很多方法,包括:linux系統中的diff命令,windows可使用工具notepad++等等。在這裡我重點介紹一下如何透過程式碼實現diff操作,我們以python為例。

Difflib

Difflib作為python的標準庫,無需安裝,作用是對比文字之間的差異,而且支援輸出可讀性比較強的HTML文件。

程式碼寫起來也非常簡單,例項如下:

import difflibimport sys#讀檔案def read_file(filename):      try:           with open(filename, 'r') as f:           return f.readlines()      except IOError:           print("ERROR: 沒有找到檔案:%s或讀取檔案失敗!"% filename)           sys.exit(1)def compare_file(file1, file2, out_file):    file1_content = read_file(file1)    file2_content = read_file(file2)    d = difflib.HtmlDiff() #以html方式比較    result = d.make_file(file1_content,file2_content) #生成html文字with open(out_file, 'w') as f: #把html文字寫入html檔案        f.writelines(result)if __name__ == '__main__':    compare_file(r'D:\logs\log1.log', r'D:\logs\log2.log',r'D:\logs\result.html')

開啟html報告,我們可以清楚地看到兩個文件中的差別,顯示如下:

其中左邊是檔案log1.log,右邊是log2.log

綠色表示log2.log新增的內容

黃色表示log1.log和log2.log中發生變化的內容

Difflib改進

上面的例子是從兩個檔案中讀取資料,然後進行的比較,程式碼如下:

file1_content =read_file(file1)

file2_content = read_file(file2)

那麼在真實測試時,我們需要的是介面響應的比對,怎麼做呢?也很容易,我們只需要把read_file換成,傳送介面請求(使用requests模組)並獲取響應即可。

response1=requests.get(req)

response2=requests.get(req)

在這裡仍然有一個問題,我們做介面測試時,是一個請求一個請求校驗的,當多個請求批次校驗時,我們是否有必要每做一個請求就生成一個比對錯誤的html報告呢?顯然是不需要的,理想情況是,當兩個請求響應出現錯誤的時候生成錯誤報告!那麼接下來需要思考的是怎麼樣判斷html報告中是否有錯誤出現呢?在這裡我介紹一個比較簡單的方法,在diff生成的html報告,我們透過報告中的顏色標識來判斷(紅色、綠色和紅色)diff結果,如下圖:

檢視一下生成的html檔案原始碼,發現檔案底部帶顏色的Add、Changed和Deleted 對應的指令碼是

在html檔案中搜索關鍵字class="diff_sub",發現:

201<span class="diff_sub">8,對應

if result.count('<span class="diff_sub">') >0 or result.count('<span class="diff_chg">')>0 or result.count('<span class="diff_add">')>0:    print ("find diff")    with open(out_file, 'w', encoding='utf-8') as f:           f.writelines(result)else:      print("not find diff, no html report generate!")

好了,這就是透過difflib進行介面比對操作的實現原理。原創不易,如果文章幫到了你,歡迎點贊轉發,讓更多的朋友受益!

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 阿里粗排技術體系與最新進展