2015-06-18 1 views
2

В настоящее время я пишу несколько 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 каждую функцию тестирования, после настройки среды переменные?

Я застрял там в течение двух дней, теперь - и медленно я сомневаюсь, что если тестирование стоит хлопот - пожалуйста, доказать, что я неправильно :)

+0

Я не уверен, чего вы хотите достичь: если вы хотите запускать тесты, вы запускаете 'py.test' и забираете все файлы' test_ * .py' и запускаете тесты внутри них. Если вы хотите иметь демоверсию, вы должны создать файл типа './Demos/demo.py' и запустить его в качестве демонстрации. Я не думаю, что любой из них (конечно, не pytest) должен зависеть от переменных окружения. – Evert

+0

И да, когда вы импортируете 'conf', а переменные внутри conf-модуля устанавливаются внутри глобального пространства имен, они сохраняются: один импорт только во время всего запуска (сеанс python). Если вы хотите продолжать чтение или настройку env. переменные, создайте функцию в conf.py, например 'updateenv()', и запустите ее каждый раз, когда вам понадобятся из ваших других функций, для обновления переменных env. – Evert

+0

Что я хочу достичь: config.py содержит настройки по умолчанию, но я хочу сделать их изменчивыми. например путь, где хранятся временные файлы и т. д. – spky

ответ

2

Спасибо за подсказку, Эверт (переменных внутри модуля конфа устанавливается внутри глобальное пространство имён, они придерживаются). Думаю, я получил его сейчас.

Чтобы проверить свой код, я должен явно переустановить conf после установки переменных окружения. Изменение кода в ./tests/test_demo.py на это делает трюк:

from importlib import reload 

from app import conf 


def test_conf_changed(monkeypatch): 
    monkeypatch.setenv('DEMO', 'tested demo') 
    monkeypatch.setenv('TEST', 'demo test') 

    reload(conf) 

    assert conf.DEMO == 'tested demo' 
    assert conf.TEST == 'demo test' 


def test_conf_defaults(): 

    reload(conf) 

    assert conf.DEMO == 'demo' 
    assert conf.TEST == 'test' 

Спасибо.

Смежные вопросы