如何在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类存在两处需要修正的问题:
calculate方法中调用__divider时,传入的num1和num2未定义,应改为self.__divider(self.num1, self.num2),否则会触发NameError。else分支的异常信息错误,当num1或num2为None时,抛出的提示是"num2 cannot be 0",这不符合逻辑,建议改为"Both num1 and num2 must be provided"之类的准确提示。
内容的提问来源于stack exchange,提问作者layman
相关产品推荐
相关产品推荐

