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

