我有一个要测试的函数under_test,和一组预期的输入/输出对:
under_test
[ (2, 332), (234, 99213), (9, 3), # ... ]
我希望这些输入/输出对中的每一个都可以用自己的test_*方法进行测试。那可能吗?
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_pairsin的定义放在setUp?)
self.expected_pairs
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。
TestPreReqs