Файлы `py.test` и` __init __. py` - PullRequest
6 голосов
/ 23 ноября 2011

Я думал, что py.test является «автономным» в том смысле, что он обрабатывает test_*.py файлы «как есть» и импортирует только модули, указанные в этих файлах, без учета каких-либо окружающих файлов.Похоже, я не прав.Вот мой диалог с py.test:

$ ls
__init__.py    test_pytest.py
$ cat __init__.py 
$ cat test_pytest.py 
def test_pytest():
    assert True
$ py.test test_pytest.py 
========================================================= test session starts ==========================================================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

================================================================ ERRORS ================================================================
___________________________________________________ ERROR collecting test_pytest.py ____________________________________________________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
======================================================= 1 error in 0.01 seconds ========================================================
$ rm __init__.py 
$ py.test test_pytest.py 
========================================================= test session starts ==========================================================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

test_pytest.py .

======================================================= 1 passed in 0.01 seconds =======================================================
$ 

Как мне заставить py.test работать и сохранять мои __init__.py файлы?

UPDATE

В комментариях Хольгер Крекел спросил, как называется родительский каталог.И получается, что я могу воспроизвести ошибку выше, только имея определенное имя родительского каталога (например, такое же имя, как у одного из установленных пакетов, например distutils).Смотрите здесь:

~/test_min 
$ tree
.
└── distutils
    ├── __init__.py
    └── test_pytest.py

1 directory, 2 files
~/test_min 
$ cat distutils/__init__.py 
~/test_min 
$ cat distutils/test_pytest.py 
def test_pytest():
    assert True
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

=============================== ERRORS ===============================
_____________ ERROR collecting distutils/test_pytest.py ______________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
====================== 1 error in 0.01 seconds =======================
~/test_min 
$ rm distutils/__init__.py 
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

distutils/test_pytest.py .

====================== 1 passed in 0.01 seconds ======================
~/test_min 
$ touch __init__.py
~/test_min 
$ ls
__init__.py distutils
~/test_min 
$ touch distutils/__init__.py
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

distutils/test_pytest.py .

====================== 1 passed in 0.02 seconds ======================
~/test_min 
$ rm __init__.py 
~/test_min 
$ py.test distutils/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 0 items / 1 errors 

=============================== ERRORS ===============================
_____________ ERROR collecting distutils/test_pytest.py ______________
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/py-1.4.5-py2.7.egg/py/_path/local.py:529: in pyimport
>           mod = __import__(modname, None, None, ['__doc__'])
E           ImportError: No module named test_pytest
====================== 1 error in 0.01 seconds =======================
~/test_min 
$ mv distutils foobar
~/test_min 
$ py.test foobar/test_pytest.py 
======================== test session starts =========================
platform darwin -- Python 2.7.2 -- pytest-2.1.3
collected 1 items 

foobar/test_pytest.py .

====================== 1 passed in 0.01 seconds ======================
~/test_min 
$ 

Надеюсь, эта дополнительная информация поможет.

Ответы [ 3 ]

13 голосов
/ 09 декабря 2011

Похоже, что py.test использует py._path.pyimport для открытия вашего файла. Если в каталоге есть файл __init__.py, он обрабатывает ваш файл как модуль, в противном случае он открывает файл. Короче говоря, удалите __init__.py или поместите ваши тесты в другой каталог за пределами кода вашего проекта (<--- хорошая идея). </p>

http://doc.pylib.org/en/latest/_modules/py/_path/local.html#LocalPath.pyimport

4 голосов
/ 06 декабря 2011

Я действительно предлагаю вам переименовать каталог во что-то, что не называется "distutils".Зачем ?Потому что вы переопределяете существующий модуль.Когда в скрипте появляются «import distutils» или «from distutils import *» (из другого импорта или из вашего собственного файла python), он предпочитает ваш каталог вместо системного.Если модуль distutils уже был загружен ранее, ваши distutils не будут загружены, потому что символ уже существует в global ().

Было бы действительно проще переименовать этот каталог (например, тесты) вместо того, чтобы пытатьсябороться с py.text / python внутренностями.

2 голосов
/ 25 марта 2014

Вы можете указать pytest игнорировать определенные файлы или шаблоны глобусов, как описано здесь . Поместите файл conftest.py в корневой каталог вашего проекта, в котором перечислены файлы, которые вы хотите pytest игнорировать:

Однако у многих проектов есть файл setup.py, который они не хотят импортировать.Более того, файлы могут импортироваться только конкретной версией Python.В таких случаях вы можете динамически определять файлы, которые нужно игнорировать, перечисляя их в файл conftest.py:


 # content of conftest.py
 import sys

 collect_ignore = ["setup.py"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...