如何使用py.test正确导入包?

时间:2014-03-28 16:40:27

标签: python import pytest python-3.4

我有以下布局:

/spamalot
    /spam
        __init__.py
        spam.py
        /spam_on_eggs
            __init__.py
            spam_on_eggs.py
    /tests

        test_spam.py

垃圾邮件恰好是一个烧瓶应用程序。

spam.py我有

import spam_on_eggs.spam_on_eggs as eggs
# Other Flask setup & application code here.

这很好 - 从spamalot目录我可以运行python spam/spam.py

然而,当我开始将测试投入混音时,它并不那么棒。

在我的test_spam.py文件中,我有:

import spam.spam
test_client = spam.spam.app.test_client()

def test_it_fails():
     assert False

但是,不是在我预期的地方失败,而是在导入线上失败:

/spamalot/ $ py.test
# some output
E    ImportError

我可以通过将__init__.py放在我的/tests文件夹中解决此问题,但后来我得到了一个不同的ImportError:

spam/spam.py:1: in <module>
>    import spam_on_eggs.spam_on_eggs as eggs
E    ImportError: No module named 'spam_on_eggs'

我可以通过将行改为:

来解决那个
from spam.spam_on_eggs import spam_on_eggs

这允许我测试然后我打破了运行$ python spam/spam.py的能力 - 因为我得到了

ImportError: no module named 'spam'

显然,我对模块导入如何工作以及py.test如何与此系统一起工作有所了解。

我错过了什么?

是否可以拥有我所描述的布局 - 并且能够从spamalot目录运行py.test和我的服务器?

1 个答案:

答案 0 :(得分:-1)

py.test将始终使用最短的目录路径,其中包含__init__.py

__init__.py放入spamalot,您可以导入spamalot.spam.spam

参考:choosing a test layout