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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:51:15