如何自己實現乙個HTMLRunner

2022-04-02 23:25:52 字數 2167 閱讀 3013

htmlrunner是模仿unittest自帶的texttestrunner()實現的,我們先來看看texttestrunner()的執行流程。

import unittest

suite = unittest.defaulttestloader.discover("./")

with open("report.txt", "w") as f: # 將執行結果儲存為txt檔案

unittest.texttestrunner().run(suite)

texttestrunner內部實現了乙個texttestresult(繼承自unittest.testresult類)來記錄測試結果

texttestrunner().run()實際呼叫suite(result)suite.run(result)(result用來記錄結果)

suite.run(result)會遍歷suite中的用例,依次呼叫case(result)case.run(result)

case.run(result)時,首先會呼叫result.testrun+=1然後執行用例方法testmethod(), 如果用例失敗、出錯、跳過則用例會分別呼叫result.addsuccess(),result.addfailure()等方法,在對應的result.failures,result.errors列表中新增用例資訊,預設成功用例result中不處理

執行完返回result(測試結果物件)

unittest.texttestrunner和網上的htmlrunner都是基於stream流去寫的檔案,每執行一條用例,把對應的結果和資訊寫到流中,最後輸出成檔案,這種方法需要很多的細節控制,比較複雜。

我們可以採用解析執行完返回result結果,通過jinjia2模板引擎渲染,將資料渲染到模板裡,形成報告檔案。

jinjia2是乙個三方包,可以將模板**中的}等佔位符將變數值渲染進去,支援迴圈和if判斷。安裝方法pip install jinjia2

首先我們要寫個模板

tpl = '''

lang="en">

>

charset="utf-8">

>}>

>

>

美化格式,增加執行統計資訊

import time

import unittest

from jinja2 import template

tpl = '''

="en">

>

="utf-8">

>}

="stylesheet" href="">

>

class="container">

class="pt-4">測試報告

>測試報告描述資訊

>執行: } 通過: } 失敗: } 出錯: } 跳過: }

class="pb-2">執行時間: }s

class="table table-striped">

>>>用例名>狀態>執行資訊

>

}>}>}

'''class result(unittest.testresult):

def __init__(self):

super().__init__()

self.success =

self.cases =

def addsuccess(self, test):

def adderror(self, test, exec_info):

"exec_info": self._exc_info_to_string(exec_info, test)

.replace("\n", "

")})

def addfailure(self, test, exec_info):

自己實現乙個Redux。

redux是乙個用於狀態管理的js框架,是flux架構的一種實現 如圖 reducer 為乙個使用者自定義的函式,在store分發 dispacth action時提供處理方法去更新狀態樹中的狀態。應該為乙個純函式。action 為乙個使用者自定義的物件,裡面包含乙個type屬性,標識乙個動作型別。...

如何自己實現乙個scrapy框架 專案實戰(八)

from scrapy plus.core.spider import spider from scrapy plus.htttp.request import request class tencentspider spider name tencent start urls def parse ...

如何自己寫乙個日曆

在很多 都有自己的乙個日曆工具,有些看起來挺酷的,肯定有很多人想學.但在這裡我不是要寫乙個,而是給出它的設計過程,即它的靈魂.第一步 首先我們要選擇要顯示的年份和月份.第二步 獲得這個月的最大天數 參照前面一篇文章 第三步 建立乙個日期物件,這個日期物件為這個月的第一天.第四步 得到這個日期物件的星...