Библиотека ddt
была создана для того, чтобы точно решить, что вы просите unittest
[*].
Например:
import ddt
import unittest
@ddt.ddt
class EvalTests(unittest.TestCase):
@ddt.data(
('1', 1),
('1 == 1', True),
('1 == 2', False),
('1 + 2', 4), ## This will fail
)
def test_eval_expressions(self, case):
expr, exp_value = case
self.assertEqual(eval(expr), exp_value)
Ипри его запуске вы получаете 4 TestCases вместо одного:
$ python -m unittest -v test_eval.py
test_eval_expressions_1___1___1_ (test_eval.EvalTests) ... ok
test_eval_expressions_2___1__1___True_ (test_eval.EvalTests) ... ok
test_eval_expressions_3___1__2___False_ (test_eval.EvalTests) ... ok
test_eval_expressions_4___1_2___4_ (test_eval.EvalTests) ... FAIL
======================================================================
FAIL: test_eval_expressions_4___1_2___4_ (test_eval.EvalTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/lib/site-packages/ddt.py", line 129, in wrapper
return func(self, *args, **kwargs)
File "/Work/test_eval.py", line 15, in test_eval_expressions
self.assertEqual(eval(expr), exp_value)
AssertionError: 3 != 4
----------------------------------------------------------------------
Ran 4 tests in 0.002s
FAILED (failures=1)
Обратите внимание, что ddt пытается найти имена для сгенерированных TC.
Installэто с pip:
pip install ddt
[*] То же решение для pythonic pytest
framework (pytest.mark.parametrize
) интегрировано в основной инструмент и стоит перейти на pytest
только для этой функцииодин.