如何将Python unittest跳过结果设为失败并判断关联用例状态
问题解决:检测跳过的测试并调整TextTestRunner输出
一、检测test_A被跳过并跳过test_B
当前代码的问题在于直接用if not pass_result判断测试状态,但TextTestRunner.run()返回的TestResult对象,其布尔值仅关联失败/错误,跳过的测试不会影响这个判断。要检测测试是否被跳过,需查看TestResult的skipped属性——这是一个列表,会记录所有被跳过的测试用例及原因。
修改后的完整代码:
import unittest class TestStringResult(unittest.TestCase): def test_A(self): missing = 1 if missing: raise unittest.SkipTest('Required information is missing') def test_B(self): test_result = unittest.TextTestRunner().run(TestStringResult('test_A')) # 检查是否有测试被跳过 if len(test_result.skipped) > 0: raise unittest.SkipTest('test_A已被跳过,跳过test_B') print('test_A运行正常') if __name__ == '__main__': unittest.main()
修改后,当test_A被跳过时,test_result.skipped长度大于0,会触发SkipTest跳过test_B,输出中test_B会标记为s(跳过),不会再打印test_A运行正常。
二、让TextTestRunner将跳过的测试显示为失败
默认TextTestRunner会把跳过的测试标记为s,结果显示OK (skipped=1)。要将跳过转为失败显示,需自定义TestResult类,重写addSkip方法,把跳过的测试归类为失败并修改输出字符。
修改后的完整代码:
import unittest # 自定义TestResult,将跳过转为失败 class FailOnSkipResult(unittest.TextTestResult): def addSkip(self, test, reason): # 将跳过的测试添加到失败列表 self.failures.append((test, reason)) # 输出时显示为F(失败)而非s(跳过) self.stream.write("F") self.stream.flush() class TestStringResult(unittest.TestCase): def test_A(self): missing = 1 if missing: raise unittest.SkipTest('Required information is missing') def test_B(self): # 使用自定义Result类创建Runner runner = unittest.TextTestRunner(resultclass=FailOnSkipResult) test_result = runner.run(TestStringResult('test_A')) # 通过failures属性判断test_A是否被标记为失败 if len(test_result.failures) > 0: raise unittest.SkipTest('test_A已被标记为失败,跳过test_B') print('test_A运行正常') if __name__ == '__main__': unittest.main()
运行后,test_A被跳过时会显示为F,结果输出FAILED (failures=1),而非原来的OK (skipped=1),同时test_B会因检测到test_A的"失败"状态被跳过。
内容的提问来源于stack exchange,提问作者newlearner
相关产品推荐
相关产品推荐

