PytestWarning: модуль уже импортирован, поэтому не может быть переписан: pytest_remotedata - PullRequest
0 голосов
/ 02 января 2019

Я создал несколько модульных тестов и запустил их из одного файла.Для тестов в том же файле:

if __name__ == "__main__":
    import pytest
    pytest.main(['--tb=short', __file__])

Для тестов в другом файле:

if __name__ == '__main__':
    import pytest
    pytest.main(['./test_stuff.py', "--capture=sys"])

В любом случае, когда я запускаю файл в первый раз, он работает нормально, новторой и последующий раз он выдает кучу предупреждений:

============================== warnings summary ===============================
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754
  C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_remotedata
    self._mark_plugins_for_rewrite(hook)
  C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_openfiles
    self._mark_plugins_for_rewrite(hook)
  C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_doctestplus
    self._mark_plugins_for_rewrite(hook)
  C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_arraydiff
    self._mark_plugins_for_rewrite(hook)

-- Docs: https://docs.pytest.org/en/latest/warnings.html
==================== 1 passed, 4 warnings in 0.06 seconds 

Есть ли способ заставить эти предупреждения исчезнуть?

Перезапуск ядра работает, но IPython %reset и %clear недостаточно, чтобы это исправить.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Если вас интересуют только предупреждения, вы можете использовать аргумент --disable-warnings.Вы также можете отфильтровать только те предупреждения, которые вы получаете сейчас с аргументом --pythonwarnings=PYTHONWARNINGS в pytest.main.pytest --help имеет больше информации об этих аргументах.

Кажется, что вы запускаете pytest с ipython или jupyter.python.main импортирует специфичные для pytest модули во время инициализации pytest.Когда вы снова запустите pytest.main, он выдаст предупреждения.Существует два возможных способа перезагрузить pytest, чтобы избежать получения предупреждений об инициализации.

Вы можете использовать pytest.exit после pytest.main или перезагрузить pytest после pytest.main.

Дайте нам знать, если эти подходы работают.

0 голосов
/ 13 февраля 2019

Используйте subprocess вместо pytest.main:

if __name__ == "__main__":
    import subprocess
    subprocess.call(['pytest', '--tb=short', str(__file__)])

Если вышеописанное ничего не печатает, попробуйте обходной путь (как предложено в комментариях):

if __name__ == "__main__":
    from subprocess import Popen, PIPE
    with Popen(['pytest',
                '--tb=short',  # shorter traceback format
                str(__file__)], stdout=PIPE, bufsize=1,
                universal_newlines=True) as p:
        for line in p.stdout:
            print(line, end='')
0 голосов
/ 02 января 2019

Может показаться, что pytest просто не предназначен для повторных вызовов pytest.main() из одного и того же процесса.В документации pytest упоминается:

Вызов pytest.main () приведет к импорту ваших тестов и всех импортируемых ими модулей.Из-за механизма кэширования системы импорта python последующие вызовы pytest.main () из того же процесса не будут отражать изменения в этих файлах между вызовами.По этой причине делать несколько вызовов pytest.main () из одного и того же процесса (например, для повторного запуска тестов) не рекомендуется.

Так что на самом деле реальная опасность выполнения несколькихpytest.main() вызовов в рамках одного и того же процесса заключается в том, что вы можете получить ложноположительные или ложноотрицательные результаты теста, если вы отредактировали файлы кода между ними.

IDE Spyder имеет изящнуюЭта функция, кажется, сводит на нет эту проблему: Reloader модуля пользователя (UMR) .Если этот параметр включен, любые измененные пользовательские модули автоматически перезагружаются при повторном запуске файла сценария.

Поэтому я думаю, что пока вы работаете в Spyder (с включенной функцией UMR!), Вы можете безопасно перезапускать pytest.main() без необходимости в новой консоли.Модуль pytest уже импортировал предупреждения, которые вы можете просто подавить, так как эти модули Pytest не изменились.Это может быть сделано с помощью -W flag pytest .Пример:

if __name__ == '__main__':
    import pytest
    pytest.main(['./test_stuff.py', "--capture=sys", "-W", "ignore:Module already imported:pytest.PytestWarning"])
...