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

Вот что я хочу сделать: я хочу создать набор тестов, который организован в пакеты, такие как 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 - лучший язык программирования в мире.