【unittest单元测试框架】(4)HTML 测试报告

HTML 测试报告

  HTMLTestRunner 是 unittest 的一个扩展,它可以生成易于使用的 HTML 测试报告。HTMLTestRunner 是在 BSD 许可证下发布的。   下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html。   GitHub 地址:https://github.com/defnngj/HTMLTestRunner。

1、下载与安装

  HTMLTestRunner 的使用非常简单,它是一个独立的 HTMLTestRunner.py 文件,既可以把它当作 Python 的第三方库来使用,也可以将把它当作项目的一部分来使用。   首先打开上面的 GitHub 地址,克隆或下载整个项目。然后把 HTMLTestRunner.py 单独放到 Python 的安装目录下面,如 C:\Python37\Lib\。   打开 Python Shell,验证安装是否成功。
Microsoft Windows [版本 10.0.19041.1348]
(c) Microsoft Corporation。保留所有权利。

C:\Users\yzp>python
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import  HTMLTestRunner
>>>

  如果没有报错,则说明安装成功。

  如果把 HTMLTestRunner 当作项目的一部分来使用,就把它放到项目目录中。笔者推荐这种方式,因为可以方便地定制生成的 HTMLTestRunner 报告。 unittest_expand/ ├─test_case/ │ └─test_baidu.py ├─test_report/ ├─HTMLTestRunner.py └─run_tests.py   其中,test_report/用于存放测试报告,稍后将会用到。

2、生成 HTML 测试报告

  如果想用 HTMLTestRunner 生成测试报告,那么请查看前面章节run_tests.py 文件的实现。测试用例的执行是通过 TextTestRunner 类提供的 run()方法完成的。这里需要把HTMLTestRunner.py 文件中的 HTMLTestRunner 类替换 TextTestRunner 类。

   打开 HTMLTestRunner.py 文件,可以找到 HTMLTestRunner 类。

【unittest单元测试框架】(4)HTML 测试报告

  这段代码是 HTMLTestRunner 类的部分实现,主要看__init__()初始化方法的参数。

  • stream:指定生成 HTML 测试报告的文件,必填。
  • verbosity:指定日志的级别,默认为 1。如果想得到更详细的日志,则可以将参数修改为 2。
  • title:指定测试用例的标题,默认为 None。
  • description:指定测试用例的描述,默认为 None。
  在 HTMLTestRunner 类中,同样由 run()方法来运行测试套件中的测试用例。修改run_tests.py 文件如下。
# -*- coding:utf-8 -*-
# filename: run_test.py
# author: hello.yin
# date: 2021/11/16 18:58

import unittest
from HTMLTestRunner import HTMLTestRunner

test_dir = "./test_case"
suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

if __name__ == "__main__":

    fp = open("./test_report/result.html", "wb")
    runner = HTMLTestRunner(stream=fp, title="hello.yin test baidu", description="火狐浏览器")
    runner.run(suit)
    fp.close()

 测试输出结果:

【unittest单元测试框架】(4)HTML 测试报告

3、更易读的测试报告

   现在生成的测试报告并不易读,因为它仅显示测试类名和测试方法名。如果随意命名为“test_case1”“test_case2”等,那么将很难明白这些测试用例所测试的功能。

   在编写功能测试用例时,每条测试用例都有标题或说明,那么能否为自动化测试用例加上中文的标题或说明呢?答案是肯定的。在此之前,我们先来补充一个知识点:Python的注释。 

  Python 的注释有两种,一种叫作 comment,另一种叫作 doc string。前者为普通注释,后者用于描述函数、类和方法。

  在类或方法的下方,可以通过三引号(""" """ 或 ''' ''')添加 doc string 类型的注释。这类注释在平时调用时不会显示,只有通过 help()方法查看时才会被显示出来。因为 HTMLTestRunner 可以读取 doc string 类型的注释,所以,我们只需给测试类或方法添加这种类型的注释即可。

   打开 Python Shell,添加以下注释:

【unittest单元测试框架】(4)HTML 测试报告

再次运行测试用例,查看测试报告,加了注释的测试报告如图所示:

【unittest单元测试框架】(4)HTML 测试报告

4、测试报告文件名

  因为测试报告的名称是固定的,所以每次新的测试报告都会覆盖上一次的。如果不想被覆盖,那么只能每次在运行前都手动修改报告的名称。这样显然非常麻烦,我们最好能为测试报告自动取不同的名称,并且还要有一定的含义。时间是个不错的选择,因为它可以标识每个报告的运行时间,更主要的是,时间永远不会重复。   在 Python 的 time 模块中提供了各种关于时间操作的方法,利用这些方法可以完成这个需求。
>>> import time
>>> time.time()
1530352438.7203176
>>> time.ctime()
'Sat Jun 30 17:54:14 2018'
>>> time.localtime()
time.struct_time(tm_year=2018, tm_mon=6, tm_mday=30, tm_hour=17, tm_min=54, 
tm_sec=26, tm_wday=5, tm_yday=181, tm_isdst=0)
>>> time.strftime("%Y_%m_%d %H:%M:%S")
'2018_06_30 17:54:39'

   说明如下:

  • time.time():获取当前时间戳。
  • time.ctime():当前时间的字符串形式。
  • time.localtime():当前时间的 struct_time 形式。
  • time.strftime():用来获取当前时间,可以将时间格式化为字符串。 打开 runtests.py 文件,做如下修改:
# -*- coding:utf-8 -*-
# filename: run_test.py
# author: hello.yin
# date: 2021/11/16 18:58

import time
import unittest
from HTMLTestRunner import HTMLTestRunner

now_time = time.strftime("%Y%m%d%H%M%S")
test_dir = "./test_case"
suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

if __name__ == "__main__":

    fp = open("./test_report/" + now_time + "_result.html", "wb")
    runner = HTMLTestRunner(stream=fp, title="hello.yin test baidu", description="火狐浏览器")
    runner.run(suit)
    fp.close()
  通过 strftime()方法以指定的格式获取当前日期时间,并赋值给 now_time 变量。将now_time 通过加号(+)拼接到生成的测试报告的文件名中。多次运行测试用例,可以看到生成的测试报告目录如图所示: 【unittest单元测试框架】(4)HTML 测试报告
上一篇:SQL Server中INNER JOIN与子查询IN的性能测试


下一篇:unittest01--介绍