如何通过 "python setup.py test" 运行单元测试发现?

12 浏览
0 Comments

如何通过 "python setup.py test" 运行单元测试发现?

我正在尝试弄清楚如何使python setup.py test运行相当于python -m unittest discover的命令。我不想使用一个名为run_tests.py的脚本,也不想使用任何外部的测试工具(如nosepy.test)。如果解决方案只适用于Python 2.7也可以接受。

setup.py中,我认为我需要在配置的test_suite和/或test_loader字段中添加一些内容,但我似乎找不到正确的组合:

config = {
    'name': name,
    'version': version,
    'url': url,
    'test_suite': '???',
    'test_loader': '???',
}

只使用Python 2.7内置的unittest模块,是否可能实现这个目标?

我项目的结构如下:

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- 我想删除这个文件
  setup.py

更新:使用unittest2是可行的,但我希望找到一个只使用unittest的等效解决方案。

https://pypi.python.org/pypi/unittest2

unittest2包括一个非常基本的与setuptools兼容的测试收集器。在您的setup.py中指定test_suite = 'unittest2.collector'。这将从包含setup.py的目录开始测试发现,默认使用默认参数,因此它可能最有用作示例(请参阅unittest2/collector.py)。

目前,我只是使用一个名为run_tests.py的脚本,但我希望能够通过转换为只使用python setup.py test的解决方案来摆脱它。

这是我希望删除的run_tests.py脚本:

import unittest
if __name__ == '__main__':
    # 使用默认的TestLoader实例
    test_loader = unittest.defaultTestLoader
    # 使用基本的测试运行器,输出到sys.stderr
    test_runner = unittest.TextTestRunner()
    # 自动发现当前目录中所有以test*.py形式命名的测试
    # 注意:仅适用于Python 2.7及更高版本
    test_suite = test_loader.discover('.')
    # 运行测试套件
    test_runner.run(test_suite)

0