Python unittest:以编程方式生成多个测试?
我有一个要测试的函数under_test
,和一组预期的输入/输出对:
[
(2, 332),
(234, 99213),
(9, 3),
# ...
]
我希望这些输入/输出对中的每一个都可以用自己的test_*
方法进行测试。那可能吗?
这是我想要的,但是将每个输入/输出对强制进行单个测试:
class TestPreReqs(unittest.TestCase):
def setUp(self):
self.expected_pairs = [(23, 55), (4, 32)]
def test_expected(self):
for exp in self.expected_pairs:
self.assertEqual(under_test(exp[0]), exp[1])
if __name__ == '__main__':
unittest.main()
(此外,我是否真的想将self.expected_pairs
in的定义放在setUp
?)
更新: 尝试 doublep 的建议:
class TestPreReqs(unittest.TestCase):
def setUp(self):
expected_pairs = [
(2, 3),
(42, 11),
(3, None),
(31, 99),
]
for k, pair in expected_pairs:
setattr(TestPreReqs, 'test_expected_%d' % k, create_test(pair))
def create_test (pair):
def do_test_expected(self):
self.assertEqual(get_pre_reqs(pair[0]), pair[1])
return do_test_expected
if __name__ == '__main__':
unittest.main()
这是行不通的。运行0个测试。我是否对示例进行了错误的修改?
-
未经测试:
class TestPreReqs(unittest.TestCase): ... def create_test (pair): def do_test_expected(self): self.assertEqual(under_test(pair[0]), pair[1]) return do_test_expected for k, pair in enumerate ([(23, 55), (4, 32)]): test_method = create_test (pair) test_method.__name__ = 'test_expected_%d' % k setattr (TestPreReqs, test_method.__name__, test_method)
我猜如果经常使用它,可以使用实用程序功能和/或装饰器来美化它。请注意,
TestPreReqs
在此示例中,对不是对象的属性(因此setUp
消失了)。相反,它们在某种意义上是“硬连线”的TestPreReqs
。