如果退出调试,执行pytest Fixture拆卸

时间:2020-09-22 10:26:47

标签: python debugging visual-studio-code pytest

问题

我设置了一个简单的测试,例如

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仍然存在。

不幸的是,如{@ {3}}在an answer中所建议的那样,通过实现上下文管理器来增强此示例没有帮助:

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的拆卸部分,而无需结束调试会话?

请注意,Matlab调试器会表现出所请求的行为。

环境

我正在使用pytest,它告诉我我正在上线

platform linux -- Python 3.6.3, pytest-5.4.3, py-1.8.2, pluggy-0.13.1

此外,我使用2020年8月发布的vs代码,扩展名为BramAppelTest Explorer UI,以运行和调试测试。

1 个答案:

答案 0 :(得分:0)

您是否尝试过实现上下文管理器?这保证了__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