Получение списка всех модулей в текущем пакете - PullRequest
0 голосов
/ 17 февраля 2009

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

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

Я использую Python 2.5, кстати.

Ответы [ 3 ]

2 голосов
/ 17 февраля 2009

Решение именно этой проблемы из нашего проекта 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))

РЕДАКТИРОВАТЬ: Преимущество по сравнению с решением bialix заключается в том, что вы можете разместить этот загрузчик в любом месте дерева проекта, нет необходимости изменять init .py в каждом тестовом каталоге.

2 голосов
/ 17 февраля 2009

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

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

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

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

1 голос
/ 17 февраля 2009

Вы можете использовать os.listdir, чтобы найти все файлы в каталоге test. *, А затем отфильтровать файлы .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__ содержит путь к файлу текущего модуля. Попробуйте

print __file__

проверить.

...