Python unittest能否多次调用同一函数且失败不中断测试?
问题:用unittest实现参数化独立测试用例的需求
我正在用Python的unittest库测试模块,想给测试方法传不同参数,让每次调用都作为独立测试用例。当前代码如下:
import unittest class TestStringMethods(unittest.TestCase): def test_all(self): for x in range(10): self.do_test_one(x) def do_test_one(self,x): print( "Testing " + str(x) ) self.assertTrue( x != 5 ) if __name__ == '__main__': unittest.main()
现在运行的话,x=5时测试失败就直接中断了,最后只统计1个失败用例。我想让某个用例失败后,后续测试还能继续跑,最终得到10个用例的结果(9个通过、1个失败),能不能实现?
解决方案
完全可以实现,最省心的方式是用unittest原生的subTest上下文管理器——它能把循环里的每一次迭代都当成独立的子测试用例执行,哪怕某个子测试失败,剩下的测试也会继续跑,而且每个子测试的结果都会被单独统计。
修改后的代码如下:
import unittest class TestStringMethods(unittest.TestCase): def test_all(self): for x in range(10): with self.subTest(x=x): # 给子测试标记参数,方便定位问题 self.do_test_one(x) def do_test_one(self,x): print( "Testing " + str(x) ) self.assertTrue( x != 5 ) if __name__ == '__main__': unittest.main()
运行这段代码后,x=5的测试会失败,但程序会继续执行剩下的测试,最终结果会显示10个测试用例的状态:9个通过,1个失败,每个子测试的情况都能清晰看到。
如果需要更灵活的参数化(比如从外部文件或列表加载测试参数),也可以用第三方库parameterized(先通过pip install parameterized安装),示例代码如下:
import unittest from parameterized import parameterized class TestStringMethods(unittest.TestCase): @parameterized.expand([(x,) for x in range(10)]) def test_one(self, x): print( "Testing " + str(x) ) self.assertTrue( x != 5 ) if __name__ == '__main__': unittest.main()
这种方式会自动生成10个独立的测试方法(命名为test_one_0到test_one_9),每个方法对应一个参数,执行时每个用例完全独立,失败不会影响其他用例的执行,统计结果也会分开显示。
内容的提问来源于stack exchange,提问作者jpo38
相关产品推荐
相关产品推荐

