gpt4 book ai didi

python - 如果退出调试,则执行 pytest fixture 拆卸

转载 作者:行者123 更新时间:2023-12-04 16:46:08 27 4
gpt4 key购买 nike

问题
我设置了一个简单的测试,比如

import pytest
import pathlib


@pytest.fixture
def some_resource():
testdir = pathlib.Path("i_want_to_be_deleted")
testdir.mkdir()
yield
testdir.rmdir()


def test_dummy_succeeds(some_resource):
assert pathlib.Path("i_want_to_be_deleted").exists()


def test_dummy_fails(some_resource):
assert False

如果我使用 pytest 运行此测试, 目录 i_want_to_be_deleted为测试创建,然后删除(也为失败的测试)。这正如预期的那样。
但是,如果我在创建目录后在某处设置断点,请在调试器中运行它,并停止调试,目录 i_want_to_be_deleted持续存在。
按照 an answer 中的建议,通过实现上下文管理器来增强此示例来自@ BramAppel ,不幸的是没有帮助:
import pytest
import pathlib


class ContextPath:
def __init__(self, pathstring):
self.path = pathlib.Path(pathstring)

def __enter__(self):
self.path.mkdir()

# The latter 3 args are just a boilerplate convention
def __exit__(self, exc_type, exc_val, exc_tb):
self.path.rmdir()


@pytest.fixture
def some_resource():
with ContextPath("i_want_to_be_deleted"):
yield


def test_dummy_succeeds(some_resource):
assert pathlib.Path("i_want_to_be_deleted").exists()

有没有办法拥有pytest执行 fixture 的拆卸部分,不管是否结束调试 session ?
需要注意的是,Matlab 调试器显示了请求的行为。
环境
我正在使用 pytest,它告诉我我在
platform linux -- Python 3.6.3, pytest-5.4.3, py-1.8.2, pluggy-0.13.1
此外,我使用 2020 年 8 月版的 vs 代码和 Test Explorer UIPython Test Explorer运行和调试测试的扩展。

最佳答案

您是否尝试过实现上下文管理器?这保证了 __enter____exit__方法将被执行。虽然我没有用您的确切设置对此进行测试,但这可能是您问题的解决方案。

import pathlib
import pytest


class ContextPath(pathlib.Path):
def __init__(self, *args):
super().__init__(*args)

def __enter__(self):
self.mkdir()

# The latter 3 args are just a boilerplate convention
def __exit__(self, exc_type, exc_val, exc_tb):
self.rmdir()


@pytest.fixture
def some_resource():
with ContextPath("i_want_to_be_deleted"):
yield

关于python - 如果退出调试,则执行 pytest fixture 拆卸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64007808/

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