PyUnit с переменным количеством тестов

Что я хотел бы сделать, так это создать папку, куда люди могут поместить файл для тестирования, и чтобы pyunit автоматически расширялся, чтобы запускать тест как отдельный тест. В настоящее время я делаю следующее:

class TestName(unittest.testcase):
    def setUp(self):
        for file in os.listdir(DIRECTORY):
            # Setup Tests

    def test_comparison(self):
        for file in os.listdir(DIRECTORY):
            # Run the tests

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName),
])

if __name__ == "__main__":
    unittest.TextTestRunner(verbosity=2).run(suite())

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

def setUp(self, filepath):
    # Do stuff

Затем я мог бы поместить цикл в основной фрагмент кода и запустить тесты следующим образом:

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestName, file),
])

if __name__ == "__main__":
    for file in DIRECTORY:
        unittest.TextTestRunner(verbosity=2).run(suite(file))

Но я не уверен, как это сделать, почти не переписав дырочный класс unittest.TestCase(). Могу ли я это сделать каким-либо другим способом, или есть ли другой способ получить динамически расширяющийся набор тестов/тестовых случаев в зависимости от того, сколько файлов находится в папке? Спасибо.


person Leif Andersen    schedule 29.06.2010    source источник


Ответы (3)


Вы можете использовать поддержку nose для генераторы тестов. Это будет выглядеть примерно так:

def test_comparison():
    for file in os.listdir(DIRECTORY):
        yield run_cmp_test, file

def run_cmp_test(file):
    # Run the tests

В качестве альтернативы вы также можете использовать funcargs в py.test.

person Mark Roddy    schedule 29.06.2010
comment
Они выглядят как инструменты для обнаружения модульных тестов. Возможно, мне следует уточнить, что файлы, которые будут помещены в папку, представляют собой файлы данных (двоичные файлы и изображения), которые можно обрабатывать по стандартному алгоритму. Поэтому, если для каждого файла не написан отдельный тест, я не понимаю, как это можно использовать. - person Leif Andersen; 29.06.2010
comment
Ах хорошо. Я не понял этого из исходного вопроса. Итак, вы пытаетесь решить проблему «для x в y: test(x)», когда тест не проходит для определенного «x», но вы хотите, чтобы он выполнялся для всех в «y» независимо? - person Mark Roddy; 29.06.2010
comment
В основном да. Я также хотел бы вывести это пользователю в формате, аналогичном отдельным тестам, но это тривиально сделать, как только я запущу это и заработаю. Спасибо. - person Leif Andersen; 29.06.2010

Ладно, кажется, я нашел ответ на свой вопрос. Я бы сказал, что использовал глобальные пространства имен, но по какой-то причине мои обычные знания о пространствах имен не оправдались.

class TestImage(unittest.TestCase)
    pass #Do stuff, as well as using the filename variable

def suite():
    return unittest.TestSuite([
unittest.TestLoader().loadTestsFromTestCase(TestImage),
])

if __name__ == "__main__":
    for filename in os.listdir(sys.path[0]):
        unittest.TextTestRunner(verbosity=2).run(suite())

Это запустит тестовый пример для каждого имени файла в каталоге. (и имя папки). Хотя я понятия не имею, почему я могу использовать имя файла в классе unittest. Это должно иметь какое-то отношение к тому, как эти макросы загружают и запускают класс.

person Leif Andersen    schedule 30.06.2010

Вы можете сделать это с помощью модуля testscenarios, что-то вроде этого :

class MyTest(unittest.TestCase):

    scenarios = [os.listdir(sys.path[0])]

    ...
person poolie    schedule 06.01.2014