test_create_order (__main__.OrderTest)... skipped '前置依赖用例 test_login 执行失败!'
test_deliver (__main__.OrderTest)... ok
test_login (__main__.OrderTest)... FAIL
test_pay_order (__main__.OrderTest)... skipped '前置依赖用例 test_login 执行失败!'======================================================================
FAIL: test_login (__main__.OrderTest)
----------------------------------------------------------------------
Traceback (most recent call last):File "test.py", line 8, in test_loginself.assertTrue(False)
AssertionError: False is not true----------------------------------------------------------------------
Ran 4 tests in0.002sFAILED (failures=1, skipped=2)
五、设计思想总结
5.1 关键技术点
技术点
解决的问题
实现方式
闭包嵌套
保持依赖用例名称的状态
三层函数嵌套结构
动态装饰
运行时决定是否跳过
unittest.skipIf动态应用
结果分析
检测前置用例状态
解析_result对象
5.2 工程实践建议
依赖命名规范:使用统一前缀如test_开头
依赖层级控制:避免形成环形依赖链
结果清理机制:在setUp中重置_mark状态
日志增强:添加详细的依赖关系日志
六、完整代码
"""
Python :3.13.3
Selenium: 4.31.0
"""from functools import wraps
import unittestclassDependencyError(Exception):def__init__(self, _type):self._type = _typedef__str__(self):if self._type ==0:returnf'Dependency name of test is required!'if self._type ==1:returnf'Dependency name of test can not the case self!'returnNonedefdepend(case=''):ifnotcase:raise DependencyError_mark =[]defwrap_func(func):@wraps(func)definner_func(self):ifcase== func.__name__:raise DependencyError(1)_r = self._outcome.result_f, _e, _s = _r.failures, _r.errors, _r.skippedifnot(_f or _e or _s):func(self)if _f:_mark.extend([fail[0]for fail in _f])if _e:_mark.extend([error[0]for error in _e])if _s:_mark.extend([skip[0]for skip in _s])unittest.skipIf(caseinstr(_mark),f'The pre-depend case :{case} has failed! Skip the specified case!')(func)(self)return inner_funcreturn wrap_func# @unittest.skipIf(case in str(_mark), '')# def test(self):# ...# @unittest.skipIf(case in str(_mark), '')(func)