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

问题描述 投票:8回答:1

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

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

python-3.x pytest
1个回答
13
投票

好吧,我搞定了。在__init__.py目录中添加一个空的tests文件。

为什么这样做?来自official docs

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

所以tests不包含__init__.py,pytest确定是basedir。添加__init__.py强制pytest递归到根,从那里它可以导入它需要的...

© www.soinside.com 2019 - 2024. All rights reserved.