• unittest框架下的HTMLTestRunner报告模块使用及优化


      引言

      在做接口自动化测试的时候,使用python单元测试框架unittest下HTMLTestRunner报告模板,可以很好的展示我们测试结果的数据。

    官方的标准版模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html
    如图:

      报告模板使用

    下载后,把HTMLTestRunner.py 文件复制到Python 安装路径下的lib文件夹中即可。
    
    在python3中用HTMLTestRunner.py报importError“:No module named 'StringIO'解决办法
    
    原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法。
    
    修改内容:
    
    第94行,将import StringIO修改成import io
    
    第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO()
    
    第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:
    
    第631行,将print >> sys.stderr, '
    Time Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '
    Time Elapsed: %s' % (self.stopTime-self.startTime))
    
    第766行,将uo = o.decode('latin-1')修改成uo = e
    
    第775行,将ue = e.decode('latin-1')修改成ue = e
    

      运行结果

    <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> 
    Time Elapsed: 0:00:00.040107
    .....
    

      查看报告

      问题处理

    细心的人会发现控制台输出的信息到底是什么?从哪里输出的,很多人做自动化测试,可能不太关注,也不怎么明白它的含义。

    1、控制台的信息来自哪里?
    答:来自HTML报告模块。

    2、为啥会有五个‘.’点?
    答:1个点就是一条用例运行的结果,表示:成功,如果失败了,会显示F。如果有错误,就会显示E。具体函数是:

        def addSuccess(self, test):
            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('.')

    3、为啥会输出“<_io.TextIOWrapper name=’’ mode=‘w’ encoding=‘UTF-8’> ”?
    答:运行报告的时候,会调run函数,而该函数打印了这些信息。

        def run(self, test):
            "Run the given test case or test suite."
            result = _TestResult(self.verbosity)
            test(result)
            self.stopTime = datetime.datetime.now()
            self.generateReport(test, result)
            print(sys.stderr, '
    Time Elapsed: %s' % (self.stopTime-self.startTime))
            return result
    
    stderr = None # (!) real value is "<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp1252'>"
    

      

    如果不想要,可以注释。

    4、报告中case为啥没有日志信息?
    如:

    原因很简单,模板是原生态支持py2的,但是程序是py3跑的,无法正常显示print信息,需要手动改一下。

    删除这段代码,加上:uo = o
    或者直接将e改成o,不管错误还是正确,都会输出o。

     if isinstance(o,str):
                # TODO: some problem with 'string_escape': it escape 
     and mess up formating
                # uo = unicode(o.encode('string_escape'))
                uo = o
            else:
                uo = o
    

    修改后再运行程序,打开报告查看:

    5、用数字表示用例数:
    修改代码:

        def addSuccess(self, test):
            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('.'+str(self.success_count))
    

    再运行程序:

    Time Elapsed: 0:00:00.039104
    .1.2.3.4.5
    

      

      添加饼图

    给报告添加饼图:
    方法我写在以前的文章中:https://blog.csdn.net/liudinglong1989/article/details/89477054

    这是鼠标放到饼图上的效果:

    需要注意一点:
    1、HTMLTestRunner模板文件需要放在common文件夹下,common需要建在项目根目录下。如果饼图显示不出来,请查看代码:

       plt.legend()
            #创建饼图存放路径
            cur_path = os.path.dirname(os.path.realpath(__file__))
            log_path = os.path.join(os.path.dirname(cur_path), 'logs')
            
            # 如果不存在这个logs文件夹,就自动创建一个
            if not os.path.exists(log_path): os.mkdir(log_path)
    
            imgPath = os.path.join(log_path, "pie%s.png"%time.strftime('%Y_%m_%d_%H_%M_%S'))
            plt.savefig(imgPath)
    

    查看是否存在logs文件夹,并且里面是否生成了饼图:

    PS:不存在的话,证明饼图生成失败了。

      源码获取

    以上所有问题及源码可以加测试开发交流QQ群获取:696400122,关注博客园,微信公众号,学习你不曾遇到的问题。

  • 相关阅读:
    占位博客
    占位博客
    占位博客
    占位
    占位
    占位
    占位
    占位
    python字典设置初始值setdefault()与get()
    自然语言处理如何入门
  • 原文地址:https://www.cnblogs.com/liudinglong/p/12346824.html
Copyright © 2020-2023  润新知