You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pytest与Unittest:如何实现测试用例的相互独立执行?

测试隔离方案:重置类属性

问题核心是A._cache是类属性,所有实例共享该属性,测试运行时不会自动重置状态,导致前一个测试修改的值会影响后续测试。解决思路是在每个测试执行前后重置类属性,确保测试环境初始状态一致。

一、Unittest 框架实现

利用Unittest的setUp()方法,它会在每个测试方法执行前自动运行,在这里重置A._cache的初始值:

import unittest

class A:
    _cache = None

    def func(self):
        if not A._cache:
            A._cache = 'Get value from some service'

class TestA(unittest.TestCase):
    def setUp(self):
        # 每个测试前重置类属性,确保初始状态干净
        A._cache = None

    def test_cache_after_func(self):
        a = A()
        a.func()
        self.assertIsNotNone(A._cache)

    def test_cache_empty(self):
        a = A()
        self.assertIsNone(A._cache)

if __name__ == '__main__':
    unittest.main()

二、Pytest 框架实现

使用自动执行的fixture,让它在每个测试函数前后重置类属性:

import pytest

class A:
    _cache = None

    def func(self):
        if not A._cache:
            A._cache = 'Get value from some service'

@pytest.fixture(autouse=True)
def reset_a_cache():
    # 测试前重置类属性
    A._cache = None
    yield
    # 测试后可再次重置(可选,进一步保障环境干净)
    A._cache = None

def test_cache_after_func():
    a = A()
    a.func()
    assert A._cache is not None

def test_cache_empty():
    a = A()
    assert A._cache is None

如果不想修改原类逻辑,也可以用unittest.mock.patch或pytest-mock临时替换类属性,但对于这类简单场景,直接重置类属性是最直观高效的方式。

内容的提问来源于stack exchange,提问作者elshev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:52:24