pytest-mock 的会话范围
session scope with pytest-mock
我正在寻找如何使用 pytest-mock 插件的会话范围的“session-mocker”夹具的示例。
很清楚如何修改文档提供的示例以在特定测试中使用它:
def test_foo(session_mocker):
session_mocker.patch('os.remove')
etc...
但我对应该在何处以及如何初始化此全局固定装置感到困惑。例如,我想为我的所有测试模拟“os.remove”。我要在 confftest.py 中设置吗?如果是,我该怎么做?
您在具有会话范围的夹具中使用它。放置它的最佳位置是 conftest.py
。这主要是为了让其他程序员清楚地知道这个固定装置的存在以及它可能在做什么。这很重要,因为这个夹具会影响其他测试,这些测试可能不一定知道这个夹具,甚至不需要它。
我不建议在会话期间模拟某些内容。测试,classes 甚至模块,是的。但不是会话。
例如,以下测试 test_normal
通过或失败取决于 test_mocked
是否在同一会话中 运行。由于它们在同一个“文件”中,因此更容易发现问题。但是这些测试可能位于不同的测试文件中,看起来并不相关,但是如果两个测试都在同一会话中 运行 那么问题就会发生。
import pytest
# could be in conftest.py
@pytest.fixture(scope='session')
def myfixture(session_mocker):
session_mocker.patch('sys.mymock', create=True)
def test_mocked(myfixture):
import sys
assert hasattr(sys, 'mymock')
def test_normal():
import sys
assert not hasattr(sys, 'mymock')
相反,只需创建一个用于测试、class 或模块的夹具,并将其直接包含在测试文件中。这样行为就包含在需要它的一组测试中。模拟的创建成本很低,因此为每个测试重新创建模拟没什么大不了的。它甚至可能是有益的,因为每次测试都会重置模拟。
为设置成本高、没有状态或测试不会更改其状态的事物保存会话固定装置(例如,用作模板的数据库,以创建每次测试的新数据库将 运行 反对)。
我正在寻找如何使用 pytest-mock 插件的会话范围的“session-mocker”夹具的示例。
很清楚如何修改文档提供的示例以在特定测试中使用它:
def test_foo(session_mocker):
session_mocker.patch('os.remove')
etc...
但我对应该在何处以及如何初始化此全局固定装置感到困惑。例如,我想为我的所有测试模拟“os.remove”。我要在 confftest.py 中设置吗?如果是,我该怎么做?
您在具有会话范围的夹具中使用它。放置它的最佳位置是 conftest.py
。这主要是为了让其他程序员清楚地知道这个固定装置的存在以及它可能在做什么。这很重要,因为这个夹具会影响其他测试,这些测试可能不一定知道这个夹具,甚至不需要它。
我不建议在会话期间模拟某些内容。测试,classes 甚至模块,是的。但不是会话。
例如,以下测试 test_normal
通过或失败取决于 test_mocked
是否在同一会话中 运行。由于它们在同一个“文件”中,因此更容易发现问题。但是这些测试可能位于不同的测试文件中,看起来并不相关,但是如果两个测试都在同一会话中 运行 那么问题就会发生。
import pytest
# could be in conftest.py
@pytest.fixture(scope='session')
def myfixture(session_mocker):
session_mocker.patch('sys.mymock', create=True)
def test_mocked(myfixture):
import sys
assert hasattr(sys, 'mymock')
def test_normal():
import sys
assert not hasattr(sys, 'mymock')
相反,只需创建一个用于测试、class 或模块的夹具,并将其直接包含在测试文件中。这样行为就包含在需要它的一组测试中。模拟的创建成本很低,因此为每个测试重新创建模拟没什么大不了的。它甚至可能是有益的,因为每次测试都会重置模拟。
为设置成本高、没有状态或测试不会更改其状态的事物保存会话固定装置(例如,用作模板的数据库,以创建每次测试的新数据库将 运行 反对)。