В настоящее время я пишу несколько Webapp, но на этот раз я хочу научиться писать для него надлежащие тесты (используя pytest) :)pytest модули с использованием os.environ - Хо, я правильно его тестирую?
Очень часто встречающийся шаблон, который я часто вижу, заключается в том, чтобы изменить конфигурацию по умолчанию с использованием переменных среды , В настоящее время я борюсь, как правильно это проверить.
Я подготовил некоторые демо:
./app
./app/conf.py
./conftest.py
./run.py
./tests
./tests/test_demo.py
Мои ./app/conf.py
выглядит следующим образом:
from os import environ
DEMO = environ.get('DEMO', 'demo')
TEST = environ.get('TEST', 'test')
Запуск ./run.py
показывает, что параметры действительно изменчива:
from os import environ
environ['DEMO'] = 'not a demo'
environ['TEST'] = 'untested'
from app import conf
if __name__ == '__main__':
print(conf.DEMO)
print(conf.TEST)
It распечатывает not a demo
и untested
- как и ожидалось. Отлично. (Обратите внимание, что я установил переменные окружения перед импортом conf
).
Теперь к тестам: ./conftest.py
в настоящее время пуст, он просто помогает pytest находить модули внутри папки приложения.
./tests/test_demo.py
содержит следующее:
def test_conf_defaults():
from app import conf
assert conf.DEMO == 'demo'
assert conf.TEST == 'test'
def test_conf_changed(monkeypatch):
monkeypatch.setenv('DEMO', 'tested demo')
monkeypatch.setenv('TEST', 'demo test')
from app import conf
assert conf.DEMO == 'tested demo'
assert conf.TEST == 'demo test'
monkeypatch.undo()
Если я бегу pytest теперь test_conf_changed
терпит неудачу с 'demo' == 'tested demo'
-> функция monkeypatch не пропатчить среду.
Если я поменяю обе контрольные функции (так что сначала начинается test_conf_changed
), test_conf_defaults
не будет работать с 'tested demo' == 'demo'
.
Как интерпретировать его, это - первый раз conf
импортируется он прилипает там с его первоначальными настройками ..
Как я могу сказать pytest полностью реимпорт conf
каждую функцию тестирования, после настройки среды переменные?
Я застрял там в течение двух дней, теперь - и медленно я сомневаюсь, что если тестирование стоит хлопот - пожалуйста, доказать, что я неправильно :)
Я не уверен, чего вы хотите достичь: если вы хотите запускать тесты, вы запускаете 'py.test' и забираете все файлы' test_ * .py' и запускаете тесты внутри них. Если вы хотите иметь демоверсию, вы должны создать файл типа './Demos/demo.py' и запустить его в качестве демонстрации. Я не думаю, что любой из них (конечно, не pytest) должен зависеть от переменных окружения. – Evert
И да, когда вы импортируете 'conf', а переменные внутри conf-модуля устанавливаются внутри глобального пространства имен, они сохраняются: один импорт только во время всего запуска (сеанс python). Если вы хотите продолжать чтение или настройку env. переменные, создайте функцию в conf.py, например 'updateenv()', и запустите ее каждый раз, когда вам понадобятся из ваших других функций, для обновления переменных env. – Evert
Что я хочу достичь: config.py содержит настройки по умолчанию, но я хочу сделать их изменчивыми. например путь, где хранятся временные файлы и т. д. – spky