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 相关文章推荐
python3.3使用tkinter开发猜数字游戏示例
Mar 14 Python
Python中subprocess模块用法实例详解
May 20 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
python实现简易版计算器
Jun 22 Python
Python定时任务sched模块用法示例
Jul 16 Python
在Python文件中指定Python解释器的方法
Feb 18 Python
Django用户认证系统 User对象解析
Aug 02 Python
Django CBV模型源码运行流程详解
Aug 17 Python
浅谈Python数学建模之固定费用问题
Jun 23 Python
python随机打印成绩排名表
Jun 23 Python
python多线程方法详解
Jan 18 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 保留字列表
2012/10/04 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
yii2实现 "上一篇,下一篇" 功能的代码实例
2017/02/04 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
详解python 发送邮件实例代码
2016/12/22 Python
python基础教程项目二之画幅好画
2018/04/02 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
pytorch之添加BN的实现
2020/01/06 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
培训专员岗位职责
2014/02/26 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
根叔历年演讲稿
2014/05/20 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL