python3.x安装HTMLTestRunner和使⽤
操作:
1.什么是HTMLTestRunner?
单元测试框架是受到 JUnit 的启发,与其他语⾔中的主流单元测试框架有着相似的风格。其⽀持测试⾃动化,配置共享和关机代码测试。⽀持将测试样例聚合到测试集中,并将测试与报告框架独⽴。
为了实现这些,通过⾯向对象的⽅式⽀持了⼀些重要的概念。
测试脚⼿架
test fixture表⽰为了开展⼀项或多项测试所需要进⾏的准备⼯作,以及所有相关的清理操作。举个例⼦,这可能包含创建临时或代理的数据库、⽬录,再或者启动⼀个服务器进程。
测试⽤例
⼀个测试⽤例是⼀个独⽴的测试单元。它检查输⼊特定的数据时的响应。提供⼀个基类:,⽤于新建测试⽤例。
测试套件
test suite是⼀系列的测试⽤例,或测试套件,或两者皆有。它⽤于归档需要⼀起执⾏的测试。
测试运⾏器(test runner)
test runner是⼀个⽤于执⾏和输出测试结果的组件。这个运⾏器可能使⽤图形接⼝、⽂本接⼝,或返回⼀个特定的值表⽰运⾏测试的结果。
模块提供了⼀系列创建和运⾏测试的⼯具。这⼀段落演⽰了这些⼯具的⼀⼩部分,但也⾜以满⾜⼤部分⽤户的需求。
这是⼀段简短的代码,来测试三种字符串⽅法:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if__name__ == '__main__':
unittest.main()
通过以上资料可以看到unittest能够输出txt格式的⽂本执⾏报告,但是⽂本报告太过简陋,是不是想要更加⾼⼤上的HTML报告?
但unittest⾃⼰可没有带HTML报告,我们只能求助于外部的库了——HTMLTestRunner.py。
2.下载HTMLTestRunner.py
为什么是下载HTMLTestRunner.py⽽不直接是HTMLTestRunner呢?
揭晓答案前我们先⽤常规⼿段下载HTMLTestRunner:
通过Pycharm下载HTMLTestRunner
确保使⽤的是⾖瓣源下载后,点击安装:
果然报错...,为什么会报错呢?
通过pip下载HTMLTestRunner
这⾥我再尝试下使⽤pip下载:
结果发现不管怎么尝试,都是不⾏:)
于是我查了下资料,得到了⼀个结论:原因其实就是HTMLTestRunner是Python标准库的unittest模块的扩展,⽆法通过pip安装。那么我们要怎么使⽤和下载HTMLTestRunner呢?
其实解决⽅法很简单,需要通过⼿动下载HTMLTestRunner.py⽂件,放在python⽬录Lib⽂件夹下即可:
由于当前Python2.x绝⼤多数情况下不再使⽤,这⾥之将⽀持Python3.x的HTMLTestRunner.py⽂件放上来:
"""
A TestRunner for use with the Python unit testing framework. It
generates a HTML report to show the result at a glance.
The simplest way to use this is to invoke its main method. E.g.
import unittest
import HTMLTestRunner
.
.. define your tests ...
if __name__ == '__main__':
HTMLTestRunner.main()
For more customization options, instantiates a HTMLTestRunner object.
HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.
# output to a file
fp = file('my_report.html', 'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='My unit test',
description='This demonstrates the report output by HTMLTestRunner.'
)
# Use an external stylesheet.
# See the Template_mixin class for more customizable options
runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">'
# run the test
runner.run(my_test_suite)
------------------------------------------------------------------------
Copyright (c) 2004-2007, Wai Yip Tung
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name Wai Yip Tung nor the names of its contributors may be
used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
"""
# URL: tungwaiyip.info/software/HTMLTestRunner.html
__author__ = "Wai Yip Tung"
__version__ = "0.8.2"
"""
Change History
Version 0.8.2
* Show output inline instead of popup window (Viorel Lupu).
Version in 0.8.1
* Validated XHTML (Wolfgang Borgert).
* Added description of test classes and test cases.
Version in 0.8.0
* Define Template_mixin class for customization.
* Workaround a IE 6 bug that it does not treat <script> block as CDATA. Version in 0.7.1
* Back port to Python 2.3 (Frank Horowitz).
* Fix missing scroll bars in detail log (Podi).
"""
# TODO: color stderr
# TODO: simplify javascript using ,ore than 1 class in the class attribute? import datetime
#2.7版本为 import StringIO
import io
import sys
import time
import unittest
from xml.sax import saxutils
# ------------------------------------------------------------------------
# The redirectors below are used to capture output during testing. Output # sent to sys.stdout and sys.stderr are automatically captured. However # in some cases sys.stdout is already cached before HTMLTestRunner is # invoked (e.g. calling logging.basicConfig). In order to capture those
# output, use the redirectors for the cached stream.
#
# e.g.
#  >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector) #  >>>
class OutputRedirector(object):
""" Wrapper to redirect stdout or stderr """
def__init__(self, fp):
self.fp = fp
def write(self, s):
self.fp.write(s)
def writelines(self, lines):
self.fp.writelines(lines)
def flush(self):
self.fp.flush()
stdout_redirector = OutputRedirector(sys.stdout)
stderr_redirector = OutputRedirector(sys.stderr)
# ----------------------------------------------------------------------
# Template
class Template_mixin(object):
"""
Define a HTML template for report customerization and generation.
Overall structure of an HTML report
HTML
+------------------------+
|<html>                  |
|  <head>                |
|                        |
|  STYLESHEET          |
|  +----------------+  |
|  |                |  |
|  +----------------+  |
|                        |
|  </head>              |
|                        |
|  <body>                |
|                        |
|  HEADING              |
|  +----------------+  |
|  |                |  |
|  +----------------+  |
|                        |
|  REPORT              |
|  +----------------+  |
|  |                |  |
|  +----------------+  |
|                        |
|  ENDING              |
|  +----------------+  |
|  |                |  |
|  +----------------+  |
|                        |
|  </body>              |
|</html>                |
+------------------------+
"""
STATUS = {
0: 'pass',
1: 'fail',
2: 'error',
}
DEFAULT_TITLE = 'Unit Test Report'
DEFAULT_DESCRIPTION = ''
# ------------------------------------------------------------------------
# HTML Template
HTML_TMPL = r"""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="/1999/xhtml">
<head>
<title>%(title)s</title>
<meta name="generator" content="%(generator)s"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
%(stylesheet)s
</head>
<body>
<script language="javascript" type="text/javascript"><!--
output_list = Array();
/* level - 0:Summary; 1:Failed; 2:All */
function showCase(level) {
trs = ElementsByTagName("tr");
for (var i = 0; i < trs.length; i++) {
tr = trs[i];
id = tr.id;
if (id.substr(0,2) == 'ft') {
if (level < 1) {
tr.className = 'hiddenRow';
}
else {
tr.className = '';
}
}
if (id.substr(0,2) == 'pt') {
if (level > 1) {
tr.className = '';
}
else {
tr.className = 'hiddenRow';
}
}
}
}
function showClassDetail(cid, count) {
var id_list = Array(count);
var toHide = 1;
for (var i = 0; i < count; i++) {
tid0 = 't' + cid.substr(1) + '.' + (i+1);
tid = 'f' + tid0;
tr = ElementById(tid);
if (!tr) {
tid = 'p' + tid0;
tr = ElementById(tid);
}
id_list[i] = tid;
if (tr.className) {
toHide = 0;
}
}
for (var i = 0; i < count; i++) {
tid = id_list[i];
if (toHide) {
writelines在python中的用法
}
else {
}
}
}
function showTestDetail(div_id){
var details_div = ElementById(div_id)
var displayState = details_div.style.display
/
/ alert(displayState)
if (displayState != 'block' ) {
displayState = 'block'
details_div.style.display = 'block'
}
else {
details_div.style.display = 'none'
}
}
function html_escape(s) {
s = s.replace(/&/g,'&');
s = s.replace(/</g,'<');
s = s.replace(/>/g,'>');
return s;
}
/* obsoleted by detail in <div>
function showOutput(id, name) {
var w = window.open("", //url
name,
"resizable,scrollbars,status,width=800,height=450");
d = w.document;
d.write("<pre>");
d.write(html_escape(output_list[id]));
d.write("\n");
d.write("<a href='javascript:window.close()'>close</a>\n");
d.write("</pre>\n");
d.close();
}
*/
--></script>
%(heading)s
%(report)s
%(ending)s
</body>
</html>
"""
# variables: (title, generator, stylesheet, heading, report, ending)
# ------------------------------------------------------------------------
# Stylesheet
#
# alternatively use a <link> for external style sheet, e.g.
#  <link rel="stylesheet" href="$url" type="text/css">
STYLESHEET_TMPL = """
<style type="text/css" media="screen">
body        { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; } table      { font-size: 100%; }
pre        { }
/* -- heading ---------------------------------------------------------------------- */
h1 {
font-size: 16pt;
color: gray;
}
.heading {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。