Это то, о чем я недавно думал.Да, это очень возможно сделать.Я назвал это сценарием тестирования , но я думаю, что параметризация может быть более точной.Я поставил доказательство концепции как суть здесь .Короче говоря, это мета класс, который позволяет вам определять сценарий и запускать тесты против него.С его помощью ваш пример может выглядеть примерно так:
class WidgetTestCase(unittest.TestCase):
__metaclass__ = ScenarioMeta
class widget_width(ScenerioTest):
scenarios = [
dict(widget_in=Widget("One Way"), expected_tuple=(50, 50)),
dict(widget_in=Widget("Another Way"), expected_tuple=(100, 150))
]
def __test__(self, widget_in, expected_tuple):
self.assertEqual(widget_in.size, expected_tuple)
При запуске метакласс записывает 2 отдельных теста, поэтому на выходе получится что-то вроде:
$ python myscerariotest.py -v
test_widget_width_0 (__main__.widget_width) ... ok
test_widget_width_1 (__main__.widget_width) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
Как вы можете видеть, сценарии преобразуются в тесты во время выполнения.
Теперь я еще не уверен, является ли это даже хорошей идеей.Я использую его в тестах, где у меня есть много текстовых случаев, которые повторяют одни и те же утверждения на немного разных данных, что помогает мне уловить небольшие крайние случаи.Но классы в этой сущности работают, и я считаю, что они достигают того, что вам нужно.
Обратите внимание, что с некоторыми хитростями тестовые примеры могут иметь имена и даже извлекаться из внешнего источника, например текстафайл или база данных.Это еще не задокументировано, но некоторые поиски в мета-классе помогут вам начать.На моем посте есть еще информация и примеры здесь .
Редактировать
Это уродливый хак, который я больше не поддерживаю.Реализация должна быть сделана как подкласс TestCase, а не как взломанный метакласс.Живи и учись.Еще лучшим решением было бы использование носовых генераторов .