我有一段带有广泛测试套件的代码,我们使用py.test运行。我最近遇到了一个问题,即新模块应该导入一个不同的模块才能正常运行。但是,因为该模块是在测试套件中的其他位置导入的,所以py.test没有引发错误。直到很久以后才出现这个错误。我已经创建了一个可重复性最小的示例。
项目结构:
set.py
fail/
__init__.py
thing.py
other.py
tests/
test_thing.py
test_other.py
这些文件包含以下代码:
fail/thing.py
import fail
def needs_do_it():
return fail.other.do_it() + 100
fail/other.py
def do_it():
return 100
tests/test_thing.py
import fail.thing
def test_needs_do_it():
assert fail.thing.needs_do_it() == 200
tests/test_other.py
import fail.other
def test_do_it():
assert fail.other.do_it() == 100
如果您尝试运行needs_do_it
函数,则应该收到错误,
由于仅导入了fail
,而不是fail.other
:
>>> import fail.thing
>>> fail.thing.needs_do_it()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "fail/thing.py", line 4, in needs_do_it
return fail.other.do_it() + 100
AttributeError: 'module' object has no attribute 'other'
然后,我希望在py.test下运行的测试会暴露出来 导入时出错。但是,它完全掩盖了这个问题。
由于test_other.py
导入test.other
,py.test会掩盖错误。
$ py.test
========== test session starts ==========
platform darwin -- Python 2.7.13, pytest-3.1.2, py-1.4.34, pluggy-0.4.0
rootdir: /Users/eswanson/Sandbox/pytest-test, inifile:
collected 2 items
tests/test_other.py .
tests/test_thing.py .
========== 2 passed in 0.01 seconds ==========
我的问题分为三部分:
答案 0 :(得分:0)
在Python shell中导入fail.other
时也会发生同样的事情,因为Python模块是单例:
>>> import fail.thing
>>> fail.thing.needs_do_it()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/florian/tmp/fo/fail/thing.py", line 4, in needs_do_it
return fail.other.do_it() + 100
AttributeError: module 'fail' has no attribute 'other'
>>> import fail.other
>>> fail.thing.needs_do_it()
200