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, '\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 .....
查看报告
问题处理
细心的人会发现控制台输出的信息到底是什么?从哪里输出的,很多人做自动化测试,可能不太关注,也不怎么明白它的含义。
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为啥没有日志信息?
如:
原因很简单,模板是原生态支持py2的,但是程序是py3跑的,无法正常显示print信息,需要手动改一下。
删除这段代码,加上: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
修改后再运行程序,打开报告查看:
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
这是鼠标放到饼图上的效果:
需要注意一点:
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,关注博客园,微信公众号,学习你不曾遇到的问题。
作者:全栈测试开发日记
出处:https://www.cnblogs.com/liudinglong/
csdn:https://blog.csdn.net/liudinglong1989/
微信公众号:全栈测试开发日记
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。