gpt4 book ai didi

python - py.test - 如何在 funcarg/fixture 中使用上下文管理器

转载 作者:行者123 更新时间:2023-12-04 05:53:26 25 4
gpt4 key购买 nike

密切相关:In python, is there a good idiom for using context managers in setup/teardown

我有一个上下文管理器,用于在测试中修复时间/时区。我想把它放在一个 pytest funcarg(或 fixture ,我们使用 pytest 2.2.3 但我可以向后翻译)。我可以这样做:

def pytest_funcarg__fixedTimezone(request):
# fix timezone to match Qld, no DST to worry about and matches all
# Eastern states in winter.
fixedTime = offsetTime.DisplacedRealTime(tz=' Australia/Brisbane')

def setup():
fixedTime.__enter__()
return fixedTime

def teardown(fixedTime):
# this seems rather odd?
fixedTime.__exit__(None, None, None)

……不过有点恶心。在相关Q jsbueno指出:问题在于您的代码没有规定调用对象的 __exit__如果发生异常,方法正确。

His answer使用元类方法。但这对于 pytest 来说不是很有用,因为 pytest 通常测试只是函数,而不是类。那么解决这个问题的 pytest-y 方法是什么?涉及 runtest hooks的事情?

最佳答案

从 2.4 开始,py.testyield样式 fixture 支持。我们可以使用 with直接在其中的上下文。

@pytest.yield_fixture
def passwd():
with open("/etc/passwd") as f:
yield f.readlines()

从 3.0 开始, py.test弃用 @pytest.yield_fixture用法。我们可以使用 @pytest.fixture直接作为上下文管理器。
@pytest.fixture
def passwd():
with open("/etc/passwd") as f:
yield f.readlines()

关于python - py.test - 如何在 funcarg/fixture 中使用上下文管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com