Python setuptools隐藏测试未运行的真正原因

2024-09-30 16:25:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含相当广泛的测试套件的包,我维护它的频率非常低。有时我忘记安装测试所需的组件,或者我的更改破坏了测试代码。通常情况下,setuptools会隐藏问题的真正原因。在

下面是一个例子:

$ python setup.py test
running test
running egg_info
writing requirements to pwman3.egg-info/requires.txt
writing pwman3.egg-info/PKG-INFO
writing top-level names to pwman3.egg-info/top_level.txt
writing dependency_links to pwman3.egg-info/dependency_links.txt
writing entry points to pwman3.egg-info/entry_points.txt
reading manifest file 'pwman3.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'pwman3.egg-info/SOURCES.txt'
running build_ext
Traceback (most recent call last):
  File "setup.py", line 361, in <module>
    'console_scripts': ['pwman3 = pwman.ui.cli:main']
  File "/usr/lib64/python2.7/distutils/core.py", line 151, in setup
    dist.run_commands()
  File "/usr/lib64/python2.7/distutils/dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "/usr/lib64/python2.7/distutils/dist.py", line 972, in run_command
    cmd_obj.run()
  File "/usr/lib64/python2.7/site-packages/setuptools/command/test.py", line 146, in run
    self.with_project_on_sys_path(self.run_tests)
  File "/usr/lib64/python2.7/site-packages/setuptools/command/test.py", line 127, in with_project_on_sys_path
    func()
  File "/usr/lib64/python2.7/site-packages/setuptools/command/test.py", line 167, in run_tests
    testRunner=self._resolve_as_ep(self.test_runner),
  File "/usr/lib64/python2.7/unittest/main.py", line 94, in __init__
    self.parseArgs(argv)
  File "/usr/lib64/python2.7/unittest/main.py", line 149, in parseArgs
    self.createTests()
  File "/usr/lib64/python2.7/unittest/main.py", line 158, in createTests
    self.module)
  File "/usr/lib64/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib64/python2.7/unittest/loader.py", line 100, in loadTestsFromName
    parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'test_pwman'

有时,我会花一些令人沮丧的时间来理解为什么会出现这个错误,尽管在test目录中有一个名为test_pwman的python模块。在

setup.py中的相关代码是:

^{pr2}$

在盯着屏幕看了一段时间后,我会记得我可以像这样运行测试套件:

$ python -m tests.test_pwman

例如,它揭示了测试未运行的真正原因:

Traceback (most recent call last):
  File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/ozn/Software/pwman3/tests/test_pwman.py", line 27, in <module>
    from .test_postgresql import TestPostGresql
  File "tests/test_postgresql.py", line 26, in <module>
    import psycopg2 as pg
  File "/home/ozn/.virtualenvs/pwman3/lib/python2.7/site-packages/psycopg2/__init__.py", line 50, in <module>
    from psycopg2._psycopg import BINARY, NUMBER, STRING, DATETIME, ROWID
ImportError: libpq.so.5: cannot open shared object file: No such file or directory

在安装了支持Python的Postgresql之后,我就可以运行我的测试了。所以我的问题是:

如何使setuptools传播真正的异常?
我的代码从setup.py调用测试套件是错误的吗?在


Tags: runinpytestselfinfotxtegg
2条回答

请看http://bugs.python.org/issue7559,这是unittest模块中的一个bug。在

正如在iElectric的回答中指出的,这是一个已知的bug,已经在Python3.5中修复了。但是,我看到您使用的是python2.7。在

bug修复已经被后传到unittest2,这将为您在Python2.7中解决问题。在

要使用unittest2,安装它(pip install unittest2),只需将import unittest替换为import unittest2。在

unittest2由Robert Collins维护,他是stdlib unitest模块的listed a an official expert,因此您可以放心,您是在好的手。在

相关问题 更多 >