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

如何在pytest中测试含构造参数的Python类的calculate方法?

如何用pytest测试Calculator类的calculate方法并传入num1和num2参数

问题描述

我找不到与pytest相关的类似问题,已为此困扰多时,请不要关闭此问题,感谢。我希望编写pytest测试该类的calculate()方法,但无法传入num1和num2的值,导致每次调用都会触发异常。

Calculator类代码

class Calculator:
    def __init__(self, num1=None, num2=None):
        self.logger = get_logger(__name__)
        self.num1 = num1
        self.num2 = num2

    def calculate(self):
        if self.num1 and self.num2:
            num = self.__divider(num1, num2)  # 注意:此处存在bug,应改为self.num1和self.num2
        else:
            raise Exception('num2 cannot be 0')  # 异常信息不准确,应为参数未提供的提示
        return self.__faulty_displayer(num)
        
    def __divider(self, num1, num2):
        value = num1/num2
        return value
        
    def __faulty_displayer(self,num):
        value = num + 1
        return value

我目前的尝试代码

import pytest

@pytest.fixture
def obj():
    return Calculator()

# Need help in writing a test case which can take the values of num1, and num2
def test_calculate(obj):
    expected_value = 1
    actual_value = obj.calculate()  #How to pass num1, and num2 values
    assert expected_value == actual_value

解决方案

方法1:在测试用例中直接实例化并传入参数

直接在测试函数里创建Calculator实例时传入num1和num2,无需依赖fixture:

import pytest
from your_module import Calculator  # 替换为你的Calculator所在模块名

def test_calculate_with_valid_params():
    # 传入测试参数,比如num1=2,num2=2
    calc = Calculator(num1=2, num2=2)
    # 根据逻辑计算预期值:2/2 +1 = 2
    expected_value = 2
    actual_value = calc.calculate()
    assert expected_value == actual_value

def test_calculate_missing_params():
    # 测试未传入参数的情况,预期抛出异常
    calc = Calculator()
    with pytest.raises(Exception) as excinfo:
        calc.calculate()
    assert "num2 cannot be 0" in str(excinfo.value)  # 注意:原异常信息不准确,建议修改

方法2:使用参数化测试(测试多组输入)

如果需要测试多组不同的num1和num2组合,可以用@pytest.mark.parametrize:

import pytest
from your_module import Calculator

@pytest.mark.parametrize("num1, num2, expected", [
    (4, 2, 3),  # 4/2 +1 =3
    (10, 5, 3), #10/5+1=3
    (3, 1, 4),  #3/1+1=4
])
def test_calculate_parametrized(num1, num2, expected):
    calc = Calculator(num1=num1, num2=num2)
    actual_value = calc.calculate()
    assert actual_value == expected

方法3:修改fixture支持传入参数

如果希望通过fixture传递参数,可以使用带参数的fixture:

import pytest
from your_module import Calculator

@pytest.fixture
def calculator(request):
    num1, num2 = request.param
    return Calculator(num1=num1, num2=num2)

@pytest.mark.parametrize("calculator", [(2,2), (4,2)], indirect=True)
def test_calculate_with_fixture(calculator):
    expected = (calculator.num1 / calculator.num2) +1
    actual = calculator.calculate()
    assert actual == expected

额外提示

原Calculator类存在两处需要修正的问题:

  1. calculate方法中调用__divider时,传入的num1和num2未定义,应改为self.__divider(self.num1, self.num2),否则会触发NameError。
  2. else分支的异常信息错误,当num1或num2为None时,抛出的提示是"num2 cannot be 0",这不符合逻辑,建议改为"Both num1 and num2 must be provided"之类的准确提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:10:35