第 16 章 函数编程

16.1. 概览

第 13 章 单元测试 中,你学会了单元测试的哲学。在 第 14 章 测试优先编程 中你步入了 Python 基本的单元测试操作,在 第 15 章 重构 部分,你看到单元测试如何令大规模重构变得容易。本章将在这些程序样例的基础上,集中关注于超越单元测试本身的更高级的 Python 特有技术。

下面是一个作为简单回归测试 (regression test) 框架运行的完整 Python 程序。它将你前面编写的单独单元测试模块组织在一起成为一个测试套件并一次性运行。实际上这是本书的构建代码的一部分;我为几个样例程序都编写了单元测试 (不是只有 第 13 章 单元测试 中的 roman.py 模块),时时彩计划软件公式:我的自动构建代码的第一个工作便是确保我所有的例子可以正常工作。如果回归测试程序失败,构建过程当即终止。我可不想因为发布了不能工作的样例程序而让你在下载他们后坐在显示器前抓耳挠腮地为程序不能运转而烦恼。

例 16.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.abspath(os.path.dirname(sys.argv[0]))   
    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")

把这段代码放在本书其他样例代码相同的目录下运行之,moduletest.py 中的所有单元测试将被找到并一起被运行。

例 16.2. regression.py 的样例输出

[you@localhost py]$ python regression.py -v
help should fail with no object ... ok                             
help should return known result for apihelper ... ok
help should honor collapse argument ... ok
help should honor spacing argument ... ok
buildConnectionString should fail with list input ... ok           
buildConnectionString should fail with string input ... ok
buildConnectionString should fail with tuple input ... ok
buildConnectionString handles empty dictionary ... ok
buildConnectionString returns known result with known input ... ok
fromRoman should only accept uppercase input ... ok                
toRoman should always return uppercase ... ok
fromRoman should fail with blank string ... ok
fromRoman should fail with malformed antecedents ... ok
fromRoman should fail with repeated pairs of numerals ... ok
fromRoman should fail with too many repeated numerals ... ok
fromRoman should give known result with known input ... ok
toRoman should give known result with known input ... ok
fromRoman(toRoman(n))==n for all n ... ok
toRoman should fail with non-integer input ... ok
toRoman should fail with negative input ... ok
toRoman should fail with large input ... ok
toRoman should fail with 0 input ... ok
kgp a ref test ... ok
kgp b ref test ... ok
kgp c ref test ... ok
kgp d ref test ... ok
kgp e ref test ... ok
kgp f ref test ... ok
kgp g ref test ... ok

----------------------------------------------------------------------
Ran 29 tests in 2.799s

OK
前五个测试来自于 apihelpertest.py,用以测试 第 4 章 自省的威力 中的样例代码。
接下来的五个测试来自于 odbchelpertest.py,用以测试 第 2 章 第一个 Python 程序 中的样例代码。
其他的测试来自于 romantest.py,你在 第 13 章 单元测试 中深入学习过。
时时彩今天推荐号码 守财奴时时彩 天机彩票时时彩软件 时时彩三星和尾 时时彩推荐专家预测
时时彩官方网站 时时彩后一必中技巧 时时彩前三和值 官方权威时时彩平台 时时彩做庄家私彩
时时彩演示站 彩生活oa系统2.0 上海时时彩 腾龙时时彩软件老版本 重庆时时彩最准计划
重庆时时彩100%中秘籍 重庆时时彩官网下载平台 阿拉丁时时彩 体彩时时彩咋开奖 时时彩方案漏洞
pc蛋蛋刷水有什么技巧 时时彩计划 内蒙古11选5走势一定牛 曾道人免费资料 河北十一选五彩票
皇冠足球投注网 排列3近10期试机号 云南11选5遗漏数据统计 今晚体彩试机号和金码 甘肃11选5中
贵州快3中奖图片 双色球投注技巧 黑龙江体彩十一选五走势图 甘肃快三预测号码推荐 3374财神网站香港博彩
安徽十一选五技巧 幸运飞艇手机直播 重庆时时彩软件终身 a6娱乐时时彩平台 浙江11选5技巧稳赚