一句话说清
测试是提前找错,调试是出错之后定位原因。
为什么值得懂
软件出错几乎是必然,区别只在代价:测试让错误在交付前暴露,调试让错误在暴露后能被找到。
零基础讲解
一、测试是「用输入换信心」。 给一组输入、写下期望、让它跑;结果不一样就说明有问题。
二、测试能证明有错,不能证明没错。 迈尔斯在《软件测试的艺术》第 2 章把它写成第一条原则:测试的目的是发现错误。全绿不等于对,只等于这组输入没出事。
三、调试的第一步永远是复现。 策勒把「复现问题」列为调试的第一项任务:只有能按需让问题出现,才判断得出哪次改动有用。
四、测试分大小。 《Software Engineering at Google》第 11 章按资源把测试分成小、中、大三级:小测试只跑单个函数、不碰网络,毫秒级就跑完。
五、不测的代价可以算。 美国国家标准与技术研究院 2002 年估算,测试基础设施不足给美国经济造成的年损失最高达 595 亿美元。
有争议:覆盖率能不能当质量指标。 主流观点是它只说明某一行被执行过,不说明结果对不对:《Software Engineering at Google》第 11 章说,把覆盖率当成测试质量的黄金标准「有点不幸」。也有团队把它设为发布门槛,理由是至少能量出还有多少代码没被执行过。本文的立场:覆盖率看盲区,不当合格线。
一个例子
算日期最容易踩月底:1 月 31 日加一个月,是 2 月 28 日还是 3 月 3 日?两种都有人写。
常见误解
- 以为测试的用途是证明程序没错:它只能证明这组输入没出错。
- 以为调试靠灵感:它靠复现、缩小范围、提出假设再验证。
- 以为跑通一次就算完:没进回归的修复,下次改动就会退回。
应用场景
- 生活:换灯泡先用旧灯泡试一次,就是在排除变量。
- 职场:报问题时给「操作步骤+期望+实际」三样,比说「它坏了」有用。
- 写作与创作:写技术情节,让角色先复现再改代码,别盯着屏幕等灵光。
关联知识点
- 数据结构(data-structures,先读它:不同结构出错方式不同)
- 算法(algorithm,边界条件就是算法里的那些特例)
- 编程思维(programming-mindset,调试是四个核心动作之一)
- 所属主线:因果与系统、风险与概率