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

时间:2017-10-10 16:28:18

标签: 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

就像这样:

# 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中并且它可以工作,但我不想只将每个测试转储到一个文件中(这最终会转移到这个文件中) 。我试图通过把所有东西放在正确的架子上来保持整洁,而不是把它全部塞进壁橱里。

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

1 个答案:

答案 0 :(得分:2)

当前状态,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_one的测试,就会轻易破坏依赖项,因此请进一步阅读。

解决方案提案

There is a 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():
    ...