16

我正在使用具有 pytest 依赖关系的 pytest 开发功能测试套件。我 99% 都喜欢这些工具,但我不知道如何让一个文件中的测试依赖于另一个文件中的测试。理想情况下,我希望对依赖者进行零更改,并且只更改依赖者中的内容。我希望测试能够像这样依赖 test_one:

# contents of test_one.py
@pytest.mark.dependency()
def test_one():
    # do stuff

@pytest.mark.dependency(depends=["test_one"])
def test_point_one():
    # do stuff

像这样:

# contents of test_two.py
@pytest.mark.dependency(depends=["test_one"])
def test_two():
    # do stuff

当我pytest test_one.py正确运行它时,它会订购东西(test_point_one如果test_one失败则跳过),但是当我运行时pytest test_two.py,它会跳过test_two.

我尝试添加import test_one到 test_two.py 无济于事,并验证了导入实际上是正确导入的——它不仅仅是被 pytest 忽略了“哦,嘿,我已经完成了收集测试,我什么都做不到”不要跳过!懒惰万岁!”

test_two()我知道我可以在技术上投入test_one.py并且它会起作用,但我不想只是将每个测试转储到一个文件中(这最终会演变成)。我试图通过将所有东西放在正确的架子上来保持物品整洁,而不仅仅是将它们全部推入壁橱。

此外,我意识到如果我能做到这一点,就会存在创建循环依赖的可能性。我没关系。如果我像那样朝自己的脚开枪,老实说,我活该。

4

1 回答 1

9

当前状态,2018 年 5 月 31 日,pytest-dependency==0.3.2

目前,pytest-dependency仅在模块级别进行依赖解析。尽管有一些基本的实现来解决会话范围的依赖关系,但在撰写本文时还没有实现完全支持。您可以通过滑动会话范围而不是模块范围来检查:

# conftest.py
from pytest_dependency import DependencyManager

DependencyManager.ScopeCls['module'] = DependencyManager.ScopeCls['session']

现在test_two,您的示例将依赖关系解析为test_one. 然而,这只是一个用于演示目的的肮脏黑客,一旦您添加另一个名为test_oneso 的测试,很容易破坏依赖关系,请进一步阅读。

解决方案建议

有一个 PR在会话和类级别上添加了依赖解析,但它还没有被包维护者接受它现在被接受了。


您可以改用它:
$ pip uninstall -y pytest-dependency
$ pip install git+https://github.com/JoeSc/pytest-dependency.git@master

现在dependency标记接受一个额外的arg scope

@pytest.mark.dependency(scope='session')
def test_one():
    ...

您需要使用完整的测试名称(由 打印pytest -v)才能依赖test_one于另一个模块:

@pytest.mark.dependency(depends=['test_one.py::test_one'], scope='session')
def test_two():
    ...

还支持命名依赖项:

@pytest.mark.dependency(name='spam', scope='session')
def test_one():
    ...

@pytest.mark.dependency(depends=['spam'], scope='session')
def test_two():
    ...
于 2018-05-31T12:26:20.423 回答