Py.test掩盖丢失的导入

时间:2017-06-14 14:58:14

标签: python unit-testing import pytest

我有一段带有广泛测试套件的代码,我们使用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 ==========

我的问题

我的问题分为三部分:

  1. 这个问题的根本原因是什么?
  2. 这是py.test的预期行为还是我应该提出的问题?
  3. 作为pytest用户,我有什么可以做的,以便更好地保证我将来不会搞砸进口

1 个答案:

答案 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