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
相关产品推荐
相关产品推荐

