Подтвердить что ты не робот

Проверить, выполняется ли код из сеанса py.test

Я хотел бы подключиться к другой базе данных, если мой код работает под py.test. Есть ли функция для вызова или переменная среды, которую я могу проверить, которая скажет мне, запущена ли я в сеансе py.test? Какой лучший способ справиться с этим?

4b9b3361

Ответ 1

Решение пришло из RTFM, хотя и не в очевидном месте. В руководстве также была ошибка в коде, исправленная ниже.

Определить, работает ли из-за пробного запуска

Обычно плохая идея заставить код приложения вести себя иначе, если он вызывается из теста. Но если вам абсолютно необходимо выяснить, выполняется ли код вашего приложения из теста, вы можете сделать что-то вроде этого:

# content of conftest.py
def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys  # This was missing from the manual
    del sys._called_from_test

а затем проверьте наличие флага sys._called_from_test:

if hasattr(sys, '_called_from_test'):
    # called from within a test run
else:
    # called "normally"

соответственно в вашем приложении. Также неплохо использовать собственный модуль приложения, а не sys для обработки флага.

Ответ 2

Более простое решение, к которому я пришел:

import sys

if "pytest" in sys.modules:
    ...

Pytest runner всегда загружает модуль pytest, делая его доступным в sys.modules.

Конечно, это решение работает только в том случае, если код, который вы пытаетесь проверить, не использует сам pytest.

Ответ 3

Работа с pytest==4.3.1 вышеописанными способами не удалась, поэтому я просто пошел в старую школу и проверил:

if 'pytest' in sys.argv[0]:
  print('pytest was called!')

Ответ 4

Это можно сделать, установив переменную среды внутри кода тестирования. Например, данный проект

conftest.py
mypkg/
    __init__.py
    app.py
tests/
    test_app.py

В test_app.py вы можете добавить

import os
os.environ['PYTEST_RUNNING'] = 'true'

А потом вы можете проверить внутри app.py:

import os
if os.environ.get('PYTEST_RUNNING', '') == 'true':
    print('pytest is running')

Ответ 5

Хотя хак, объясненный в другом ответе (http://pytest.org/latest/example/simple.html#detect-if-running-from-within-a-pytest-run), действительно работает, вы, вероятно, могли бы разработать кода таким образом, что вам не нужно будет это делать.

Если вы создаете код, чтобы заставить базу данных так или иначе подключаться как аргумент, через соединение или что-то еще, тогда вы можете просто ввести другой аргумент, когда вы запускаете тесты, а затем, когда приложение управляет этим. Ваш код в конечном итоге будет иметь более низкое глобальное состояние и более модульный и многоразовый. Так что для меня это похоже на пример, когда тестирование заставляет вас лучше разрабатывать код.