Python精讲之Python测试项目实践

项目结构

calculator-project/
├── src/
│   └── calculator.py   # 更合理的文件名
├── tests/
│   ├── __init__.py
│   └── test_calculator.py  # 符合unittest命名规范
├── main.py
├── requirements.txt    # 新增依赖文件
└── README.md           # 新增项目说明
  1. 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}'")
  1. 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()
  1. 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()
  1. requirements.txt

# 项目依赖
python>=3.8
  1. 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说明
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包

        打赏作者

        像素笔记

        你的鼓励将是我创作的最大动力

        ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
        扫码支付:¥1
        获取中
        扫码支付

        您的余额不足,请更换扫码支付或充值

        打赏作者

        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值