pytest не может найти модуль

Я следую наилучшим практикам pytest или, по крайней мере, мне так кажется. Однако 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

И вывод оболочки с виртуальной средой 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 ===========================

Что я делаю неправильно?

2 ответа

Решение

Просто поставь пустой 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. Итак, теперь пустой conftest.py находится в rootdir, pytest будет вынужден добавить его к sys.path, Побочным эффектом этого является то, что ваш junk модуль становится импортируемым.

Просто добавь __init__.py к tests каталог, и все каталоги внутри него, которые содержат тестовые файлы.

Другие вопросы по тегам