в настоящее время я пишу какое-то Webapp, но на этот раз я хочу научиться писать для него правильные тесты (используя pytest) :)
Очень распространенный шаблон, который я часто вижу, - это изменение конфигурации по умолчанию с помощью переменных среды. В настоящее время я изо всех сил пытаюсь проверить это правильно.
Я подготовил демо:
./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)
Он распечатывает 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) должен зависеть от переменных среды. - person   schedule 18.06.2015conf
, а переменные внутри модуля conf устанавливаются внутри глобального пространства имен, они остаются неизменными: один импорт только во время всего запуска (сеанс python). Если вы хотите продолжить чтение или установить env. переменных, создайте функцию в conf.py, напримерupdateenv()
, и запускайте ее каждый раз, когда вам нужно из других функций, чтобы обновить переменные env. - person   schedule 18.06.2015