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

  引言

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

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

 

 

 

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

 

 

  报告模板使用

下载后,把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, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)修改成print(sys.stderr, '\nTime 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
.....

 

  查看报告

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

 

 

  问题处理

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

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('\n')
        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, '\nTime Elapsed: %s' % (self.stopTime-self.startTime))
        return result

stderr = None # (!) real value is "<_io.TextIOWrapper name='<stderr>' mode='w' encoding='cp1252'>"

  

如果不想要,可以注释。

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

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

 

 

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

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

 

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

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

 

 

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

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

 

 

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('\n')
        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

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

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

需要注意一点:
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文件夹,并且里面是否生成了饼图:

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

 

 

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

 

  源码获取

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

 

上一篇:communic()和.stdin.write,.stdout.read或.stderr.read – python之间的区别


下一篇:unittest--生成HTML测试报告