pytest-dependency的依赖声明必须写在测试函数的装饰器中,使用@depends指定前序测试函数名,名字需与pytest收集到的函数名完全一致(含test_前缀、大小写、下划线)。

pytest-dependency 依赖声明写在哪?
依赖关系必须写在测试函数的装饰器里,不是配置文件也不是命令行参数。用 @depends 指定前序测试函数名,名字要和 pytest 收集到的函数名完全一致(包括 test_ 前缀、大小写、下划线)。
- 如果被依赖的测试函数没定义,pytest 会报错:
ValueError: dependency 'test_login' not found - 依赖可以跨文件,但需确保 pytest 能同时发现两个文件(比如都放在同一目录下或通过
-p显式加载) - 不支持用类方法名作为依赖目标,只认函数级标识符;若写
@depends('TestAuth.test_login'),默认不生效(除非启用了--strict-markers并自定义 marker)
@depends('test_setup_db')
def test_insert_user():
assert db.insert({'name': 'alice'}) == True
依赖失败时后续测试是跳过还是报错?
默认行为是跳过(skipped),不是失败(failed)。这很关键:跳过意味着它不会计入失败统计,CI 流程可能误判为“全量通过”。
- 若想让依赖失败导致整个链路中断,得配合
--strict-markers或自定义钩子,但插件本身不提供“硬失败”开关 - 跳过的测试仍会出现在 pytest 输出里,显示为
s(如.s.),容易被忽略 - 使用
--tb=short时,跳过信息极简,建议加-v查看完整状态
多个依赖怎么写?能指定“任一满足”还是“全部满足”?
@depends 支持传入列表,语义是“全部满足”,即所有前置测试都必须成功,缺一不可。
- 不支持逻辑或(OR);如果想表达“只要 test_a 或 test_b 成功就运行”,得改用 fixture +
request.getfixturevalue()手动判断,或者拆成两个独立测试 - 多个依赖顺序无关,但推荐按执行逻辑从上到下排列,便于阅读
- 注意循环依赖检测:若 A 依赖 B,B 又依赖 A,pytest-dependency 会直接报错退出,提示
Circular dependency detected
@depends(['test_init_config', 'test_connect_api'])
def test_run_integration():
...
为什么 test_b 总是跳过,即使 test_a 明明跑过了?
最常见原因是函数名拼写或作用域不匹配:
立即学习“Python免费学习笔记(深入)”;
- pytest 默认只收集以
test_开头的函数,如果依赖写的是@depends('setup'),但实际函数叫def setup<em>db():</em>(没带 test),它根本不会被识别为测试,自然找不到依赖目标 - 类内测试函数名会被自动加上类名前缀,例如
class TestAPI:下的def test_login(self):,在依赖中应写@depends('TestAPI.test_login')—— 但前提是 pytest 运行时该类确实被加载(比如没被-k过滤掉) - 使用
pytest --collect-only先确认所有目标测试是否真被识别出来,这是排查依赖失效最快的方式
依赖管理本身不改变执行顺序,只是控制是否跳过;真正决定顺序的是 pytest 的默认发现规则或 --lf/--last-failed 等参数。别指望靠依赖声明来“调度”执行流。


















