前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BSTestRunner增加历史执行记录展示和重试功能

BSTestRunner增加历史执行记录展示和重试功能

作者头像
雷子
发布2021-08-25 10:06:53
4040
发布2021-08-25 10:06:53
举报
正文

在之前的几篇文章中,Appium系列(四十)测试报告支持展示测试用例执行历史记录unittest系统(八)一文搞定unittest重试功能Appium系列(三十一)增加失败重试功能unittest系统(七)产生漂亮的测试报告等几篇文章呢,对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中,以后我们使用BSTestRunner直接就可以使用里面的失败重试和展示历史记录了。

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

代码语言:javascript
复制
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()) + '\n')
                # 深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('\n')
        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('\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

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

代码语言:javascript
复制
#保存
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()
代码语言:javascript
复制
#读取
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
代码语言:javascript
复制

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

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

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

代码语言:javascript
复制
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。

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

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

代码语言:javascript
复制
https://gitee.com/liwanlei/BSTestRunner_new

欢迎大家使用,有问题或者疑问,可以一起探讨,后续将会持续优化。

后记

发现问题,解决问题。遇到问题,慢慢解决问题即可。

欢迎关注雷子说测试开发,后续将会持续为大家分享更多的技术知识

如果你有问题可以留言或者加我微信:952943386。2021,一起牛转钱坤,一起牛逼。

如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档