具有pytest依赖的文件之间的依赖关系?

Cla*_*sen 9 python pytest

我正在使用pytest和pytest-dependency的功能测试套件.我99%喜欢这些工具,但我无法弄清楚如何在一个文件中进行测试取决于另一个文件中的测试.理想情况下,我希望对dependee进行零更改,并且只更改依赖项中的内容.我希望测试能够依赖于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
Run Code Online (Sandbox Code Playgroud)

像这样:

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

当我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和它的工作,但我不想只转储每个测试在一个文件中(这是什么,这将最终退化为).我试图通过把所有东西放在正确的架子上来保持整洁,而不是把它全部塞进壁橱里.

此外,我意识到如果这是我可以做的事情,那么存在创建循环依赖的可能性.我没关系.如果我这样开枪自己,那就说实话,我应该得到它.

hoe*_*ing 7

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

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

# conftest.py
from pytest_dependency import DependencyManager

DependencyManager.ScopeCls['module'] = DependencyManager.ScopeCls['session']
Run Code Online (Sandbox Code Playgroud)

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

解决方案

有一个 PR在会话和类级别添加了依赖项解析,但它尚未被包维护者接受。你可以改用它:

# conftest.py
from pytest_dependency import DependencyManager

DependencyManager.ScopeCls['module'] = DependencyManager.ScopeCls['session']
Run Code Online (Sandbox Code Playgroud)

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

@pytest.mark.dependency(scope='session')
def test_one():
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

还支持命名依赖项:

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

@pytest.mark.dependency(depends=['spam'], scope='session')
def test_two():
    ...
Run Code Online (Sandbox Code Playgroud)

  • 截至 2019 年 10 月 19 日,拉取请求仍未合并。 (3认同)