Получение списка всех модулей в текущем пакете

Вот что я хочу сделать: я хочу создать набор тестов, который организован в пакеты, такие как tests.ui, tests.text, tests.fileio и т. Д. В каждом __ init __ .py в этих пакетах я хочу сделать тест набор, состоящий из всех тестов во всех модулях в этом пакете. Конечно, получить все тесты можно с помощью unittest.TestLoader, но кажется, что я должен добавить каждый модуль отдельно. Предположим, что test.ui имеет редактор _ window_ test.py и preview_ window_ test.py, я хочу, чтобы __ init __ .py импортировал эти два файла и получил список двух объектов модуля. Идея состоит в том, что я хочу автоматизировать создание тестовых наборов, чтобы не забыть включать что-то в набор тестов.

Каков наилучший способ сделать это? Похоже, это было бы легко сделать, но я ничего не нахожу.

Я использую Python 2.5 битв.

3 Solutions collect form web for “Получение списка всех модулей в текущем пакете”

Хорошие ответы здесь, но лучше всего было бы использовать стороннее тестовое открытие и бегун, как:

  • Нос (мой любимый)
  • Судебное разбирательство (довольно приятно, особенно при тестировании асинхронных материалов)
  • py.test (менее хороший, на мой взгляд)

Все они совместимы с обычным unittest.TestCase, и вам не придется каким-либо образом модифицировать ваши тесты, и вам не придется использовать расширенные функции в любом из них. Просто используйте как открытие набора.

Есть ли конкретная причина, по которой вы хотите изобрести неприятные вещи в этих библиотеках?

Решение именно этой проблемы из нашего проекта django:

 """Test loader for all module tests """ import unittest import re, os, imp, sys def find_modules(package): files = [re.sub('\.py$', '', f) for f in os.listdir(os.path.dirname(package.__file__)) if f.endswith(".py")] return [imp.load_module(file, *imp.find_module(file, package.__path__)) for file in files] def suite(package=None): """Assemble test suite for Django default test loader""" if not package: package = myapp.tests # Default argument required for Django test runner return unittest.TestSuite([unittest.TestLoader().loadTestsFromModule(m) for m in find_modules(package)]) if __name__ == '__main__': unittest.TextTestRunner().run(suite(myapp.tests)) 

EDIT: Преимущество по сравнению с решением bialix заключается в том, что вы можете разместить этот загрузчик anytwhere в дереве проекта, нет необходимости изменять init .py в каждом тестовом каталоге.

Вы можете использовать os.listdir, чтобы найти все файлы в тестовом каталоге. *, А затем отфильтровать файлы .py:

 # Place this code to your __init__.py in test.* directory import os modules = [] for name in os.listdir(os.path.dirname(os.path.abspath(__file__))): m, ext = os.path.splitext() if ext == '.py': modules.append(__import__(m)) __all__ = modules 

Волшебная переменная __file__ содержит __file__ текущего модуля. Пытаться

 print __file__ 

Проверять.

Python - лучший язык программирования в мире.