具有 pytest-dependency 的会话范围

Session scope with pytest-dependency

参考从 pytest-dependency 复制的示例代码,通过删除“tests”文件夹进行了细微更改,我希望“test_e”和“test_g”能够通过,但是,两者都被跳过。请告知我是否做了任何愚蠢的事情来阻止会话范围正常工作。

注:

test_mod_01.py

import pytest

@pytest.mark.dependency()
def test_a():
    pass

@pytest.mark.dependency()
@pytest.mark.xfail(reason="deliberate fail")
    def test_b():
       assert False

@pytest.mark.dependency(depends=["test_a"])
def test_c():
    pass

class TestClass(object):

    @pytest.mark.dependency()
    def test_b(self):
        pass

test_mod_02.py

import pytest

@pytest.mark.dependency()
@pytest.mark.xfail(reason="deliberate fail")
def test_a():
    assert False

@pytest.mark.dependency(
    depends=["./test_mod_01.py::test_a", "./test_mod_01.py::test_c"],
    scope='session'
)
def test_e():
    pass

@pytest.mark.dependency(
    depends=["./test_mod_01.py::test_b", "./test_mod_02.py::test_e"],
    scope='session'
)
def test_f():
    pass

@pytest.mark.dependency(
    depends=["./test_mod_01.py::TestClass::test_b"],
    scope='session'
)
def test_g():
    pass

意外输出

=========================================================== test session starts ===========================================================
...
collected 4 items                                                                                                                         

test_mod_02.py xsss                                                                                                                 
[100%]

====================================================== 3 skipped, 1 xfailed in 0.38s ======================================================

预期输出

=========================================================== test session starts ===========================================================
...
collected 4 items                                                                                                                         

test_mod_02.py x.s.                                                                                                                 
[100%]

====================================================== 2 passed, 1 skipped, 1 xfailed in 0.38s ======================================================

第一个问题是 pytest-dependency 如果在会话范围内使用,则使用完整的测试节点名称。这意味着您必须完全匹配该字符串,该字符串从不包含诸如“.”之类的相对路径。在你的情况下。 您必须使用 "tests/test_mod_01.py::test_c""test_mod_01.py::test_c" 之类的东西,而不是使用 "./test_mod_01.py::test_c",具体取决于您的测试根所在的位置。

第二个问题是 pytest-dependency 只有在其他测试所依赖的测试在同一测试会话中之前 运行 时才会起作用,例如在您的情况下, test_mod_01test_mod_02 模块都必须在同一个测试会话中。在已经 运行.

的测试列表中查找测试依赖项 运行time

请注意,这也意味着如果您 运行 按默认顺序进行测试,则您不能在 test_mod_01 中进行测试依赖于 test_mod_02 中的测试。您必须确保测试 运行 的顺序正确,方法是相应地调整名称,或者使用一些排序插件,如 pytest-order, which has an option (--order-dependencies) 在这种情况下需要时对测试进行排序。

免责声明:我是pytest-order的维护者。