Непревзойденное и динамичное создание Python тестовых примеров

Возможный дубликат:
Как создать динамические (параметризованные) модульные тесты в python?

Есть ли способ динамически создавать unittest тестовые примеры? Я пробовал следующее.

 class test_filenames(unittest.TestCase): def setUp(self): for category, testcases in files.items(): for testindex, curtest in enumerate(testcases): def thetest(): parser = FileParser(curtest['input']) theep = parser.parse() self.assertEquals(theep.episodenumber, curtest['episodenumber']) setattr(self, 'test_%s_%02d' % (category, testindex), thetest) 

.., который правильно создает все методы (они отображаются в каталоге dir() и являются вызываемыми), но детектор теста nosetest или nosetest выполняет их («Ran 0 tests in …»)

Поскольку я могу задавать неправильный вопрос – чего я пытаюсь достичь:

У меня есть файл, содержащий тестовые данные, список входных имен файлов и ожидаемые данные (упрощенные к episodenumber в приведенном выше коде), хранящиеся в словаре Python. Ключ – это категория, значение – это список тестовых примеров, например ..

 test_cases = {} test_cases['example_1'] = [ {'input': 'test.01', 'episodenumber': 1}, {'input': 'test.02', 'episodenumber': 2} ] test_cases['example_2'] = [ {'input': 'another.123', 'episodenumber': 123}, {'input': 'test.e42', 'episodenumber': 32} ] 

В настоящее время я просто перебираю все данные, вызываю self.assertEquals для каждого теста. Проблема в том, что если кто-то терпит неудачу, я не вижу остальных сбоев, поскольку они также сгруппированы в один тест, который прерывается, когда утверждение терпит неудачу.

Похоже, что вокруг этого, как я думал, будет (динамически) создавать функцию для каждого тестового примера, возможно, есть лучший способ?

3 Solutions collect form web for “Непревзойденное и динамичное создание Python тестовых примеров”

Для этого вы должны использовать тестовые генераторы в носу. Все, что вам нужно сделать, это получить кортеж, причем первым из них является функция, а остальное – args. Пример из документа – вот пример.

 def test_evens(): for i in range(0, 5): yield check_even, i, i*3 def check_even(n, nn): assert n % 2 == 0 or nn % 2 == 0 

В следующем решении Tests классов содержит check хелперного метода и статические значения не определены. Затем, чтобы динамически добавить тестовые примеры, я использую setattr для определения функций в классе. В следующем примере я генерирую тестовые примеры test_<i>_<j> с i и j, охватывая [1,3] и [2,5] соответственно, которые используют check вспомогательного метода с разными значениями i и j.

 class Tests(unittest.TestCase): def check(self, i, j): self.assertNotEquals(0, ij) for i in xrange(1, 4): for j in xrange(2, 6): def ch(i, j): return lambda self: self.check(i, j) setattr(Tests, "test_%r_%r" % (i, j), ch(i, j)) 

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

Python unittest: программировать множественные тесты?

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