跳转到主要内容

为unittest进行测试发现。从Python 2.7回滚到Python 2.4+

项目描述

这是从Python 2.7回滚到Python 2.4或更高版本(包括Python 3)的unittest测试发现机制和load_tests协议。

可以使用pip或easy_install安装discover。安装后,将当前目录切换到项目顶层目录并运行

python -m discover
python discover.py

(如果您已安装setuptools或distribute,您还将有一个discover脚本可用。)

这将发现当前目录中的所有测试(有某些限制)。discover模块有多个选项来控制其行为(完整的用法选项显示在python -m discover -h

Usage: discover.py [options]

Options:
  -v, --verbose    Verbose output
  -s directory     Directory to start discovery ('.' default)
  -p pattern       Pattern to match test files ('test*.py' default)
  -t directory     Top level directory of project (default to
                   start directory)

For test discovery all test modules must be importable from the top
level directory of the project.

例如,要使用不同的模式匹配测试模块,请运行

python -m discover -p '*test.py'

(对于像Bash这样的UNIX-like shell,您需要在测试模式周围加上引号,否则shell将尝试展开模式,而不是将其传递给发现。在Windows上,您必须不要在模式周围加上引号,因为Windows shell也会将引号传递给发现。)

测试发现是在 discover.DiscoveringTestLoader.discover 中实现的。除了将 discover 用作命令行脚本外,您还可以导入 DiscoveringTestLoader,它是 unittest.TestLoader 的子类,并在您的测试框架中使用它。

此方法从指定的起始目录找到并返回所有测试模块,递归到子目录中查找它们。只有与 pattern 匹配的测试文件才会被加载。(使用shell样式模式匹配。)

所有测试模块都必须可以从项目的顶层导入。如果起始目录不是顶层目录,则必须单独指定顶层目录。

load_tests 协议允许测试模块和包自定义它们如何被加载。这通过 discover.DiscoveringTestLoader.loadTestsFromModule 实现。如果测试模块定义了一个 load_tests 函数,则通过调用 load_tests 并传递三个参数: loaderstandard_testsNone 来从模块中加载测试。

如果测试包名称(具有 __init__.py 的目录)与模式匹配,则将检查包中的 load_tests 函数。如果存在,则将其与 loadertestspattern 一起调用。

如果存在 load_tests,则发现将不会递归到包中,load_tests 负责加载包中的所有测试。

模式故意不以加载器属性的形式存储,以便包可以继续发现。存储 top_level_dir,以便 load_tests 不需要在 loader.discover() 中传递此参数。

discover.py 在一个 google code 项目中维护(在此处应发布错误和功能请求):http://code.google.com/p/unittest-ext/

discover.py 的最新开发版本可在以下位置找到:http://code.google.com/p/unittest-ext/source/browse/trunk/discover.py

变更日志

2010/06/11 0.4.0

  • 添加了与 setuptools 兼容的测试收集器。在 setup.py 中设置“test_suite = ‘discover.collector’”。“setup.py test”将使用与 setup.py 相同目录的默认参数启动测试发现。

  • 允许使用点模块名称而不是路径进行测试发现。

  • 添加了 discover 脚本的 setuptools 兼容的入口点。

  • 有缺陷的 load_tests 函数不会停止测试发现。将创建一个失败的测试来报告错误。

  • 如果测试发现从错误的位置导入模块(通常是因为模块是全局安装的,并且用户期望在不同的位置运行针对开发版本的测试),则发现将因 ImportError 而停止,并报告问题。

  • 在测试发现期间匹配文件是在 DiscoveringTestLoader._match_path 中完成的。此方法可以在子类中重写,例如,匹配完整文件路径或使用正则表达式进行匹配。

  • 从 unittest2 迁移的发现测试。(这些测试需要 unittest2 来运行。)

与 Python 2.7 RC 1 中的 TestLoader 具有功能一致性。

2010/02/07 0.3.2

  • 如果存在 load_tests,则它将标准测试作为 TestSuite 而不是测试列表传递。

2009/09/13 0.3.1

  • 修复了当包目录与发现模式匹配时的问题。

2009/08/20 0.3.0

  • 无法导入文件(例如,由于语法错误)不再会中断发现,但会报告为失败。

  • 发现将不会尝试导入名称不是有效Python标识符的测试文件,即使它们与模式匹配。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面