天天看點

Python自帶difflib子產品

官方文檔:https://docs.python.org/3/library/difflib.html

difflib子產品的作用是比對文本之間的差異,且支援輸出可讀性比較強的HTML文檔,與Linux下的vimdiff指令相似。

vimdiff效果如下:

Python自帶difflib子產品

在接口測試時,常常需要對不同版本的同一個接口的response進行比對,來驗證新版本的功能可靠性。接口數量多,加之vimdiff指令輸出的結果讀起來不是很友好,這時python自帶的difflib子產品就可以發揮作用了。

difflib.Differ類

import difflib
text1 = '''  yi hang
            er hang
     '''.splitlines(keepends=True)

text2 = '''  yi hang
            er han
            san hang
     '''.splitlines(keepends=True)

d = difflib.Differ()             # 建立Differ 對象
result = list(d.compare(text1, text2))
result = "".join(result)
print(result)      

結果:

Python自帶difflib子產品

注釋:

Python自帶difflib子產品

difflib.

HtmlDiff

import difflib
import sys
import argparse

# 讀取要比較的檔案
def read_file(file_name):
    try:
        file_desc = open(file_name, 'r')
        # 讀取後按行分割
        text = file_desc.read().splitlines()
        file_desc.close()
        return text
    except IOError as error:
        print('Read input file Error: {0}'.format(error))
        sys.exit()

# 比較兩個檔案并把結果生成一個html檔案
def compare_file(file_1, file_2):
    if file_1 == "" or file_2 == "":
        print('檔案路徑不能為空:第一個檔案的路徑:{0}, 第二個檔案的路徑:{1} .'.format(file_1, file_2))
        sys.exit()
    else:
        print("正在比較檔案{0} 和 {1}".format(file_1, file_2))
    text1_lines = read_file(file_1)
    text2_lines = read_file(file_2)
    diff = difflib.HtmlDiff()           # 建立HtmlDiff 對象
    result = diff.make_file(text1_lines, text2_lines)   # 通過make_file 方法輸出 html 格式的對比結果
    # 将結果寫入到result_compare.html檔案中
    try:
        with open('result_compare.html', 'w') as result_file:
            result_file.write(result)
            print("比較完成")
    except IOError as error:
        print('寫入html檔案錯誤:{0}'.format(error))

if __name__ == "__main__":
    # To define two arguments should be passed in, and usage: -f1 f_name1 -f2 f_name2
    my_parser = argparse.ArgumentParser(description="傳入兩個檔案參數")
    my_parser.add_argument('-f1', action='store', dest='f_name1', required=True)
    my_parser.add_argument('-f2', action='store', dest='f_name2', required=True)
    # retrieve all input arguments
    given_args = my_parser.parse_args()
    file1 = given_args.f_name1
    file2 = given_args.f_name2
    compare_file(file1, file2)      

result_compare.html效果:

Python自帶difflib子產品

注意:當接口response傳回的行數很多,difflib可能會發生比對錯行,導緻比對結果不準确,不妨去試一試xmldiff和json-diff