小编典典

Python unittest:以编程方式生成多个测试?

python

我有一个要测试的函数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_pairsin的定义放在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个测试。我是否对示例进行了错误的修改?


阅读 329

收藏
2020-12-20

共1个答案

小编典典

未经测试:

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

2020-12-20