具有pytest-dependency的文件之间的依赖关系?
Dependencies between files with pytest-dependency?
我正在使用具有 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_one
失败则跳过 test_point_one
),但是当我 运行 pytest test_two.py
, 它会跳过 test_two
.
我已经尝试将 import test_one
添加到 test_two.py 但无济于事,并验证了导入实际上正在正确导入 - 它不仅仅是被 pytest 传递 "Oh hey, I've finished collecting tests, and there's nothing that I can't skip! Hooray for laziness!"
我知道我可以在技术上将 test_two()
放在 test_one.py
中并且它会起作用,但我不想将每个测试都转储到一个文件中(这最终会转移进入)。我试图通过将所有东西放在正确的架子上来保持东西整洁,而不是把它们全部塞进壁橱。
此外,我意识到如果我能做到这一点,则存在创建循环依赖的可能性。我对此没有意见。如果我那样搬起石头砸自己的脚,老实说,我活该。
当前状态,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 添加会话和 class 级别的依赖项解析,但它尚未被包维护者接受 现在被接受。
您可以改用它:
$ pip uninstall -y pytest-dependency
$ pip install git+https://github.com/JoeSc/pytest-dependency.git@master
现在 dependency
标记接受额外的参数 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():
...
我正在使用具有 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_one
失败则跳过 test_point_one
),但是当我 运行 pytest test_two.py
, 它会跳过 test_two
.
我已经尝试将 import test_one
添加到 test_two.py 但无济于事,并验证了导入实际上正在正确导入 - 它不仅仅是被 pytest 传递 "Oh hey, I've finished collecting tests, and there's nothing that I can't skip! Hooray for laziness!"
我知道我可以在技术上将 test_two()
放在 test_one.py
中并且它会起作用,但我不想将每个测试都转储到一个文件中(这最终会转移进入)。我试图通过将所有东西放在正确的架子上来保持东西整洁,而不是把它们全部塞进壁橱。
此外,我意识到如果我能做到这一点,则存在创建循环依赖的可能性。我对此没有意见。如果我那样搬起石头砸自己的脚,老实说,我活该。
当前状态,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 添加会话和 class 级别的依赖项解析,但它尚未被包维护者接受 现在被接受。
$ pip uninstall -y pytest-dependency
$ pip install git+https://github.com/JoeSc/pytest-dependency.git@master
现在 dependency
标记接受额外的参数 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():
...