第七章 回归测试

目录

7.1. 接触

单元测试 中,我们讨论了单元测试的原理,并用Python逐步地彻底地将其实现。本章将更关注于高级的与Python有关的技术,集中围绕着 unittest 模块。这就是说,不象前一章,几乎没有什么要被转换为其它的语言。那么再说一次,如果你想学其它的语言,就不就应该读得太深了,不是吗?

下面是一个完整的Python程序,它担当着一个廉价而又简单的回归测试框架。它得到你已经写好的用于独立模块的单元测试,将它们全部收集起来,放入一个大的测试套件中,接着立即将它们全部运行。实际上,我把这个作为本书建立过程的一部分来使用;我有用于几个例程的单元测试(不只是在 单元测试 中有特色的 roman.py 模块),并且我的自动化脚本所做的头一件事就是:运行这个测试程序,确定所有我的例子仍然可以正确运行。如果这个回归测试失败了,创建过程立即停止。我可不想再发布无法正确运行的例子,不会让你把它们下载下来,头发乱糟糟地坐下,冲着屏幕大叫,想知道为什么它们无法运行。

例 7.1. regression.py

如果你还没有运行过,可以下载本例或本书用到的其它的例子

"""Regression testing framework

This module will search for scripts in the same directory named
XYZtest.py.  Each such script should be a test suite that tests a
module through PyUnit.  (As of Python 2.1, PyUnit is included in
the standard library as "unittest".)  This script will aggregate all
found test suites into one big test suite and run them all at once.
"""

import sys, os, re, unittest

def regressionTest():
    path = os.path.split(sys.argv[0])[0] or os.getcwd()
    files = os.listdir(path)
    test = re.compile("test.py$", re.IGNORECASE)
    files = filter(test.search, files)
    filenameToModuleName = lambda f: os.path.splitext(f)[0]
    moduleNames = map(filenameToModuleName, files)
    modules = map(__import__, moduleNames)
    load = unittest.defaultTestLoader.loadTestsFromModule
    return unittest.TestSuite(map(load, modules))

if __name__ == "__main__":
    unittest.main(defaultTest="regressionTest")

例 7.2. regression.py 的样例输出


.......................
----------------------------------------------------------------------
Ran 23 tests in 3.185s

OK