Я хочу загрузить все модульные тесты в дереве, это можно сделать? - PullRequest
0 голосов
/ 18 февраля 2009

У меня есть иерархическая папка, полная юнит-тестов Python. Все они являются импортируемыми ".py" файлами, которые определяют объекты TestCase. Эта папка содержит тысячи файлов во многих вложенных подкаталогах и была написана кем-то другим. У меня нет разрешения на его изменение, я просто должен его запустить.

Я хочу сгенерировать один объект TestSuite, который содержит все TestCases в папке. Есть ли простой и элегантный способ сделать это?

Спасибо

Ответы [ 3 ]

4 голосов
/ 18 февраля 2009

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

http://code.google.com/p/python-nose/ кажется домашней страницей.

По сути, вы хотите пройтись по дереву исходного кода (os.walk), используйте imp.load_module чтобы загрузить модуль, используйте unittest.defaultTestLoader, чтобы загрузить тесты из модуля в TestSuite, а затем используйте его так, как вам нужно.

Или, по крайней мере, это примерно то, что я делаю в своей пользовательской реализации TestRunner (bzr get http://code.liw.fi/coverage-test-runner/bzr/trunk).

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

Посмотрите на unittest.TestLoader (https://docs.python.org/library/unittest.html#loading-and-running-tests)

И os.walk (https://docs.python.org/library/os.html#files-and-directories)

Вы должны иметь возможность просматривать дерево пакетов, используя TestLoader для создания пакета, который затем можно запустить.

Что-то вроде этого.

runner = unittest.TextTestRunner()
superSuite = unittest.TestSuite()
for path, dirs, files in os.walk( 'path/to/tree' ):
    # if a CVS dir or whatever: continue
    for f in files:
        # if not a python file: continue
        suite= unittest.defaultTestLoader.loadTestsFromModule( os.path.join(path,f)
        superSuite .addTests(suite ) # OR runner.run( suite)
runner.run( superSuite )

Вы можете либо пройти по дереву, просто запустив каждый тест (runner.run(suite)) или , вы можете накопить superSuite всех отдельных наборов и запустить всю массу как один тест (runner.run( superSuite ) ).

Вам не нужно делать и то и другое, но я включил оба набора предложений в приведенный выше (непроверенный) код.

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

Тестовый каталог источника Python Library указывает путь. Файл README описывает, как писать регрессионные тесты Python для библиотечных модулей.

Модуль regrtest.py начинается с:

"""Regression test.

This will find all modules whose name is "test_*" in the test
directory, and run them.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...