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

如何在class级pytest fixture下隔离test_b与test_c测试用例

解决方案

要在保持fixture的class级作用域同时,让每个测试拿到初始状态的a_list快照,你可以通过分层fixture实现:用class级fixture存储原始数据,再用function级fixture每次返回原始数据的副本,这样既保留了class级fixture的特性,又能隔离测试间的状态影响。

具体代码修改如下:

import pytest

@pytest.fixture(scope="class")
def original_a_list(self):
    # 保持class级作用域,仅初始化一次原始数据
    return ['a']

@pytest.fixture(scope="function")
def a_list(original_a_list):
    # 每次测试返回原始列表的副本,实现状态隔离
    return original_a_list.copy()  # 或者用 original_a_list[:] 切片复制

def test_b(self, a_list):
    a_list.append('b')
    assert a_list == ['a','b']

def test_c(self, a_list):
    # 此时a_list是原始状态的副本,断言会通过
    assert a_list == ['a']

原理说明

  • original_a_list作为class级fixture,只会在测试类初始化时创建一次,确保原始数据的一致性。
  • a_list是function级fixture,每次测试执行前都会从original_a_list复制一份新的列表,所以test_b对列表的修改只会作用于自己的副本,不会影响test_c的初始状态。

如果你的列表包含嵌套的可变对象(比如列表里有字典),需要用copy.deepcopy()来实现深拷贝,避免嵌套对象的状态共享:

import copy

@pytest.fixture(scope="function")
def a_list(original_a_list):
    return copy.deepcopy(original_a_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:55:15