Рубрики
Без рубрики

ImportLib.reload для модулей отдыха между тестами

Модули Python можно рассматривать как синглтон дизайн-шаблон. Они инициализируются один раз, первый … Теги с Python, тестированием, программированием.

Модули Python можно рассматривать как синглтон дизайн-шаблон. Они инициализируются один раз, в первый раз, когда вы импортируете модуль в проекте с точки зрения переводчиков. В следующий раз, когда вы импортируете модуль, тот же экземпляр возвращается. Эта оптимизация имеет смысл, вы не хотите повторно скомпилировать весь модуль каждый раз, когда он импортируется. Однако одна общая критика против Singletons заключается в том, что им трудно проверить.

Итак, почему Singletons и, следовательно, модули Python трудно проверить? Читатели будут похожи:

О чем говорят Джокер о том, что модули Python не сложно проверить?

Успокойся, я объясню. Пока вы используете модули так же, как коллекция функций и классов, вы будете в порядке. Однако, когда вы представляете любой тип состояния в модуле, вы начнете чувствовать боль, когда вы пишете тесты. В идеале у нас были бы модули без гражданства, но это не всегда случай в реальном мире. Когда-либо написал сервер колба? Я почти могу гарантировать, что у вас есть какое-то состояние, запеченное в этот модуль. Вы можете проще провести тестирование модуля, например, нажав как большую часть функциональности в отдельные модули, которые могут быть проверены. Однако какое-то состояние более тонкое, как параметризованные декораторы.

Причина, по которой я пишу этот пост, теперь у меня была борьба с кэшированием декоратора на прошлой неделе. Он сохранил состояние из предыдущих тестов, вызвавших разрыв следующего теста. Это также означало, что каждый тест работает нормально при запуске в изоляции, но не удалось выполнить весь костюм. Веселые времена!

Следующим шагом было макет кэширования декоратора. Однако это не может быть сделано в модуле, используя декоратор, так как он применяется при импорте модуля. Это не дает мне время, чтобы поменять его, прежде чем он применяется. Вместо этого я должен поднять его внутри модуля, где я определяю декоратор. Опять же, это приведет к некоторым проблемам, что, если модуль, использующий декоратор, уже был импортирован? Это синглтон и, следовательно, будет использовать настоящий декоратор. Решение, ImportLib.reload который является частью стандартной библиотеки Python. Этот метод позволяет принудить перезагрузку модуля, который будет иметь тот же эффект, что и он был впервые импортировать.

Давайте посмотрим на короткий пример того, как Перезагрузка работает. Во-первых, мы создаем файл, my_module.py:

# my_module.py
x = 1

Во-вторых, у нас есть файл example.py:

# example.py
from importlib import reload
import my_module

print(f'Original: {my_module.x}')
my_module.x = 12
print(f'Changed: {my_module.x}')
reload(my_module)
print(f'Reloded: {my_module.x}')

Запуск example.py дает вывод:

Original: 1
Changed: 12
Reloded: 1

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

Теперь вернемся к кэшированию декоратора. На этот раз мы будем использовать импортное поведение в наше преимущество. В Python мы можем настинить исправления; Обмен классы, методы и функции во время выполнения, переопределяя их имя. Во-первых, мы обезьяна патч кэширующий декоратор, чтобы не кэшировать. Во-вторых, мы используем ìmportlib.reload Перезагрузить модуль с помощью декоратора. Когда модуль перезагружается, его импорт исправит версию кэширования декоратора. Теперь мы можем запустить весь номер с кэшированием.

Как я использую Pteest, я провел это поведение как часть setup_module Отказ Я также добавил перезагрузку модуля декоратора и тот, который использует его как часть Therdown_Module Сброс всего до их обычного поведения. Делая это, я содержал издевательную кэширование к одному модулю испытаний и может свободно проверить сам кэширование в другом тестовом модуле. Yaaay!

Оригинал: “https://dev.to/fronkan/importlib-reload-for-resting-modules-between-tests-neh”