UnitTest转pytest报错:'TestCaseFunction'对象无'wasSuccessful'属性
根因分析
你当前使用的custom_unittest_runner.py是专门为unittest框架设计的自定义执行器:
- unittest框架执行测试时,会传入
unittest.TestResult类型的结果对象,该对象原生提供wasSuccessful()方法用于判断用例执行结果 - pytest运行unittest风格的测试用例时,传入的是pytest自研封装的
TestCaseFunction类型对象,该对象没有wasSuccessful()属性和方法,因此触发属性不存在的报错
本质是两个测试框架的结果对象模型不兼容,原有自定义执行器未做pytest适配导致的问题。
修复方案
根据你的迁移需求可以任选以下方案:
方案1:保留原有自定义日志输出逻辑,做双框架兼容
第一步:修改custom_unittest_runner.py中的write_result方法,增加属性判断逻辑:
def write_result(self, result): """ Write the result of the test-case, like: ----------------------- TESTCASE: my_test_case RESULT: PASS ----------------------- This too is implicitly called at the end of the test-case. """ self.write_log('-' * 60) self.write_log('TESTCASE: {0}'.format(self._testMethodName)) # 新增兼容逻辑 if hasattr(result, 'wasSuccessful'): # unittest原生场景 is_pass = result.wasSuccessful() else: # pytest适配场景,读取绑定的执行结果 is_pass = getattr(result, 'outcome', 'failed') == 'passed' # 后续原有逻辑不变,用is_pass变量替换原来的result.wasSuccessful()判断 if is_pass: # 原有 PASS 分支逻辑 ... else: # 原有 FAIL 分支逻辑 ...
第二步:在pytest配置文件conftest.py中新增钩子函数,给pytest的测试用例对象绑定执行结果属性:
import pytest @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): # 获取用例执行结果 outcome = yield report = outcome.get_result() # 仅在用例执行阶段完成后绑定结果属性 if report.when == "call": item.outcome = report.outcome
方案2:完全迁移到pytest生态,弃用原有自定义执行器
如果不需要保留原有自定义执行器的特殊日志输出逻辑,可以直接做以下修改:
- 测试用例无需再继承unittest的TestCase类,改为pytest原生的函数/类风格用例
- 移除测试代码中对
custom_unittest_runner的引用 - 测试结果输出直接使用pytest官方插件:
pytest-html生成网页报告、pytest-xml生成XML格式报告,完全覆盖原有执行器的结果输出能力。
内容的提问来源于stack exchange,提问作者Fly High
相关产品推荐
相关产品推荐

