classTestSequence(unittest.TestCase): deftestsample(self): for name, a,b in l: print"test", name self.assertEqual(a,b)
if __name__ == '__main__': unittest.main()
Недостатком этого является то, что он обрабатывает все данные в одном тесте. Я хотел бы сгенерировать один тест для каждого элемента "на лету". Есть предложения?
Переведено автоматически
Ответ 1
Это называется "параметризацией".
Существует несколько инструментов, поддерживающих этот подход. Например.:
deftest_generator(a, b): deftest(self): self.assertEqual(a,b) return test
if __name__ == '__main__': for t in l: test_name = 'test_%s' % t[0] test = test_generator(t[1], t[2]) setattr(TestSequense, test_name, test) unittest.main()
Example (the code below is the entire contents of the file containing the test):
param_list = [('a', 'a'), ('a', 'b'), ('b', 'b')]
deftest_generator(): for params in param_list: yield check_em, params[0], params[1]
defcheck_em(a, b): assert a == b
The output of the nosetests command:
> nosetests -v testgen.test_generator('a', 'a') ... ok testgen.test_generator('a', 'b') ... FAIL testgen.test_generator('b', 'b') ... ok
====================================================================== FAIL: testgen.test_generator('a', 'b') ---------------------------------------------------------------------- Traceback (most recent call last): File "/usr/lib/python2.5/site-packages/nose-0.10.1-py2.5.egg/nose/case.py", line 203, in runTest self.test(*self.arg) File "testgen.py", line 7, in check_em assert a == b AssertionError
---------------------------------------------------------------------- Ran 3 tests in 0.006s
As of Python 3.4, subtests have been introduced to unittest for this purpose. See the documentation for details. TestCase.subTest is a context manager which allows one to isolate asserts in a test so that a failure will be reported with parameter information, but it does not stop the test execution. Here's the example from the documentation:
classNumbersTest(unittest.TestCase):
deftest_even(self): """ Test that numbers between 0 and 5 are all even. """ for i inrange(0, 6): with self.subTest(i=i): self.assertEqual(i % 2, 0)