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 类。
这段代码是 HTMLTestRunner 类的部分实现,主要看__init__()初始化方法的参数。
- stream:指定生成 HTML 测试报告的文件,必填。
- verbosity:指定日志的级别,默认为 1。如果想得到更详细的日志,则可以将参数修改为 2。
- title:指定测试用例的标题,默认为 None。
- description:指定测试用例的描述,默认为 None。
# -*- 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()
测试输出结果:
3、更易读的测试报告
现在生成的测试报告并不易读,因为它仅显示测试类名和测试方法名。如果随意命名为“test_case1”“test_case2”等,那么将很难明白这些测试用例所测试的功能。
在编写功能测试用例时,每条测试用例都有标题或说明,那么能否为自动化测试用例加上中文的标题或说明呢?答案是肯定的。在此之前,我们先来补充一个知识点:Python的注释。
Python 的注释有两种,一种叫作 comment,另一种叫作 doc string。前者为普通注释,后者用于描述函数、类和方法。
在类或方法的下方,可以通过三引号(""" """ 或 ''' ''')添加 doc string 类型的注释。这类注释在平时调用时不会显示,只有通过 help()方法查看时才会被显示出来。因为 HTMLTestRunner 可以读取 doc string 类型的注释,所以,我们只需给测试类或方法添加这种类型的注释即可。打开 Python Shell,添加以下注释:
再次运行测试用例,查看测试报告,加了注释的测试报告如图所示:
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 通过加号(+)拼接到生成的测试报告的文件名中。多次运行测试用例,可以看到生成的测试报告目录如图所示: