BSTestRunner增加歷史執(zhí)行記錄展示和重試功能

之前對(duì)于用例的失敗重試,和用例的歷史測(cè)試記錄存儲(chǔ)展示做了很多的描述呢,但是都是基于各個(gè)項(xiàng)目呢,不方便使用,為了更好的使用,我們對(duì)這里進(jìn)行抽離,抽離出來(lái)一個(gè)單獨(dú)的模塊,集成到BSTestRunner中,以后我們使用BSTestRunner直接就可以使用里面的失敗重試和展示歷史記錄了。

首先呢,我們對(duì)于失敗重試做了一個(gè)簡(jiǎn)單的調(diào)整。

在BSTestRunner 增加之前的重試代碼

TestResult = unittest.TestResult
class MyResult(TestResult):
    def __init__(self, verbosity=1, trynum=1):
        # 默認(rèn)次數(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:
                # 刪除最后一個(gè)結(jié)果
                reslut = self.result.pop(-1)
                # 判斷結(jié)果,如果是錯(cuò)誤就把錯(cuò)誤的個(gè)數(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
                # 測(cè)試
                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,錯(cuò)誤次數(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

參數(shù)默認(rèn)增加了默認(rèn)參數(shù)。歷史數(shù)據(jù),我們?cè)诖a中,調(diào)整中增加了存儲(chǔ)功能,我們默認(rèn)存在txt文檔中。我們看下存儲(chǔ)和讀取的方法。

name=os.path.join(self.filepath,self.stopTime.strftime('%Y_%m_%d_%H_%M_%S')+'.txt')
with open(name,'w+') as f:
      f.write(result.success_count.__str__()+"_"+result.error_count.__str__()+"_"+result.failure_count.__str__())
      f.close()

讀取歷史執(zhí)行數(shù)據(jù)源

def   _readresult(self):

    namerun=[]
    faillist=[]
    success=[]
    error=[]
    for root,dirs,files in os.walk(self.filepath):
        for file in files:
            if file.endswith(".txt"):
                namerun.append(file.split(".")[0].split("/")[-1])
                with open(os.path.join(root,file),'r') as f:
                    reslut=f.readline().split('\n')[0].split("_")
                    success.append(reslut[0])
                    error.append(reslut[1])
                    faillist.append(reslut[2])
    return namerun,faillist,success,error

我們?cè)谡故镜臅r(shí)候使用了百度的echarts,官網(wǎng)如下。

        https://echarts.apache.org/zh/index.html

我們?cè)跍y(cè)試報(bào)告中做了展示。(代碼太長(zhǎng),我放在github上:BSTestRunner),我們寫(xiě)一段代碼演示下。

import  unittest,os
from  BSTestRunner import  BSTestRunner
BASH_DIR="history"
report_path = os.path.join(BASH_DIR,"test.html")
openone = open(report_path, 'w+')
class  Clasee(unittest.TestCase):
    def setUp(self) -> None:
        pass
    def tearDown(self) -> None:
        pass
    def testoen(self):
        self.assertEqual(1,2)
if __name__=="__main__":
    besautiful = BSTestRunner(title="報(bào)告",
                              description="測(cè)試報(bào)告",
                              stream=openone,
                              trynum=2,#重試次數(shù)
                              filepath=BASH_DIR,#根目錄
                              is_show=True)#是否展示。
    test_suit = unittest.TestSuite()
    test_suit.addTests([Clasee("testoen")])
    besautiful.run(test_suit)

我們看下結(jié)果。

[圖片上傳失敗...(image-dd89c8-1628027710674)]

    看下測(cè)試報(bào)告。

[圖片上傳失敗...(image-90efcf-1628027710674)]

    完成了我們之前的設(shè)想,單獨(dú)抽離到了git項(xiàng)目中,我貼下倉(cāng)庫(kù)的鏈接。


    最后代碼放在了github。
https://github.com/liwanlei/BSTestRunner_new
    如果訪問(wèn)過(guò)慢,可以訪問(wèn)碼云
https://gitee.com/liwanlei/BSTestRunner_new
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容