unittest系統(tǒng)(八)一文搞定unittest重試功能

在前面的介紹中陈症,我們對unittest進行了分享介紹蔼水,那么在實際的應(yīng)用中,因為客觀原因需要對失敗录肯,錯誤的測試用例進行重試趴腋,所以呢,現(xiàn)有的unittest的框架無法滿足,那么我們可以去改造下是否能夠滿足呢优炬。本文帶領(lǐng)大家去剖析如何改寫颁井?

首先呢,我們?nèi)ピ囍フ蚁麓┢剩覀冞\行時在BSTestRunner蚤蔓、TextTestRunner或者main,都可以執(zhí)行用例糊余,那么我們可以看下這些類或者方法里面如何實現(xiàn)的秀又。

BSTestRunner調(diào)用方式如下

image.png

TextTestRunner的方法是,

image.png

使用main方法最后的調(diào)用也是這個函數(shù)贬芥。詳細的我們可以看下吐辙,首先調(diào)用這個函數(shù),然后在看實際的調(diào)用.

image.png

最后的調(diào)用也是這個函數(shù)

image.png

所以我們就要在里面的方法去查找適合我們使用的方法蘸劈。

在注釋中昏苏,我們可以發(fā)現(xiàn)在stopTest的方法中可以對其進行改寫。
def stopTest(self, test):        
    """Called when the given test has been run"""        
    self._restoreStdout()        
    self._mirrorOutput = False

那么我們應(yīng)該如何改寫呢威沫,我們梳理下我們的思路贤惯。

  • 1.傳遞重試次數(shù),默認不需要重試
  • 2.在用例執(zhí)行的錯誤棒掠,標(biāo)記為需要重試
  • 3.在該條用例執(zhí)行完畢后孵构,我們判斷是否需要重試,重試次數(shù)是否滿足
  • 4.如果需要重試烟很,則保存最新的從測試結(jié)果颈墅。

那么我們開始按照上面的思路進行改造。

代碼如下

import  sys,copy
from io import StringIO as StringIO
TestResult = unittest.TestResult
class MyResult(TestResult):
    def __init__(self, verbosity=1, trynum=0):
        #默認次數(shù)是0
        TestResult.__init__(self)
        self.outputBuffer = StringIO()
        self.stdout0 = None
        self.stderr0 = None
        self.success_count = 0
        self.failure_count = 0
        self.error_count = 0
        self.verbosity = verbosity
        self.trynnum = trynum
        self.result = []
        self.trys=0#
        self.istry=False

    def startTest(self, test):
        TestResult.startTest(self, test)
        self.stdout0 = sys.stdout
        self.stderr0 = sys.stderr

    def complete_output(self):
        if self.stdout0:
            sys.stdout = self.stdout0
            sys.stderr = self.stderr0
            self.stdout0 = None
            self.stderr0 = None
        return self.outputBuffer.getvalue()

    def stopTest(self, test):
        #判斷是否要重試
        if self.istry is True :
            #如果執(zhí)行的次數(shù)小于重試的次數(shù) 就重試
            if self.trys < self.trynnum :
                #刪除最后一個結(jié)果
                reslut = self.result.pop(-1)
                #判斷結(jié)果雾袱,如果是錯誤就把錯誤的個數(shù)減掉
                #如果是失敗恤筛,就把失敗的次數(shù)減掉
                if reslut[0] == 1:
                    self.failure_count -= 1
                else:
                    self.error_count -= 1
                sys.stderr.write('{}:用例正在重試中。芹橡。毒坛。' .format(test.id())+ '\n')
                #深copy用例
                test = copy.copy(test)
                #重試次數(shù)增加+1
                self.trys += 1
                #測試
                test(self)
            else:
                self.istry=False
                self.trys =0
        self.complete_output()

    def addSuccess(self, test):
        #成功就不要重試
        self.istry = False
        self.success_count += 1
        TestResult.addSuccess(self, test)
        output = self.complete_output()
        self.result.append((0, test, output, ''))
        if self.verbosity > 1:
            sys.stderr.write('ok ')
            sys.stderr.write(str(test))
            sys.stderr.write('\n')
        else:
            sys.stderr.write('.')

    def addError(self, test, err):
        #重試+1,錯誤次數(shù)+1
        self.istry = True
        self.error_count += 1
        TestResult.addError(self, test, err)
        _, _exc_str = self.errors[-1]
        output = self.complete_output()
        self.result.append((2, test, output, _exc_str))
        if self.verbosity > 1:
            sys.stderr.write('E  ')
            sys.stderr.write(str(test))
            sys.stderr.write('\n')
        else:
            sys.stderr.write('E')

    def addFailure(self, test, err):
        self.istry = True
        TestResult.startTestRun(self)
        self.failure_count += 1
        TestResult.addFailure(self, test, err)
        _, _exc_str = self.failures[-1]
        output = self.complete_output()
        self.result.append((1, test, output, _exc_str))
        if self.verbosity > 1:
            sys.stderr.write('F  ')
            sys.stderr.write(str(test))
            sys.stderr.write('\n')
        else:
            sys.stderr.write('F')

    def stop(self) -> None:
        pass

這樣改造完畢了僻族,我們可以去試試

if __name__ == "__main__":   
    suitone=suite()   
    rse=MyResult(trynum=3)    
    suitone.run(rse)

執(zhí)行的結(jié)果如下:

image.png

目前改造滿足我們重試用例的需求粘驰,改造完畢。

上面只是一個簡單的改造述么,滿足了對于失敗的測試用例的重試蝌数,其實很簡單,我們有了需求度秘,去根據(jù)我們的需求去查找需要改造的代碼即可顶伞,我們直接繼承原來的類饵撑,對需要修改的地方 進行修改,已滿足我們的需求唆貌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滑潘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锨咙,更是在濱河造成了極大的恐慌语卤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪刀,死亡現(xiàn)場離奇詭異粹舵,居然都是意外死亡,警方通過查閱死者的電腦和手機骂倘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門眼滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人历涝,你說我怎么就攤上這事诅需。” “怎么了荧库?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵堰塌,是天一觀的道長。 經(jīng)常有香客問我分衫,道長蔫仙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任丐箩,我火速辦了婚禮,結(jié)果婚禮上恤煞,老公的妹妹穿的比我還像新娘屎勘。我一直安慰自己,他們只是感情好居扒,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布概漱。 她就那樣靜靜地躺著,像睡著了一般喜喂。 火紅的嫁衣襯著肌膚如雪瓤摧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天玉吁,我揣著相機與錄音照弥,去河邊找鬼。 笑死进副,一個胖子當(dāng)著我的面吹牛这揣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼给赞,長吁一口氣:“原來是場噩夢啊……” “哼机打!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起片迅,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤残邀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柑蛇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥挣,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年唯蝶,在試婚紗的時候發(fā)現(xiàn)自己被綠了九秀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡粘我,死狀恐怖鼓蜒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情征字,我是刑警寧澤都弹,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站匙姜,受9級特大地震影響畅厢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氮昧,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一框杜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袖肥,春花似錦咪辱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寸癌,卻和暖如春专筷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒸苇。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工磷蛹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人填渠。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓弦聂,卻偏偏與公主長得像鸟辅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莺葫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容