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

Mat*_*aws 11 pytest python-3.x

我有一个非常基本的Python包示例和我正在尝试使用pytest运行的测试

package
 \--
   __init__.py
   spam.py
   spam_test.py
Run Code Online (Sandbox Code Playgroud)

__init__.py为空,spam.py定义单个函数func(),spam_test.py并且:

import package.spam

def test_func():
    assert(package.spam.func() == 5)
Run Code Online (Sandbox Code Playgroud)

在我运行的根目录中py.test,一切正常,返回一个通过测试.

以为我也可以用这种方式构建东西:

package
 \--
   __init__.py
   spam.py
tests
 \--
   spam_test.py
Run Code Online (Sandbox Code Playgroud)

但现在当我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 ===========================

我尝试了各种各样的事情,没有运气.我究竟做错了什么??

Mat*_*aws 19

好吧,我搞定了.__init__.pytests目录中添加一个空文件.

为什么这样做?来自官方文档:

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

因此,如果tests 包含__init__.py,pytest确定是basedir.添加__init__.py力pytest来递归到根,从那里它可以导入它需要的东西......

  • 我有一个 `__init.py__` 但仍然看到 OP 行为。 (4认同)
  • 这是真的推荐的方式吗?或者它只是副作用? (2认同)
  • 添加 `__init.py__` 没有解决问题 (2认同)