# test_calculator.py
import pytest
from calculator import Calculator
@pytest.fixture
def calculator():
"""初始化Calculator实例"""
return Calculator()
# ---------------------- 加法测试 ----------------------
def test_add_normal(calculator):
assert calculator.add(3, 5) == 8
def test_add_negative(calculator):
assert calculator.add(-3, 5) == 2
def test_add_zero(calculator):
assert calculator.add(0, 5) == 5
# ---------------------- 减法测试 ----------------------
def test_subtract_normal(calculator):
assert calculator.subtract(10, 4) == 6
def test_subtract_negative(calculator):
assert calculator.subtract(5, -3) == 8
def test_subtract_zero(calculator):
assert calculator.subtract(0, 5) == -5
# ---------------------- 乘法测试 ----------------------
def test_multiply_normal(calculator):
assert calculator.multiply(3, 4) == 12
def test_multiply_negative(calculator):
assert calculator.multiply(-3, 4) == -12
def test_multiply_zero(calculator):
assert calculator.multiply(0, 5) == 0
# ---------------------- 除法测试 ----------------------
def test_divide_normal(calculator):
assert calculator.divide(10, 2) == 5.0
def test_divide_negative(calculator):
assert calculator.divide(-10, 2) == -5.0
def test_divide_by_zero(calculator):
with pytest.raises(ValueError) as excinfo:
calculator.divide(10, 0)
assert "除数不能为零" in str(excinfo.value)
# ---------------------- 通用计算接口测试 ----------------------
@pytest.mark.parametrize("operation, a, b, expected", [
("add", 3, 5, 8),
("subtract", 10, 4, 6),
("multiply", -3, 4, -12),
("divide", 10, 2, 5.0),
])
def test_calculate_valid_operations(calculator, operation, a, b, expected):
assert calculator.calculate(operation, a, b) == expected
def test_calculate_invalid_operation(calculator):
with pytest.raises(ValueError) as excinfo:
calculator.calculate("unknown", 1, 2)
assert "不支持的操作符" in str(excinfo.value)
# calculator.py
class Calculator:
def add(self, a, b):
"""两数相加"""
return a + b
def subtract(self, a, b):
"""两数相减"""
return a - b
def multiply(self, a, b):
"""两数相乘"""
return a * b
def divide(self, a, b):
"""两数相除,除数为零时抛出异常"""
if b == 0:
raise ValueError("除数不能为零")
return a / b
def calculate(self, operation, a, b):
"""根据操作符执行对应运算"""
operations = {
"add": self.add,
"subtract": self.subtract,
"multiply": self.multiply,
"divide": self.divide
}
if operation not in operations:
raise ValueError("不支持的操作符")
return operations[operation](a, b)
![]()