项目结构
calculator-project/
├── src/
│ └── calculator.py # 更合理的文件名
├── tests/
│ ├── __init__.py
│ └── test_calculator.py # 符合unittest命名规范
├── main.py
├── requirements.txt # 新增依赖文件
└── README.md # 新增项目说明
-
calculator.py (src目录下)
class Calculator:
"""支持四则运算的计算器类"""
def compute(self, a: int, b: int, op: str) -> float:
"""
执行计算操作
:param a: 第一个操作数
:param b: 第二个操作数
:param op: 运算符 (+, -, *, /)
:return: 计算结果
:raises: ValueError 当遇到无效运算符或除零错误时
"""
if op == "+":
return a + b
elif op == "-":
return a - b
elif op == "*":
return a * b
elif op == "/":
if b == 0:
raise ValueError("除零错误")
return a / b # 返回浮点结果更精确
else:
raise ValueError(f"无效运算符: '{op}'")
-
test_calculator.py (tests目录下)
import unittest
from src.calculator import Calculator
class TestCalculator(unittest.TestCase):
"""Calculator类的单元测试"""
def setUp(self):
self.calc = Calculator()
def test_addition(self):
"""测试加法"""
self.assertEqual(self.calc.compute(1, 1, "+"), 2)
self.assertEqual(self.calc.compute(-5, 3, "+"), -2)
def test_subtraction(self):
"""测试减法"""
self.assertEqual(self.calc.compute(4, 2, "-"), 2)
self.assertEqual(self.calc.compute(10, 15, "-"), -5)
def test_multiplication(self):
"""测试乘法"""
self.assertEqual(self.calc.compute(3, 4, "*"), 12)
self.assertEqual(self.calc.compute(-2, 6, "*"), -12)
def test_division(self):
"""测试除法"""
self.assertEqual(self.calc.compute(8, 4, "/"), 2.0)
self.assertAlmostEqual(self.calc.compute(10, 3, "/"), 3.333, places=3)
def test_division_by_zero(self):
"""测试除零异常"""
with self.assertRaises(ValueError):
self.calc.compute(5, 0, "/")
def test_invalid_operation(self):
"""测试无效运算符"""
with self.assertRaises(ValueError):
self.calc.compute(2, 3, "?")
if __name__ == "__main__":
unittest.main()
-
main.py (项目根目录)
from src.calculator import Calculator
def run_calculator():
"""命令行计算器交互界面"""
print("===== 命令行计算器 =====")
try:
num1 = float(input("输入第一个数字: "))
num2 = float(input("输入第二个数字: "))
op = input("输入运算符 (+, -, *, /): ").strip()
result = Calculator().compute(num1, num2, op)
print(f"\n结果: {num1} {op} {num2} = {result}")
except ValueError as e:
print(f"\n错误: {str(e)}")
except Exception:
print("\n发生未知错误")
if __name__ == "__main__":
run_calculator()
-
requirements.txt
# 项目依赖
python>=3.8
-
README.md (项目说明)
# Python测试实践:计算器项目
## 项目亮点
- 完整的单元测试覆盖(包含异常测试)
- 类型提示和文档字符串
- 符合PEP8的代码规范
- 错误处理机制完善
- 模块化设计
## 如何运行
1. 安装依赖:`pip install -r requirements.txt`
2. 运行测试:`python -m unittest discover -s tests`
3. 运行程序:`python main.py`
## 测试设计特点
- 使用setUp方法创建测试对象
- 测试方法命名规范(test_功能_场景)
- 包含正向测试和异常测试
- 使用assertAlmostEqual处理浮点数比较
- 每个测试用例有独立文档说明
## 最佳实践应用
1. **异常驱动设计**:使用raise替代返回0和print
2. **类型提示**:提高代码可读性和IDE支持
3. **测试覆盖率**:覆盖所有操作和边界条件
4. **模块分离**:业务逻辑/测试/UI分层清晰
5. **文档完整性**:所有函数都有docstring说明