Несоответствие файла импорта в pytest
У меня есть файл в пакете с именем "test", и когда я запускаю pytest, я получаю сообщение об ошибке
import file mismatch:
imported module 'my_project.my_file_test' has this __file__ attribute:
/my_project/src/my_project/build/lib/python2.7/site-packages/foo/my_file_test.py
which is not the same as the test file we want to collect:
/my_project/src/my_project/build/private/python2.7/lib/foo/my_file_test.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
Если я удаляю 'test' из файла, он работает нормально, но, к сожалению, я не могу его изменить.
Итак, вопрос в том, как сказать pytest, чтобы он игнорировал этот файл?
8 ответов
Наконец, это было легко, мне просто нужно было добавить шаблон тестового файла в pytest.ini
файл
python_files = test_*.py
поэтому pytest перестал искать файлы с test
в конце названия что делал по умолчанию.
В моем случае его не было __init__.py
файл в каталоге тестов.
Рабочее решение от Pytest Issues 3151
Точные котировки решателя ниже:
Это происходит из-за того, что ваши тестовые файлы имеют одно и то же имя в двух разных каталогах, и они импортируются в глобальное пространство имен, потому что нет файлов `init; в документах есть более подробное объяснение.
В этом случае вы можете либо создать
case/__init__.py
иpytest/__init__.py
файлы или переименовать тестовые файлы с уникальными именами.
Кроме того, если возможно, попробуйте изменить имена ваших тестовых файлов.
Как объясняет pytest:
По историческим причинам pytest по умолчанию использует режим импорта с добавлением вместо режима импорта importlib, который мы рекомендуем для новых проектов. Причина кроется в том, как работает режим добавления.
См. https://docs.pytest.org/en/7.1.x/explanation/goodpractices.html#choosing-an-import-mode
и https://docs.pytest.org/en/7.1.x/explanation/pythonpath . .html#import-modes
По сути, это означает, что при использовании старыхprepend
(по умолчанию) тесты импортируются как пакеты, поэтому вам необходимо__init__.py
файлы внутри тестовых папок.
Решение, определенное pytest по указанным ссылкам:
[tool.pytest.ini_options]
addopts = "--import-mode=importlib"
С этим,importlib
используется для сбора тестов и, следовательно,__ini__.py
файлы больше не нужны, и тестовые файлы могут иметь общие имена (всегда находящиеся в разных папках).
В моем случае я получал сообщение об ошибке, потому что мне не хватало__init__.py
файл не в каталоге тестов, а в каталоге над ним.
Я столкнулся с той же проблемой, хотя имя моего файла не было таким же, как у другого.
я имел
test_01_login_chrome.py
и
test_01_login_firefox.py
Я получал ошибку
import file mismatch:
imported module 'test_01_login_chrome.py' has this __file__ attribute:
/Users/avicii/PycharmProjects/Omni_Sanity/TestCase/Firefox_TestCases/test_01_login_chrome.py
which is not the same as the test file we want to collect:
/Users/avicii/PycharmProjects/Omni_Sanity/TestCase/01_Chrome_TestCases/test_01_login_chrome.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
Я пробовал добавить
__init__.py
в папку тестовых случаев, и это не сработало.
Затем я попробовал обходной путь. Я создал пакет python для своих тестовых примеров, который создал
__init__.py
по умолчанию, а затем переместил мои тестовые примеры в эту папку.
И моя проблема была решена.
Небольшая вариация этого случая с использованием_pytester_
плагин в комплекте_pytest_
(что дает ту же ошибку.)
В плагине есть функция, которая позволяет размещать примеры тестов в корне вашего проекта (вне пакета), и эти тесты могут быть скопированы во временную директорию тестов через_pytester.copy_example()_
.
Эту функцию можно использовать как тестовый загрузчик, а также как способ тестирования примеров.
Если вы используете эту функцию, вы также захотите поставить\_\_init\_\_.py
в исходный каталог для ваших примеров.
Например: при копировании примера из каталога примеров :
pytester.copy_example("examples/test_zfs.py")
Чтобы избежать ошибки несоответствия файла импорта:
$ touch examples/__init__.py