Тестирование подпакетных модулей в Python 3 - PullRequest
1 голос
/ 17 декабря 2009

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

    MyApp  
        __init__.py  
        Application  
            __init__.py  
            Module1  
            Module2  
            ...  
        Domain  
            __init__.py  
            Module1  
            Module2  
            ...  
        UI  
            __init__.py  
            Module1  
            Module2  
            ...  

Я хочу иметь возможность сделать следующее:

  1. Запустите тестовый код в модуле "if main ", когда модуль импортирует из других модулей в том же каталоге.
  2. В каждом подпакете есть один или несколько модулей тестового кода, которые запускают модульные тесты для модулей в подпакете.
  3. Иметь набор модульных тестов, которые находятся в каком-то разумном месте, но за пределами подпакетов, либо в одноуровневом пакете, либо в пакете верхнего уровня, либо вне пакета верхнего уровня (хотя все это может закончиться тем, что выполняется тесты в каждом подпакете)
  4. «Введите» структуру с любого из трех уровней подпакета, например, запускать код, который использует только модули Domain, запускать код, который использует только модули Application, но Application использует код из модулей Application и Domain, а выполнять код из GUI использует код из GUI и Application; например, тестовый код приложения будет импортировать модули приложения, но не модули домена.
  5. После разработки основной части кода без подпакетов продолжите разработку и тестирование после организации модулей в этой иерархии.

Я знаю, как использовать относительный импорт, чтобы внешний код, который помещает MyApp в свой sys.path, мог импортировать MyApp, импортировать любые необходимые ему подпакеты и импортировать вещи из своих модулей, в то время как модули в каждом подпакете могут импортировать другие модули из тот же подпакет или из родственных пакетов. Однако перечисленные выше потребности в разработке кажутся несовместимыми со структурированием подпакетов - иными словами, у меня не может быть двух вариантов: хорошо структурированная многоуровневая иерархия пакетов, используемая извне, а также используемая изнутри, в частности для тестирования но также потому, что модули с одного уровня разработки (в частности, пользовательского интерфейса) не должны импортировать модули с уровня разработки ниже следующего уровня.

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012

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

Как насчет наличия функции test в каждом подпакете или -модуля и одного скрипта тестирования, который импортирует функции тестирования из всех подпакетов и выполняет их?

0 голосов
/ 30 декабря 2009

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

...