当我将测试放在一个单独的目录中时,pytest无法找到包

时间:2017-03-10 17:27:15

标签: python-3.x pytest

我有一个非常基本的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 ===========================

我尝试过各种各样的事情,但没有运气。我做错了什么?

1 个答案:

答案 0 :(得分:13)

嗯,我明白了。在__init__.py目录中添加一个空的tests文件。

为什么这样做?来自official docs

  

确定basedir:这是第一个“向上”(朝向根)目录,不包含__init__.py

因此,当tests 包含__init__.py时,pytest会将其确定为basedir。添加__init__.py强制pytest来递归到根,从那里可以导入它所需要的东西......

相关问题