Pytest-django: Предоставьте способ определить, выполняет ли Django тесты

Созданный на 6 мая 2016  ·  9Комментарии  ·  Источник: pytest-dev/pytest-django

Было бы неплохо сделать что-нибудь вроде:

if settings.TESTING:
    print("py.test is being ran")

Самый полезный комментарий

"pytest" in sys.modules ?

Все 9 Комментарий

"pytest" in sys.modules ?

Вы можете сами добавить настройку отдельным файлом настроек для тестов.

Я думаю, что подходов, предложенных @blueyed и @adamchainz, должно быть достаточно, если это необходимо. Как правило, не рекомендуется изменять способ работы вашего кода путем самоанализа, вызывается ли код из тестов. Если бы это было сделано, это можно было бы сделать обычным способом pytest (на самом деле это не относится к pytest-django). Благодарим за предложение, не стесняйтесь открывать этот вопрос повторно, если у вас есть дополнительная информация по этому вопросу!

Соответствующий пример из документации pytest. Обнаружение при запуске из цикла pytest :

# content of conftest.py

def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys
    del sys._called_from_test

Проблема в том, что pytest_configure запускается после settings.py . Есть ли способ запустить этот код до settings.py ?

@axil
Что плохого в использовании 'pytest' in sys.modules ?

Хм, да, заработало, хотя для меня это выглядит немного хакерским.

Еще один быстрый и грязный способ проверить это в settings.py -

TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

@axil
Что плохого в использовании 'pytest' in sys.modules ?

Тот факт, что pytest импортирован, не означает, что pytest запущен и код вызывается из теста. По сути, один мой импорт pytest для чего-то другого. Также pytest импортирует pytest даже если он просто показывает справку CLI: pytest --help

Вот очень допустимый вариант использования:
У меня есть настройка django, настраиваемая с помощью локальных файлов и переменных, в которые помещаются различные учетные данные и другая локальная конфигурация env dev. Но я хочу, чтобы мои модульные тесты никогда не использовали эти учетные данные или определенные настройки, чтобы случайно не использовать их в какой-либо реальной системе (если неправильно имитировали) или пройти / не пройти в локальной конфигурации dev env. Поэтому я хочу, чтобы эти локальные настройки были исключены при запуске с pytest.

У меня что-то вроде:

import os
import os.path
import sys

from split_settings.tools import include, optional


def is_pytest_running():
    return (os.getenv('PYTEST_RUNNING') == 'true' or
            os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))


ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'

local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')

includes = [
    'base.py',
    'logging.py',
    'custom.py',
]

if not is_pytest_running():
    includes.append(optional(local_settings_path))
    includes.append('envvars.py')

include(*includes)

Использование os.getenv('PYTEST_RUNNING') == 'true' - более или менее чистый способ сделать это, но проблема заключается в установке этой переменной. Установка его в conftest.py не работает, потому что pytest-django импортирует настройки до выполнения conftest.py. Установка его в командной строке при запуске pytest неудобна, а также противоречит цели: если кто-то забудет установить его, будут использоваться настоящие учетные данные из локальной конфигурации dev env.

os.path.basename (sys.argv [0]) в ('pytest', 'py.test')

Мне пришлось изменить его на os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test') поскольку sys.argv[0] выходило как /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги