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

pytest会话夹具(session fixture)被测试修改后是否影响后续测试?

pytest Session Fixture 修改与跨测试影响问题

1. 测试能否修改session fixture的值影响后续测试?

取决于fixture返回的是不可变类型还是可变类型:

  • 不可变类型(int、str、tuple等):测试中对变量的赋值只是创建了局部变量,不会改变fixture的原始值,后续测试拿到的还是初始值。
    示例代码:
    import pytest
    
    @pytest.fixture(scope="session")
    def session_num():
        return 10
    
    def test_modify_immutable(session_num):
        session_num = 20  # 仅局部赋值,不影响原始fixture
        assert session_num == 20
    
    def test_check_original(session_num):
        assert session_num == 10  # 仍为初始值
    
  • 可变类型(list、dict、自定义类实例等):测试中对对象的原地修改会直接改变fixture的原始对象,后续测试会拿到修改后的状态。

2. session fixture返回字典时,测试修改字典是否影响后续测试?

会影响。字典是可变对象,session级fixture在整个测试会话中仅初始化一次,所有测试共享同一个字典实例。测试中的原地操作(如添加键值对、修改已有值)会直接改变这个共享对象,后续测试能看到修改后的结果。

示例代码:

import pytest

@pytest.fixture(scope="session")
def session_dict():
    return {"name": "Alice"}

def test_modify_dict(session_dict):
    session_dict["age"] = 30  # 原地修改共享字典
    assert session_dict["age"] == 30

def test_check_modified_dict(session_dict):
    assert session_dict.get("age") == 30  # 读取到修改后的字段

如果要避免影响后续测试,可采用两种方式:

  • 将fixture的scope改为function,让每个测试拿到新的字典实例;
  • 在测试中对字典做拷贝(浅拷贝copy()或深拷贝deepcopy(),视字典嵌套情况而定),仅修改局部拷贝:
    def test_modify_local_copy(session_dict):
        local_dict = session_dict.copy()
        local_dict["age"] = 30
        assert local_dict["age"] == 30
    
    def test_check_unmodified_dict(session_dict):
        assert "age" not in session_dict  # 原始字典未被修改
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 06:16:19