PyTest — вход в производственный код

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

Этот модуль импортирует другой модуль под названием LogFactory, который обрабатывает регистраторы и конфигурацию ведения журналов.

простоймодуль.py

from log import LogFactory

log = LogFactory.getlogger(__name__)

def decrypt(pass, key):
   #magic
   log.debug(message)

Проблема возникает здесь. Конфигурация ведения журнала передается в виде файла INI в модуль ведения журнала в модуле LogFactory. Общий код Python запускается сценарием оболочки, который заменяет определенные записи в файле INI перед запуском модуля Python. Так что в производстве все складывается гладко.

Проблема в том, что когда pytest импортирует первый производственный код, он сталкивается с ошибкой, когда значения, необходимые регистратору, не заменяются сценарием оболочки.

test_simplemodule.py

import simplemodule <----- ERROR, needed values absent from the INI

def test_decryption():
   #test code

Я пока пишу тесты без записей в журнале. Но мне нужно в конечном итоге включить эти записи журнала позже.

1) Что я делаю неправильно с точки зрения дизайна, когда дело доходит до входа в служебные методы? Я чувствую, что ошибка в производственном коде, так как я не могу правильно написать для него модульный тест.

2) Я попробовал Monkeypatching, но понял, что ошибка возникает при импорте производственного кода.

3) Какова стандартная практика в такой ситуации? Отказаться от модульного тестирования и перейти к какой-то конечной автоматизации?


person chamilad    schedule 20.10.2014    source источник


Ответы (1)


Итак, во-первых, это, кажется, указывает на то, что вы, возможно, захотите реорганизовать код ведения журнала, чтобы он не выполнял какие-либо действия в качестве побочного эффекта импорта. Как вы только что узнали, выполнение всего во время импорта может вам навредить.

Как только это будет отсортировано, вы сможете легко создать приспособление для автоматического использования, которое создает (фиктивный) экземпляр регистратора, который будет вызываться во время тестирования. Это может быть так же просто, как все ведение журнала — это noop, или хранить его для проверки в тестовых утверждениях (см. pytest-capturelog для вдохновения приспособления, которое делает это для ведения журнала stdlib).

Если вы действительно не можете реорганизовать свой модуль ведения журнала, чтобы он вел себя, вы, вероятно, могли бы обойти это, создав правильный файл INI в хуке pytest_configure() (и вернуть его в pytest_unconfigure(), этот хук будет вызываться до того, как py.test выполнит свою тестовую сборку, поэтому перед любые попытки импорта.

person flub    schedule 20.10.2014
comment
Спасибо @flub за предложения. Я не думаю, что смогу отклонить инициализацию при импорте, но я посмотрю еще раз. Я чувствую, что то, что вы указываете здесь, более значимо. - person chamilad; 20.10.2014