zoukankan      html  css  js  c++  java
  • BSTestRunner增加历史执行记录展示和重试功能

    之前对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中,以后我们使用BSTestRunner直接就可以使用里面的失败重试和展示历史记录了。

    首先呢,我们对于失败重试做了一个简单的调整。

    在BSTestRunner 增加之前的重试代码

    TestResult = unittest.TestResult
    class MyResult(TestResult):
        def __init__(self, verbosity=1, trynum=1):
            # 默认次数是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:
                # 如果执行的次数小于重试的次数 就重试
                if self.trys < self.trynnum:
                    # 删除最后一个结果
                    reslut = self.result.pop(-1)
                    # 判断结果,如果是错误就把错误的个数减掉
                    # 如果是失败,就把失败的次数减掉
                    if reslut[0] == 1:
                        self.failure_count -= 1
                    else:
                        self.error_count -= 1
                    sys.stderr.write('{}:用例正在重试中。。。'.format(test.id()) + '
    ')
                    # 深copy用例
                    test = copy.copy(test)
                    # 重试次数增加+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('
    ')
            else:
                sys.stderr.write('.')
    
        def addError(self, test, err):
            # 重试+1,错误次数+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('
    ')
            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('
    ')
            else:
                sys.stderr.write('F')
    
        def stop(self) -> None:
            pass
    

      

    参数默认增加了默认参数。历史数据,我们在代码中,调整中增加了存储功能,我们默认存在txt文档中。我们看下存储和读取的方法。

    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()
    

     

    读取历史执行数据源

    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('
    ')[0].split("_")
                        success.append(reslut[0])
                        error.append(reslut[1])
                        faillist.append(reslut[2])
        return namerun,faillist,success,error

    我们在展示的时候使用了百度的echarts,官网如下。

                echarts.apache.org/zh/index.ht…

    我们在测试报告中做了展示。(代码太长,我放在github上:BSTestRunner),我们写一段代码演示下。

    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="报告",
                                  description="测试报告",
                                  stream=openone,
                                  trynum=2,#重试次数
                                  filepath=BASH_DIR,#根目录
                                  is_show=True)#是否展示。
        test_suit = unittest.TestSuite()
        test_suit.addTests([Clasee("testoen")])
        besautiful.run(test_suit)

    我们看下结果。

            

    图片

            看下测试报告。

    图片

    完成了我们之前的设想,单独抽离到了git项目中,我贴下仓库的链接。

            最后代码放在了github。

    https://github.com/liwanlei/BSTestRunner_new
    复制代码

            如果访问过慢,可以访问码云

    https://gitee.com/liwanlei/BSTestRunner_new

    欢迎关注我的个人公众号



  • 相关阅读:
    01.网页学习阶段、整站分析、规划
    书签搬运
    如何判断两个链表相交及找到第一个相交点
    Windows平台使用git bash管理github中的工程
    二级指针的操作
    结构体的内存对齐
    大端和小端
    剑指Offer——面试题26:复杂链表的复制
    使用editcap命令将ERF格式转换为pcap格式
    如何在STL的map中使用结构体作为键值
  • 原文地址:https://www.cnblogs.com/leiziv5/p/15111013.html
Copyright © 2011-2022 走看看