Подтвердить что ты не робот

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

Возможный дубликат:
Как создать динамические (параметризованные) модульные тесты в 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() и являются вызываемыми), но unittest test detector, или 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 для каждого теста. Проблема в том, что если один из них терпит неудачу, я не вижу остальных сбоев, поскольку они также сгруппированы в один тест, который прерывается, когда утверждение терпит неудачу.

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

4b9b3361

Ответ 1

Для этого вы должны использовать test generators в носу. Все, что вам нужно сделать, это получить кортеж, причем первым из них является функция, а остальное - 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

Ответ 2

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

class Tests(unittest.TestCase):
    def check(self, i, j):
        self.assertNotEquals(0, i-j)



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))