使用pytest-dependency跨模块时测试用例被跳过的问题求助
解决pytest-dependency跨模块测试依赖被跳过的问题
问题根源
你遇到的问题核心是两个点:
- 跨模块依赖的节点ID格式错误:pytest-dependency的
depends参数需要使用相对于rootdir的节点ID,你当前用了带根目录前缀的全路径(比如TestOrderDependencies/test_mod_01.py::a),和pytest内部识别的节点ID不匹配 - 同名测试标记冲突:test_mod_01.py中模块级
test_b和类内test_b共用了name="b"标记,会导致依赖识别混乱
解决方案
步骤1:修正test_mod_01.py的同名标记
给类内的测试用例设置唯一标记名,避免与模块级测试冲突:
import pytest @pytest.mark.dependency(name="a") def test_a(): pass @pytest.mark.dependency(name="b") def test_b(): assert True @pytest.mark.dependency(name="c", depends=["a"]) def test_c(): pass class TestClass(object): # 修改为唯一标记名,比如class_b @pytest.mark.dependency(name="class_b", depends=["c"]) def test_b(self): pass
步骤2:修正test_mod_02.py的依赖路径
去掉根目录前缀,使用相对于rootdir的节点ID格式,同时更新类测试的依赖标记:
import pytest # 重命名标记,避免和test_mod_01的a冲突 @pytest.mark.dependency(name="mod2_a") def test_a(): assert True @pytest.mark.dependency(name="e", depends=["test_mod_01.py::a", "test_mod_01.py::c"], scope='session' ) def test_e(): pass @pytest.mark.dependency(name="f", depends=["test_mod_01.py::b", "test_mod_02.py::e"], scope='session' ) def test_f(): pass @pytest.mark.dependency(name="g", depends=["test_mod_01.py::class_b"], scope='session' ) def test_g(): pass
验证执行结果
修改后执行pytest,所有依赖测试会正常执行,输出示例:
rootdir: /Users/xxxx/PycharmProjects/TestOrderDependencies plugins: order-1.2.0, dependency-0.5.1 collected 8 items test_mod_01.py::test_a PASSED test_mod_01.py::test_b PASSED test_mod_01.py::test_c PASSED test_mod_01.py::TestClass::test_b PASSED test_mod_02.py::test_a PASSED test_mod_02.py::test_e PASSED test_mod_02.py::test_f PASSED test_mod_02.py::test_g PASSED ================================================================================================== 8 passed in 0.03s ====
内容的提问来源于stack exchange,提问作者Harry Kane
相关产品推荐
相关产品推荐

