2009-12-17 2 views
1

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

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

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

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

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

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

ответ

-1

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

+0

Должен быть абсолютный импорт, прежде чем модули могут относиться друг к другу относительно. Программа test.py в модуле приложения не может импортировать из .module1, а также не импортировать из .Domain.Module2: я бы получил ошибки «Попытка относительного импорта в непакете». Лучшее, что я мог бы сделать, было бы, чтобы тестовый код добавлял «..» в sys.path и делал его импорт, ссылаясь на приложение.Module1 и т. Д. При импортированном приложении Module1 может импортировать из .Module2. Однако ни один из них не может ссылаться на .domain.Module1. Для этого test.py пришлось бы поместить ../ .. в путь и импортировать из MyApp.Application. –

+0

И почему вы не хотите использовать абсолютный импорт в первую очередь? Они прекрасны. –

+0

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

0

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

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

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