我有一个包含相当广泛的测试套件的包,我维护它的频率非常低。有时我忘记安装测试所需的组件,或者我的更改破坏了测试代码。通常情况下,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
中的相关代码是:
在盯着屏幕看了一段时间后,我会记得我可以像这样运行测试套件:
$ 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
调用测试套件是错误的吗?在
请看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维护,他是stdlibunitest
模块的listed a an official expert,因此您可以放心,您是在好的手。在相关问题 更多 >
编程相关推荐