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编写android截屏脚本双击运行即可
Jul 21 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python3实现的反转单链表算法示例
Mar 08 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
python列表推导式操作解析
Nov 26 Python
python获取array中指定元素的示例
Nov 26 Python
python不同系统中打开方法
Jun 23 Python
如何利用python生成MD5并去重
Dec 07 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
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
Layui事件监听的实现(表单和数据表格)
2019/10/17 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
python使用knn实现特征向量分类
2018/12/26 Python
python如何统计代码运行的时长
2019/07/24 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
python如何导入依赖包
2020/07/13 Python
python re的findall和finditer的区别详解
2020/11/15 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
思品教学工作总结
2015/08/10 职场文书
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL