Python 单元测试入门:用 unittest 检查购物清单总价
写完一个函数后,手动试一次只能说明这次输入看起来正常。下次修改代码时,原来的行为是否还在?Python 自带的 unittest 可以把预期写成可重复运行的检查,不需要额外安装测试库。
从一个小需求开始
假设需要计算购物清单总价:输入是一组非负数字,空清单的总价是零;如果有负数,就提示输入无效。新建文件 test_total.py,写入:
import unittest
def total(prices):
if any(price < 0 for price in prices):
raise ValueError("价格不能为负")
return sum(prices)
class TotalTests(unittest.TestCase):
def test_normal(self):
self.assertEqual(total([3, 5, 2]), 10)
def test_empty(self):
self.assertEqual(total([]), 0)
def test_negative(self):
with self.assertRaises(ValueError):
total([3, -1])
if __name__ == "__main__":
unittest.main()
这里约定 prices 使用列表,示例只演示整数金额;真实金额计算还要明确精度、类型和舍入规则。三个测试分别覆盖普通输入、空列表和非法值。把一个场景写成一个方法,失败时更容易定位问题。
运行并理解结果
在文件所在目录执行:
python -m unittest -v test_total
如果系统使用 python3 命令,可以将上面的 python 改成 python3。参数 -v 会显示每个测试的名称;全部通过时,末尾显示 OK 和运行数量。测试类继承 unittest.TestCase,方法名以 test 开头,测试运行器才能按约定识别它们。
assertEqual 比较实际值与期望值;assertRaises 检查代码是否抛出指定类型的异常。如果得到错误结果,框架会报告失败位置和实际值;如果程序发生未预期的异常,则会报告错误及堆栈。
试着制造一次失败
将普通测试的期望值暂时改成 11,重新运行。输出会显示 10 与 11 不相等,并指出失败的测试方法。观察后把期望值改回 10,再确认通过。刻意体验一次失败,有助于分辨“没有运行测试”和“测试发现问题”。
测试通过只证明所列场景满足了断言,不能保证程序在所有输入下都正确。实际开发中,可以继续补充小数、非数字输入或更多业务边界,并先明确每种情况应当如何处理。修改代码后重复运行,让测试成为日常反馈的一部分。
- 点赞
- 收藏
- 关注作者
评论(0)