Несоответствие файла импорта в 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

Переименование одного файла сработало.

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