微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – pytest找不到模块

参见英文答案 > Ensuring py.test includes the application directory in sys.path                                    3个
我跟随pytest good practices或者至少我认为我是.但是,pytest无法找到我的模块.似乎不在PYTHONPATH中包含当前目录.

文件

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

测试文件

import pytest
from junk.ook import add


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

而shell输出的Python 3虚拟环境称为“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

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

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文件

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

您的项目结构应该成为:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐