本文介绍了pytest 找不到模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在遵循 pytest 良好实践或者至少我认为我是.但是,pytest 找不到我的模块.它的 PYTHONPATH 中似乎没有包含当前目录.

I am following the pytest good practices or at least I think I am. However, pytest cannot find my module. It seems not to include the current directory in its PYTHONPATH.

源文件:

def add(x, y):
    return x + y

测试文件:

import pytest
from junk.ook import add


def test_add_true():
    assert add(1, 1) == 2

以及带有名为p3"的 Python 3 虚拟环境的 shell 输出.

And the shell output with a Python 3 virtual environment called "p3".

p3; pwd
/home/usr/tmp/junk
p3; ls
total 0
0 junk/  0 tests/
p3; ls junk
total 4.0K
4.0K ook.py     0 __init__.py
p3; ls tests
total 4.0K
4.0K test_ook.py     0 __pycache__/
p3; pytest
============================= test session starts ==============================
platform linux -- Python 3.4.5, pytest-3.4.1, py-1.5.2, pluggy-0.6.0
rootdir: /home/usr/tmp/junk, inifile:
collected 0 items / 1 errors

==================================== ERRORS ====================================
______________________ ERROR collecting tests/test_ook.py ______________________
ImportError while importing test module '/home/usr/tmp/junk/tests/test_ook.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ook.py:2: in <module>
    from junk.ook import add
E   ImportError: No module named 'junk'
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.08 seconds ============================

    def test_add_true():
        assert add(1, 1) == 2

但是,运行以下确实可以正常工作.

However, running the following does work fine.

p3; python -m pytest tests/
============================= test session starts ==============================
platform linux -- Python 3.4.5, pytest-3.4.1, py-1.5.2, pluggy-0.6.0
rootdir: /home/usr/tmp/junk, inifile:
collected 1 item

tests/test_ook.py .                                                      [100%]

=========================== 1 passed in 0.02 seconds ===========================

我做错了什么?

推荐答案

在项目根目录下放一个空的conftest.py文件即可:

Just put an empty conftest.py file in the project root directory:

$ pwd
/home/usr/tmp/junk
$ touch conftest.py

你的项目结构应该变成:

Your project structure should become:

junk
├── conftest.py
├── junk
│   ├── __init__.py
│   └── ook.py
└── tests
    └── test_ook.py

这里发生了什么:当 pytest 发现一个 conftest.py 时,它会修改 sys.path 以便它可以从 conftest 模块导入内容.因此,由于现在在 rootdir 中找到了一个空的 conftest.pypytest 将被迫将其附加到 sys.path.这样做的副作用是您的 junk 模块变得可导入.

What happens here: when pytest discovers a conftest.py, it modifies sys.path so it can import stuff from the conftest module. So, since now an empty conftest.py is found in rootdir, pytest will be forced to append it to sys.path. The side effect of this is that your junk module becomes importable.

这篇关于pytest 找不到模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 12:27