使用nose框架在测试WEB UI自动化时,使用了第三方插件nose-html-reporting,来生成HTML报告,nose-html-reporting具体使用参见管网https://pypi.python.org/pypi/nose-html-reporting

但在真实使用测试时,经常会将错误截图,但nose-html-reporting只显示错误日志,不太直观,怎么将错误截图也加入到HMTL报告中呢,google了一把也没有答案。那就自己动手吧。

一、首先看看原始的报告,如下

二、需求

我们加一列在失败或错误时,有图片链接,在成功时没有。

解决思路:从截图存储的文件夹中,遍历与测试名称一致的文件,如果有,则显示链接,没有则空。

三、实现

先看看nose_html_reporting插件怎么实现输出HTML的

安装好插件后,查看对应的目录,只有__init__.py和template/report.html、template/report2.jinja2几个文件

在查看__int__.py文件后,从下面两段代码中,我们可以知道,html是通过report2.jinja2模板生成的

parser.add_option(
'--html-report-template', action='store',
dest='html_template', metavar="FILE",
default=env.get('NOSE_HTML_TEMPLATE_FILE',
os.path.join(os.path.dirname(__file__), "templates", "report2.jinja2")),
help="Path to html template file in with jinja2 format."
"Default is report.html in the lib sources"
"[NOSE_HTML_TEMPLATE_FILE]") ...... self.stats['total'] = sum(self.stats.values())
for group in self.report_data.values():
group.stats['total'] = sum(group.stats.values())
self.report_file.write(self.jinja.get_template(os.path.basename(self.report_template_filename)).render(
report=self.report_data,
stats=self.stats,
rawoutput=self._format_output(self.complete_global_output())
))

 1、修改report2.jinja2模版,加入可以显示链接的一列

我们在time后面加一列,用于显示错误图片链接,红色行。

<tr id='{{ class + test.name }}' class='testcase'>
<td class="{{ test_status.lower() }}Case">
{{ test.name }}
{% if test.shortDescription %}
<div class="shortDescription">
{{ test.shortDescription }}
</div>
{% endif %}
</td>
<td>{{ test.time }}</td>
<td><p><a href="{{test.dir}}\{{test.snap}}">{{ test.snap }}</a></td>
<td colspan='' align='center'>
<!--css div popup start-->

2、修改__init__.py文件,传入截图存储文件夹参数及处理图片链接参数

加入截图文件夹options参数

def options(self, parser, env):
"""Sets additional command line options."""
Plugin.options(self, parser, env)
parser.add_option(
'--html-report', action='store',
dest='html_file', metavar="FILE",
default=env.get('NOSE_HTML_FILE', 'nosetests.html'),
help="Path to html file to store the report in. "
"Default is nosetests.html in the working directory "
"[NOSE_HTML_FILE]")
parser.add_option(
'--html-report-template', action='store',
dest='html_template', metavar="FILE",
default=env.get('NOSE_HTML_TEMPLATE_FILE',
os.path.join(os.path.dirname(__file__), "templates", "report2.jinja2")),
help="Path to html template file in with jinja2 format."
"Default is report.html in the lib sources"
"[NOSE_HTML_TEMPLATE_FILE]") parser.add_option(
'--snap-dir', action='store',
dest='snap_dir', metavar="FILE",
default="c:\\report",
help="snap-dir.")
def configure(self, options, config):
"""Configures the xunit plugin."""
Plugin.configure(self, options, config)
self.config = config
if self.enabled:
self.jinja = Environment(
loader=FileSystemLoader(os.path.dirname(options.html_template)),
trim_blocks=True,
lstrip_blocks=True
)
self.stats = {'errors': 0, 'failures': 0, 'passes': 0, 'skipped': 0}
self.report_data = defaultdict(Group)
htmlfile_dirname = os.path.dirname(options.html_file)
if not os.path.exists(os.path.abspath(htmlfile_dirname)):
os.makedirs(htmlfile_dirname)
self.report_file = codecs.open(options.html_file, 'w', self.encoding, 'replace')
self.report_template_filename = options.html_template
self.snap_dir = options.snap_dir

修改错误和fail时,加入图片文件名

def addError(self, test, err, capt=None):
"""Add error output to Xunit report.
"""
exc_type, exc_val, tb = err
tb = ''.join(traceback.format_exception(
exc_type,
exc_val if isinstance(exc_val, exc_type) else exc_type(exc_val),
tb
))
name = id_split(test.id())
group = self.report_data[name[0]]
if issubclass(err[0], SkipTest):
type = 'skipped'
self.stats['skipped'] += 1
group.stats['skipped'] += 1
else:
type = 'error'
self.stats['errors'] += 1
group.stats['errors'] += 1
group.tests.append({
'name': name[-1],
'failed': True,
'type': type,
'dir':self.snap_dir,
'errtype': nice_classname(err[0]),
'message': exc_message(err),
'tb': self._format_output(tb),
'output': self._format_output(self.complete_test_output(exc_message(err), tb)),
'shortDescription': test.shortDescription(),
'time': str(datetime.now() - self.test_start_time),
'snap': "".join([x for x in os.listdir(self.snap_dir) if x==name[-1]]),
})
def addFailure(self, test, err, capt=None):
"""Add failure output to Xunit report.
"""
exc_type, exc_val, tb = err
tb = ''.join(traceback.format_exception(
exc_type,
exc_val if isinstance(exc_val, exc_type) else exc_type(exc_val),
tb
))
name = id_split(test.id())
group = self.report_data[name[0]]
self.stats['failures'] += 1
group.stats['failures'] += 1
group.tests.append({
'name': name[-1],
'failed': True,
'dir':self.snap_dir,
'errtype': nice_classname(err[0]),
'message': exc_message(err),
'tb': self._format_output(tb),
'output': self._format_output(self.complete_test_output(exc_message(err), tb)),
'shortDescription': test.shortDescription(),
'time': str(datetime.now() - self.test_start_time),
'snap': "".join([x for x in os.listdir(self.snap_dir) if x==name[-1]]),
})

四、测试使用

修改完__init__.py后,我们通过nosetests -h,我们可以看到多了一个参数:

首先写个测试程序,如下:

#coding:utf-8

from selenium import webdriver
import inspect
driver = webdriver.Firefox() def test_001():
assert 2==1 def test_0002():
assert 3==1 def test_learn_3():
try:
driver.get("http://www.baidu.com")
driver.find_element_by_id("xx")
except Exception,e:
driver.get_screenshot_as_file("c:\\report_1\\%s" % (inspect.stack()[0][3]))
raise

在使用nose测试,因为在刚刚的程序中,我们截图保存在c:\\report_1这个目录,所以测试使用如下:

C:\>nosetests -v nose_test.py --with-html --snap-dir="c:\report_1"

最后生成的HTML报告如下:

time后面多了一列,是失败时的截图链接,点击test_lean_3后,浏览器会自动跳转至截图显示。

大功告成。。。。。。

在实际的自动化代码中,你还需要加入清理资源的功能,把截图都清理或移至其它地方,不然截图会覆盖或显示上次结果

cnblogs不能上传附件,如果需要源码,可以联系我。

-----后期优化了下,把jinja2模板改了下,直接在html中显示缩略图,链接显示大图

{% if test_status == 'Fail' or test_status == 'Error' %}
<td><p><a href="{{test.dir}}\{{test.snap}}" title="link to datu"><img src="{{test.dir}}\{{test.snap}}" width="165" height="60" /></a></p></td>
{%- endif %}

  

nose测试中修改nose_html_reporting插件,使生成的html报告加入显示截图功能的更多相关文章

  1. 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...

  2. idea中的beautiful插件-自动生成对象set方法

    1. 描述 从前端获取VO对象后,好多时候又要生成数据库对象,需要进行赋值,一个个写很浪费时间,介绍一款idea中的beautiful插件,代码开发过程中自动生成对象的set方法,很好用. 2 .插件 ...

  3. 修改SublimeText3插件Emmet生成HTML中lang属性的默认值

    打开Preferences → Package Settings → Emmet → Settings-User,输入如下代码并保存: { "snippets": { " ...

  4. 如何在idea中使用Mybatis-generator插件快速生成代码

    传送门 使用这个插件可以快速生成一些代码,包含 实体类/Mapper接口/*Mapper.xml文件 首先,我们需要搭建一个Maven的项目. 在pom.xml中添加代码 <plugins> ...

  5. nodejs 中使用 mocha + should + jscoverage 生成 单元测试覆盖率报告

    最近一直在做nodejs,而关于js的单元测试覆盖率网上资料比较少而且吧比较零散,我从网上找来一些资料整理一下分析给大家,希望大家可以少走弯路. 首先我是从windows环境下测试的,用到的工具有 m ...

  6. 为了防止detailsview中修改后,而girdview却没立即更新显示

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] 可以在detailsview的事件中添加如下语句,即增加一个头,让它在0秒的时候刷新: Response.AddH ...

  7. JQ插件之imgAreaSelect实现对图片的在线截图功能(java版)

    前言:在做网站的时候经常用的功能就是,用户上传图片对自己上传的图片进行截图,DIV自己的头像.或者上传幻灯片大图进行DIV设置小图. 解决方案:目前我知道的解决方案有两个如下:       一.fla ...

  8. 修改nose_html_reporting,解决输出带中文时,不能生成html文件

    在使用nose_html_reporting时,如果测试输出中带有中文,那么html输出会失败,提示如下: 提示'ascii'编码码失败 这是因为在string.IO中取回来的数据与当前脚本中声明的编 ...

  9. 兼容性测试中如何切换和管理多个JDK版本

    本文由作者邹珍珍授权网易云社区发布. 一.测试背景: 项目对外提供JAR包,需要测试该JAR包对不同JDK版本(1.6至1.9版本)的兼容性.下面主要介绍在兼容性测试中,JDK多版本共存时如何配置环境 ...

随机推荐

  1. https://www.cnblogs.com/zy-jiayou/p/7661415.html

    Maven常用命令 1.1.Maven 参数 -D 传入属性参数 -P 使用pom中指定的配置 -e 显示maven运行出错的信息 -o 离线执行命令,即不去远程仓库更新包 -X 显示maven允许的 ...

  2. level1 -- unit 3 - 频率副词

    频率副词 never sometimes usually always never 从不 sometimes 有时 usually 通常 always 总是 频率排名(从最不到最经常): never ...

  3. ios Develop mark

    App Distribution Guidehttps://developer.apple.com/library/ios/documaentation/IDEs/Conceptual/AppDist ...

  4. 让Zend Studio联系关系CakePHP模板文件.ctp

    让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...

  5. 【乐呵一下】WINDOWS有个非常低级的错误!

    该错误来自微软windows附带的计算器(开始附件计算器). 1. 当你尝试用9216除以96并按下=按钮时,计算器竟然没有反应!!! 而9216除以97,98却正常. 2. 还有一个错误,当你尝试用 ...

  6. linux 安装 Django 安装

    下载源码包:https://www.djangoproject.com/download/ 输入以下命令并安装: tar xzvf Django-X.Y.tar.gz # 解压下载包 cd Djang ...

  7. Explore Basic Behavior of the TurtleBot ---3

    原创博文:转载请标明出处(周学伟):http://www.cnblogs.com/zxouxuewei/tag/ Introduction 此示例帮助您使用turtlebot的自主性. 驱动机器人向前 ...

  8. Unity3D的按钮添加事件有三种方式

    为Unity3D的按钮添加事件有三种方式,假设我们场景中有一个Canvas对象,Canvas对象中有一个Button对象. 方式一: 创建脚本ClickObject.cs,然后将脚本添加到Canvas ...

  9. Android开发真机测试方法 (转)

    转自:http://blog.csdn.net/china_lzn/article/details/7461963 Android的AVD无比的慢,无语啊,程序编的再好,都无法体验到流畅的感觉,索性, ...

  10. 后端判断用户是否关闭浏览器(关闭网站相关的全部tab)

    一)程序步骤 1.js 写一个定时请求后端(php),后端接收到请求到,把当前时间戳写入文件 2.php 阻塞,这里我写的是 30 秒,也就是 sleep(30) 3.获取当前时间和文件里的时间作比较 ...