如何配置pytest-dependency让TestSetB仅在TestSetA全通过后运行?
解决pytest-dependency跨文件测试类依赖失效问题
环境与问题描述
使用pytest-dependency 0.6.0版本,tests目录下有两个测试文件:
test_set_a.py代码:
class TestSetA: def test_always_passes(): pass
test_set_b.py尝试多种配置让其测试仅在TestSetA所有测试通过后运行,但始终被跳过:
- 直接依赖类名:
@pytest.mark.dependency(depends=["TestSetA"]) class TestSetB: def please_dont_skip_me(): pass
- 指定文件名:
@pytest.mark.dependency(depends=["test_set_a.py::TestSetA"]) class TestSetB: def please_dont_skip_me(): pass
- 设置class作用域:
@pytest.mark.dependency(depends=["TestSetA"], scope="class") class TestSetB: def please_dont_skip_me(): pass
- 同时指定文件名和作用域:
@pytest.mark.dependency(depends=["test_set_a.py::TestSetA"], scope="class") class TestSetB: def please_dont_skip_me(): pass
执行日志显示TestSetA的测试通过,但TestSetB的测试被跳过:
collected 2 items [2024-10-18 17:12:24] test_set_a.py::TestSetA::test_always_passes PASSED [ 100%]
[2024-10-18 17:12:25] test_set_b.py::TestSetB::please_dont_skip_me SKIPPED (please_dont_skip_me depends on TestSetA)
问题根源
- 类中的测试方法缺少
self参数,导致pytest无法将其识别为类的成员测试方法,而是当作独立函数处理,依赖匹配失败。 - pytest-dependency的依赖目标默认指向可执行的测试项(即测试方法),而非测试类本身,直接依赖类名无法找到有效依赖项。
解决方案
步骤1:修正test_set_a.py
给测试方法添加self参数,并通过@pytest.mark.dependency显式标记依赖名:
import pytest class TestSetA: @pytest.mark.dependency(name="test_set_a_all_passed") def test_always_passes(self): pass
如果TestSetA包含多个测试方法,要确保所有方法通过才触发依赖,可给每个方法标记同一个名称:
import pytest class TestSetA: @pytest.mark.dependency(name="test_set_a_all_passed") def test_1(self): pass @pytest.mark.dependency(name="test_set_a_all_passed") def test_2(self): pass
步骤2:修正test_set_b.py
给测试方法添加self参数,依赖指定的标记名称,并设置scope="class":
import pytest @pytest.mark.dependency(depends=["test_set_a_all_passed"], scope="class") class TestSetB: def please_dont_skip_me(self): pass
验证结果
执行测试后,TestSetA的测试通过后,TestSetB的测试会正常运行,不会被跳过:
collected 2 items test_set_a.py::TestSetA::test_always_passes PASSED [ 50%] test_set_b.py::TestSetB::please_dont_skip_me PASSED [100%]
内容的提问来源于stack exchange,提问作者Pea Kay See Es
相关产品推荐
相关产品推荐

