python使用 HTMLTestRunner.py生成测试报告


Posted in Python onOctober 20, 2017

本文介绍了python使用 HTMLTestRunner.py生成测试报告 ,分享给大家,具体如下:

HTMLTestRunner.py python 2版本

下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

使用时,先建立一个”PyDev Package“,将下载下来的HTMLTestRunner.py文件拷贝在该目录下。

例子:testcase5_dynamic.py

import unittest
from dev.widget import Widget

class WidgetTestCase(unittest.TestCase):
 def setUp(self):
  self.widget=Widget()
  
 def tearDown(self):
  self.widget.dispose()
  self.widget=None
  
 def testSize(self):
  self.assertEqual(self.widget.getSize(), (40,40), "Wrong")
  
 def testResize(self):
  self.widget.resize(100, 100)
  self.assertEqual(self.widget.getSize(), (100,100), "Wrong")

html_report.py:

#coding:utf-8

from lib import HTMLTestRunner
import unittest
from testcase5_dynamic import WidgetTestCase

if __name__=='__main__':
 suite=unittest.makeSuite(WidgetTestCase)
 filename='D:\\myreport.html'
 fp=file(filename,'wb')
 runner=HTMLTestRunner.HTMLTestRunner(fp,title=u'my unit test',description=u'This is a report test')
 runner.run(suite)

Run的时候,需要使用Python Run,使用Python unit-test跑测试生成不了myreport.html,目前还不知道为什么。

有时候,不会立即生成D:\\myreport.html,我们可以自己先建立一个空的myreport.html,这样再运行之后打开就会看到报告内容。

python使用 HTMLTestRunner.py生成测试报告 

HTMLTestRunner.py 的python3 版本

由于 HTMLTestRunner.py 原本就是python2版本,目前还没找到python3版本,所以需要我们自己修改 HTMLTestRunner.py 文件。

1. 修改的地方

问题一: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')) 即可。

2. 保存

修改后对HTMLTestRunner.py 保存一下。

3. 调用语句更改

python3 里面打开文件使用 open,不要再去用file了。

即 fp = file(filename,'wb')替换成 fp = open(filename,'wb');

关闭该文件可用fp.close()

备注: 改动之后,中文也不会乱码。 

HTMLTestRunner.py 的使用备注

1. 问题: 执行测试用例的过程中,不会打印任何东西,导致上个厕所或第二天回来时,根本不知道执行到哪了,或者执行多少测试用例了。

解决思路: 每次执行一个测试用例时,就打印该测试用例的名称。

解决方案: 调用HTMLTestRunner时,定义 verbosity 为大于1的整数,比如说 2:

runner=HTMLTestRunner.HTMLTestRunner(fp,title="xxxx",description="xxx",verbosity=2)

在控制台console 就可以看到每执行一条用例,就会有如下输出:

E test (testcases.login.testcase1.MyTest)
ok test (testcases.login.testcase2.MyTest)
F test (testcases.login.testcase3.MyTest)

2. HTMLTestRunner 脚本阅读。

class OutputRedirector(object)
# 将输出进行重定向

class Template_mixin(object)
# 定义生成HTML结果文件所需要的模板。
# 如果我们想改变HTML的格式等待,可以在这里进行改动

class _TestResult(TestResult)
# 定义继承自 unittest.TestResult 的 类。
# 这里重写了 unittest.TestResult 的多个方法,比如 startTest(self, test) 等等

class HTMLTestRunner(Template_mixin)
# 这里可以说是使用 HTMLTestRunner.py 的入口。定义了多个我们可以看到的方法,比如 run(self, test)

class TestProgram(unittest.TestProgram)
# 这里继承自 unittest.TestProgram 类,重写了 runTests 方法。
# 用于命令行执行测试

3. 缺点:使用HTMLTestRunner的执行测试用例的过程中,如果中间中断执行,则已经执行完的用例结果也不会打印到html文件。

目前我这边是自己编写脚本生成html来代替使用 HTMLTestRunner ,感觉 HTMLTestRunner 应该没有每执行一条用例就讲结果写入到html结果文件的方法。

测试案例:
1.登录百度云
2.进入“立即注册百度账号”网页
3.进入”会员中心”网页
4.生成测试报告的文件名为:2015-01-02result.html。

测试脚本:

#coding=utf-8  #防止中文乱码
from selenium import webdriver
from selenium.webdriver.common.by import By
#加载键盘使用的模块
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException

#加载unittest模块
import unittest 
import time
import re
#加载HTMLTestRunner,用于生成HTMLreuslt
import HTMLTestRunner

class BaiduYun(unittest.TestCase):
 def setUp(self):
  self.browser=webdriver.Chrome()
  self.browser.implicitly_wait(30)
  self.base_url="http://yun.baidu.com"
  self.verficationErrors=[]
  self.accept_next_alert=True
 def Login(self):
  browser=self.browser
  browser.get(self.base_url+'/')
  u"""百度云登录"""
  browser.find_element_by_name("userName").clear()   
  username=browser.find_element_by_name("userName")    
  username.send_keys("alu***")
  username.send_keys(Keys.TAB)
  time.sleep(2)
  password=browser.find_element_by_name("password")
  password.send_keys("***")
  password.send_keys(Keys.ENTER)
  time.sleep(3)
  browser.close()
 def Register(self):
  browser=self.browser
  browser.get(self.base_url+'/')
  u"""立即注册百度账号"""
  browser.find_element_by_class_name("link-create").click()
  time.sleep(2)
  browser.close()
 def Link(self):
  browser=self.browser
  browser.get(self.base_url+'/')
  u"""会员中心"""
  browser.find_element_by_link_text("会员中心").click()
  time.sleep(2)
  browser.close()
 def tearDown(self):
  self.browser.quit()
  self.assertEqual([],self.verficationErrors) 
if __name__=="__main__":
 #unittest.main()
 testunit=unittest.TestSuite()
 #将测试用例加入到测试容器中
 testunit.addTest(BaiduYun("Login"))
 testunit.addTest(BaiduYun("Register"))
 testunit.addTest(BaiduYun("Link"))
 #获取当前时间,这样便于下面的使用。
 now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time())) 
 #打开一个文件,将result写入此file中
 fp=open("result"+now+".html",'wb')
 runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='test result',description=u'result:')
 runner.run(testunit) 
 fp.close()

F5,运行,就这样得到了test result

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作摄像头截图实现远程监控的例子
Mar 25 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python入门教程之运算符与控制流
Aug 17 Python
遗传算法之Python实现代码
Oct 10 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
django基于restframework的CBV封装详解
Aug 08 Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 29 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 #Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 #Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 #Python
python虚拟环境的安装配置图文教程
Oct 20 #Python
Python序列化基础知识(json/pickle)
Oct 19 #Python
Django ORM框架的定时任务如何使用详解
Oct 19 #Python
Python 2.x如何设置命令执行的超时时间实例
Oct 19 #Python
You might like
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
PHP加密解密类实例分析
2015/04/20 PHP
分享10段PHP常用代码
2015/11/11 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
全面了解JavaScript对象进阶
2016/07/19 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
如何解决vue在ios微信"复制链接"功能问题
2020/03/26 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
艺术学院毕业生自我评价
2014/03/02 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
暑期政治学习心得体会
2014/09/02 职场文书
统计工作个人总结
2015/03/03 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS