我有一个非常基本的Python包示例和我尝试使用pytest运行的测试
package
\--
__init__.py
spam.py
spam_test.py
__init__.py
为空,spam.py
定义单个函数func()
,spam_test.py
为:
import package.spam
def test_func():
assert(package.spam.func() == 5)
在根目录中,我运行py.test
并且一切正常,返回一个通过测试。
我想我也可以用这种方式构建事物:
package
\--
__init__.py
spam.py
tests
\--
spam_test.py
但是现在当我在根目录中运行py.test
时,我得到了:
============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.0.5, py-1.4.32, pluggy-0.4.0 rootdir: C:\Users\MattUser\Documents\m_drive\notebooks\testing, inifile: collected 0 items / 1 errors =================================== ERRORS ==================================== _____________________ ERROR collecting tests/spam_test.py _____________________ ImportError while importing test module 'C:\Users\MattUser\Documents\m_drive\not ebooks\testing\tests\spam_test.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: tests\spam_test.py:1: in import package.spam E ModuleNotFoundError: No module named 'package' !!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 1 error in 0.19 seconds ===========================
我尝试过各种各样的事情,但没有运气。我做错了什么?
答案 0 :(得分:13)
嗯,我明白了。在__init__.py
目录中添加一个空的tests
文件。
为什么这样做?来自official docs:
确定
basedir
:这是第一个“向上”(朝向根)目录,不包含__init__.py
。
因此,当tests
不包含__init__.py
时,pytest会将其确定为basedir
。添加__init__.py
强制pytest来递归到根,从那里可以导入它所需要的东西......