我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。
上一篇我们讨论了unittest中discover 的构建,可以组织测试更多测试用例。
本篇文章我们接着讲。如何生成HTML报告,提高我们测试报告的可读性。
1、引入HTML报告
我们先看一下之前的测试结果:
之前的测试结果只是展示测试了3条用例,测试通过。
这个让测试人员来看还凑合,但是若是向领导展示或者其它不熟悉测试的同事来看就不太能看懂,也不太美观。这就需要HTMLTestRunner 来生成HTML报告。
2、HTMLTestRunner 简述
HTMLTestRunner 是python 标准库unittest 单元测试框架的一个扩展,它生成方便使用的HTML报告。
这个扩展使用起来很简单,只要一个HTMLTestRunner.py 文件,下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
安装也非常简单,将HTMLTestRunner.py 放到...\Python37\Lib 目录下,
这里的系统时windows。Linux 也是类似的位置。
注意:若是下载的HTMLTestRunner.py针对python2写的,python3需要适当更改其内容:
问题一:No module named StringIO
原因:python 3 中 没有 StringIO 这个模块。这里我们需要使用io 这个模块来代替。
解决方法:
第94行引入的名称要改,从 import StringIO 改成import io。
相应的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()
问题二:AttributeError: 'dict' object has no attribute 'has_key'
原因:python 3 字典类型的object 已经不支持 has_key函数,我们需要使用in 来进行遍历。
解决方法:
定位到642行,if not rmap.has_key(cls): 需要换成 if not cls in rmap:
问题三:'str' object has no attribute 'decode'
原因:python3 里面对字符的操作中,decode已经拿掉了。
解决方法:
定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。
另外766还有类似的uo = o.decode('latin-1'),改成 uo=o ;
问题四 :TypeError: can't concat bytes to str
原因:定位一下,报在了778行的内容escape(uo+ue) 。这是因为我们上面给uo赋值的时候,走的是else流程,uo被赋值的是bytes类型的值。 而bytes类型不能直接转化为str类型。所以我们需要在前面给uo赋值的时候先将bytes类型转换为 str类型。
解决方法:
修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。
另外 774还有类似的 ue = e, 改成 ue = e.decode('utf-8')。
问题五:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'
原因: python3 不支持 print >> sys.stderr 这种写法,这里定义输出流的话,采用print("This is print str",file=sys.stderr) 这种方式。
解决方法:
定位到631行,把print的语句修改掉,原来是print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print('\nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)
问题六:TypeError: 'str' does not support the buffer interface
原因:定位一下,问题出在118行,这里s是str类型,我们需要把传过来的s转化为bytes类型。
解决方法:
定位到118行,把 self.fp.write(s) 修改为 self.fp.write(bytes(s,'UTF-8')) 即可。
举一个例子,如下图的修改后:
3、编写代码生成HTML报告
# coding=utf-8 import unittest from HTMLTestRunner import HTMLTestRunner #导入 HTMLTestRunner 类 import time #定义测试用例集的目录 test_dir = './' report_dir = './report' #测试报告地址 discover = unittest.defaultTestLoader.discover(test_dir,pattern="test_*.py")#所有要执行的文件 if __name__ == '__main__': now = time.strftime("%Y-%m-%d %H_%M_%S") #当前时间,格式是年月日时分秒 file_name = report_dir+ '/' + now + 'result.html' #报告名称,加上当前时间避免重复 fp = open(file_name,'wb') #打开报告文件,读写权限 runner = HTMLTestRunner(stream=fp,title="Swag Labs 网站测试报告",description="用例测试情况:")#HTML报告设置 runner.run(discover) #执行测试案例 fp.close() #关闭报告文件
请参考以上代码练习,执行结果参考:
是不是明显比之前的报告提高了档次。
今天就讲到这里了。
每天进步一点点,加油!