目录
1、引言2、报告模块使用
3、问题处理
4、源码获取
引言
在做接口自动化测试的时候,使用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
给报告添加饼图:
方法我写在以前的文章中:
这是鼠标放到饼图上的效果:
需要注意一点:
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文件夹,并且里面是否生成了饼图:
不存在的话,证明饼图生成失败了。