Мгновенное действие Python unittest.TestCase с аргументами

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

TestCase:

class TestOdd(unittest.TestCase):
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( NUMBER %2==1, "Number should be odd")

Тест suite:

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(TestOdd())
    # I would like to have:
    # suite.addTest(TestOdd(1))
    # suite.addTest(TestOdd(2))
    # suite.addTest(TestOdd(3))
    # ...
    unittest.main()

Как я могу создать экземпляр объекта TestOdd с аргументом - например, номер, который нужно проверить?

Обновление: согласно сообщению в блоге с 2011 года (опубликовано как ответ), нет встроенного механизма параметризованных тестов. Я буду рад принять любые более чистые решения.

Ответ 1

То же самое можно достичь с помощью атрибутов класса.

class TestOdd1(unittest.TestCase):
    NUMBER=1
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

class TestOdd2(TestOdd1):
    NUMBER=2

if __name__ == '__main__':
    unittest.main()

Unittesting обнаружит их автоматически, поэтому нет необходимости создавать пакет.

Если вы хотите избежать использования TestCase для базового класса, вы можете использовать множественное наследование:

from unittest import TestCase, main

class TestOdd:
    def runTest(self):
        """Assert that the item is odd"""
        self.assertTrue( self.NUMBER % 2 == 1, "Number should be odd")

class TestOdd1(TestOdd, TestCase):
    NUMBER=1
class TestOdd2(TestOdd, TestCase):
    NUMBER=2

if __name__ == '__main__':
    main()

Ответ 2

В соответствии с "модульным тестированием Python: параметризованные тестовые примеры", опубликованным в блоге Eli Bendersky:

Стандартная библиотека unittest Pythons отличная, и я использую ее все время. Однако одна вещь, отсутствующая в нем, - это простой способ работы параметризованные тестовые примеры. Другими словами, вы не можете легко пройти аргументы в unittest.TestCase извне.

Решение Eli наследует unittest.TestCase в ParametrizedTestCase. Я не уверен в вопросах авторского права, поэтому я не буду копировать код здесь.

Если есть какое-то лучшее решение, я буду рад принять его.