如何使用pytest测试修改类属性的Inventory类add_product方法
如何测试基于类属性单例的Inventory方法?
你的核心问题是:类属性Inventory.appliances是全局共享的单例DataFrame,测试时容易出现状态污染(比如上一个测试用例修改的数据影响下一个用例)。解决这个问题的关键是每个测试用例前后重置状态,同时针对性编写方法的功能验证用例。
1. 用测试框架保证测试前后的干净状态
以pytest为例,你可以写一个自动执行的fixture,每次测试前把appliances重置为空DataFrame:
import pytest import pandas as pd from your_module import Inventory @pytest.fixture(autouse=True) def clean_inventory(): # 测试开始前重置库存表 Inventory.appliances = pd.DataFrame() yield # 测试结束后再次重置,避免影响其他用例 Inventory.appliances = pd.DataFrame()
这个fixture会自动作用于所有测试用例,确保每个测试都从空表开始。
2. 编写add_product的具体测试用例
针对方法的不同场景编写测试:
测试单个产品添加
from your_module import Appliance def test_add_single_appliance(): # 准备测试数据 test_prod = Appliance(id=101, model="X100洗衣机") # 调用方法 Inventory.add_product(test_prod) # 验证结果 assert len(Inventory.appliances) == 1 assert Inventory.appliances.iloc[0]["id"] == 101 assert Inventory.appliances.iloc[0]["model"] == "X100洗衣机"
测试多个产品添加
def test_add_multiple_appliances(): prod1 = Appliance(id=101, model="X100洗衣机") prod2 = Appliance(id=102, model="Y200冰箱") Inventory.add_product(prod1) Inventory.add_product(prod2) assert len(Inventory.appliances) == 2 assert set(Inventory.appliances["id"]) == {101, 102} assert set(Inventory.appliances["model"]) == {"X100洗衣机", "Y200冰箱"}
测试异常场景(可选)
如果add_product有重复id校验之类的逻辑,也需要覆盖:
def test_add_duplicate_id(): prod1 = Appliance(id=101, model="X100洗衣机") prod2 = Appliance(id=101, model="X100洗衣机升级版") Inventory.add_product(prod1) # 假设重复添加会抛出异常或不新增行 with pytest.raises(ValueError): Inventory.add_product(prod2) # 验证行数仍为1 assert len(Inventory.appliances) == 1
3. 关键注意事项
- 所有测试必须独立,不能依赖执行顺序,靠前置重置保证初始状态一致。
- 如果后续有其他操作
appliances的方法,也要遵循同样的测试逻辑,先重置再测试。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

