接口自動化測試(5)-生成excel測試報告

前面幾篇都是個鋪墊,直到這篇我還是感覺jmeter好用,包括第三篇準備的數據,可以用在jmeter參數化裏面。這篇稍微能讓人眼前一亮,自動出一個excel測試報告,比jmeter自己再去看測試結果稍微好點。代碼我理解的也不是很透徹,包括課程的講師感覺水平也一般,但是至少老師給指條路,還是得心懷感恩的。代碼還是有點bug,但是我不會改,文章結尾再說一下問題。

先看一下生成的excel測試報告:

excel兩個工作標籤,具體內容都是代碼控制的,包括測試總結那裏“寫啥都行,也可以不要這格”,原本放的是課程的機構名稱,被我臨時改成這個了,當然代碼沒實現自動換行,我特意把報告這裏手動改成了自動換行。下面放代碼,很長,需要耐心看。

import xlsxwriter
import TestRequest
from testvote import *
from testdata.getpath import GetTestReport
#調用第四篇寫的
tianqi()
# 調用測試結果 
TestReport = TestRequest.hlist  
hpassnum = 0  # 定義一個變量,用來計算測試通過的用例數量
#
def get_format(wd, option={}):
    return wd.add_format(option)
# 設置居中
def get_format_center(wd, num=1):
    return wd.add_format({'align': 'center', 'valign': 'vcenter', 'border': num})
#設置邊框
def set_border_(wd, num=1):
    return wd.add_format({}).set_border(num)
# 寫數據
def _write_center(worksheet, cl, data, wd):
    return worksheet.write(cl, data, get_format_center(wd))
#
timenow=time.strftime("%Y/%m/%d %H:%M",time.localtime(time.time()))
ReportPath=GetTestReport()
workbook=xlsxwriter.Workbook(ReportPath)    #生成的報告路徑
worksheet=workbook.add_worksheet("測試總結")#第一個工作標籤名
worksheet2=workbook.add_worksheet("用例詳情")#第二個工作標籤名
#第一個標籤頁內容
def init(worksheet):
    # 設置列行的寬高
    worksheet.set_column("A:A", 15)#A列的寬
    worksheet.set_column("B:B", 20)#B列的寬
    worksheet.set_column("C:C", 20)
    worksheet.set_column("D:D", 20)
    worksheet.set_column("E:E", 20)
    worksheet.set_column("F:F", 20)
    worksheet.set_row(1, 30)#第一行的高
    worksheet.set_row(2, 30)
    worksheet.set_row(3, 30)
    worksheet.set_row(4, 30)
    worksheet.set_row(5, 30)
    #下面幾行有點像方法,把單元格設置字體、居中、背景顏色、字體顏色,別處調用單元格樣式就可以
    define_format_H1 = get_format(workbook, {'bold': True, 'font_size': 18})
    define_format_H2 = get_format(workbook, {'bold': True, 'font_size': 14})
    define_format_H1.set_border(1)
    define_format_H2.set_border(1)
    define_format_H1.set_align("center")
    define_format_H2.set_align("center")
    define_format_H2.set_bg_color("blue")
    define_format_H2.set_color("#ffffff")
    # 合併單元格
    worksheet.merge_range('A1:F1', '接口自動化測試報告', define_format_H1)
    worksheet.merge_range('A2:F2', '測試概括', define_format_H2)
    worksheet.merge_range('A3:A6', '寫啥都行,也可以不要這格', get_format_center(workbook))
    # B列單元格
    _write_center(worksheet, "B3", '項目名稱', workbook)
    _write_center(worksheet, "B4", '接口版本', workbook)
    _write_center(worksheet, "B5", '腳本語言', workbook)
    _write_center(worksheet, "B6", '測試地址', workbook)
#測試接口內容,C列單元格
    data = {"test_name": "京東萬象接口", "test_version": "v1.0.0",
            "test_pl": "Python3", "test_net": testurl}
    _write_center(worksheet, "C3", data['test_name'], workbook)
    _write_center(worksheet, "C4", data['test_version'], workbook)
    _write_center(worksheet, "C5", data['test_pl'], workbook)
    _write_center(worksheet, "C6", data['test_net'], workbook)
#D列單元格
    _write_center(worksheet, "D3", "測試用例總數", workbook)
    _write_center(worksheet, "D4", "測試用例通過數", workbook)
    _write_center(worksheet, "D5", "測試用例失敗數", workbook)
    _write_center(worksheet, "D6", "測試日期", workbook)
#E列單元格
    data1 = {"test_sum": len(TestReport),#總用例數上面調用測試結果那裏獲取
             "test_success": hpassnum,#成功用例數在下面test_detail中有計數
             "test_failed": len(TestReport) - hpassnum,
             "test_date": timenow}#時間
    _write_center(worksheet, "E3", data1['test_sum'], workbook)
    _write_center(worksheet, "E4", data1['test_success'], workbook)
    _write_center(worksheet, "E5", data1['test_failed'], workbook)
    _write_center(worksheet, "E6", data1['test_date'], workbook)
    _write_center(worksheet, "F3", "測試用例通過率", workbook)
#計算測試用例通過率,‘%’是字符,前面數字也要轉化爲字符型才能合併輸出
    worksheet.merge_range('F4:F6', str(
        (round(hpassnum / len(TestReport), 4)) * 100) + '%', get_format_center(workbook))
#調用生成餅形圖方法
    pie(workbook, worksheet)
#第二個標籤頁內容
#設置用例詳情的格式
def test_detail(worksheet):
    # 設置列寬高
    worksheet.set_column("A:A", 15)
    worksheet.set_column("B:B", 20)
    worksheet.set_column("C:C", 20)
    worksheet.set_column("D:D", 20)
    worksheet.set_column("E:E", 20)
    worksheet.set_column("F:F", 20)
    worksheet.set_column("G:G", 20)
    worksheet.set_column("H:H", 20)
    # 設置行的寬高,根據用例總數+表頭的兩行,設置這麼多行就夠了
    for hrow in range(len(TestReport) + 2):
        worksheet.set_row(hrow, 20)
#第一行測試詳情單元格設置
    worksheet.merge_range('A1:H1', '測試詳情', get_format(workbook, {'bold': True,
                                                                 'font_size': 18,
                                                                 'align': 'center',
                                                                 'valign': 'vcenter',
                                                                 'bg_color': 'blue',
                                                                 'font_color': '#ffffff'}))
#表頭設置
    _write_center(worksheet, "A2", '用例ID', workbook)
    _write_center(worksheet, "B2", '接口名稱', workbook)
    _write_center(worksheet, "C2", '接口協議', workbook)
    _write_center(worksheet, "D2", 'URL', workbook)
    _write_center(worksheet, "E2", '參數', workbook)
    _write_center(worksheet, "F2", '預期值', workbook)
    _write_center(worksheet, "G2", '實際值', workbook)
    _write_center(worksheet, "H2", '測試結果', workbook)
# 獲取測試結果被添加到測試報告裏
    data = {"info": TestReport} 
#測試報告是從最後一行往上寫的,從測試結果中取對應值,寫進單元格。測試結果樣式在TestRequest.py裏定的
    temp = len(TestReport) + 2
    global hpassnum
    for item in data["info"]:
        if item["t_result"] == "通過":
            hpassnum += 1
        else:
            pass
        _write_center(worksheet, "A" + str(temp), item["t_id"], workbook)
        _write_center(worksheet, "B" + str(temp), item["t_name"], workbook)
        _write_center(worksheet, "C" + str(temp), item["t_method"], workbook)
        _write_center(worksheet, "D" + str(temp), item["t_url"], workbook)
        _write_center(worksheet, "E" + str(temp), item["t_param"], workbook)
        _write_center(worksheet, "F" + str(temp), item["t_hope"], workbook)
        _write_center(worksheet, "G" + str(temp), item["t_actual"], workbook)
        _write_center(worksheet, "H" + str(temp), item["t_result"], workbook)
        temp = temp - 1
# 生成餅形圖,可以用代碼指定excel能生成的所有圖表
def pie(workbook, worksheet):
    chart1 = workbook.add_chart({'type': 'pie'})
    chart1.add_series({
        'name':       '接口測試統計',
#“測試總結”一定要與標籤名一致,否則不能生成餅形圖
        'categories': '=測試總結!$D$4:$D$5',
        'values':    '=測試總結!$E$4:$E$5',
#指定餅形圖的兩種顏色,兩種方法,分別是16進制標識的綠色還有直接英文寫的紅色
        'points': [
        {'fill': {'color': '#00CD00'}},
        {'fill': {'color': 'red'}},
    ],
    })
    chart1.set_title({'name': '接口測試統計'})
    chart1.set_style(10)
    worksheet.insert_chart('A9', chart1, {'x_offset': 25, 'y_offset': 10})
test_detail(worksheet2)
init(worksheet)
workbook.close()

開始調用了前面寫的多個模塊,還有寫excel的包,報告要哪些字段,都可以自己定義,一些講解都在代碼的註釋裏,如果我沒寫,可能就是我也不太理解。理論上這篇代碼和前面幾篇的代碼,直接粘下來就可以直接用,當然命名需要和我寫的命名一致,如果有報錯,只能各位自己處理一下吧。

最後說一下這代碼可能會出現的問題:正常情況下執行這段代碼,會調用前面寫的多個模塊,出個測試報告。如果出現服務器宕機的情況,就不會出現測試報告了。因爲宕機拋出的異常不是字典格式,代碼完全提不出來東西,所以沒有數據可往excel裏寫。如果有極端情況,把兩個服務器的接口想一次執行出來,結果其中一個服務器宕機了,那麼只看報告情況,可能會顯示用例全部通過,實際是隻有一個服務器接口的那部分用例通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章