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之不要红头文件(1)
Sep 28 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
python 调用HBase的简单实例
Dec 18 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
Django 实现下载文件功能的示例
Mar 06 Python
python查看数据类型的方法
Oct 12 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
Python处理PDF与CDF实例
Feb 26 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
python中数组和列表的简单实例
Mar 25 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+MySQL5.0中文乱码解决方法
2006/11/20 PHP
给php新手谈谈我的学习心得
2007/02/25 PHP
PHP微信红包API接口
2015/12/05 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
基于BootstrapValidator的Form表单验证(24)
2016/12/12 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
Vue核心概念Getter的使用方法
2019/01/18 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
Python绘制组合图的示例
2020/09/18 Python
Python基于execjs运行js过程解析
2020/11/27 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
实习护理工作自我评价
2013/09/25 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
护士求职信
2014/07/05 职场文书
2014年团支部工作总结
2014/11/17 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
安全知识竞赛主持词
2015/06/30 职场文书