一句话说清

测试是提前找错,调试是出错之后定位原因。

为什么值得懂

软件出错几乎是必然,区别只在代价:测试让错误在交付前暴露,调试让错误在暴露后能被找到。

零基础讲解

一、测试是「用输入换信心」。 给一组输入、写下期望、让它跑;结果不一样就说明有问题。

二、测试能证明有错,不能证明没错。 迈尔斯在《软件测试的艺术》第 2 章把它写成第一条原则:测试的目的是发现错误。全绿不等于对,只等于这组输入没出事。

三、调试的第一步永远是复现。 策勒把「复现问题」列为调试的第一项任务:只有能按需让问题出现,才判断得出哪次改动有用。

四、测试分大小。 《Software Engineering at Google》第 11 章按资源把测试分成小、中、大三级:小测试只跑单个函数、不碰网络,毫秒级就跑完。

五、不测的代价可以算。 美国国家标准与技术研究院 2002 年估算,测试基础设施不足给美国经济造成的年损失最高达 595 亿美元。

有争议:覆盖率能不能当质量指标。 主流观点是它只说明某一行被执行过,不说明结果对不对:《Software Engineering at Google》第 11 章说,把覆盖率当成测试质量的黄金标准「有点不幸」。也有团队把它设为发布门槛,理由是至少能量出还有多少代码没被执行过。本文的立场:覆盖率看盲区,不当合格线。

测试与调试的流程:一次失败依次经过复现、缩小范围、定位与修复、回归验证五个环节,测试负责发现,调试负责定位,回归负责确认
测试负责发现失败,调试负责找到原因,回归负责确认没改坏别处。

一个例子

算日期最容易踩月底:1 月 31 日加一个月,是 2 月 28 日还是 3 月 3 日?两种都有人写。

常见误解

  • 以为测试的用途是证明程序没错:它只能证明这组输入没出错。
  • 以为调试靠灵感:它靠复现、缩小范围、提出假设再验证。
  • 以为跑通一次就算完:没进回归的修复,下次改动就会退回。

应用场景

  • 生活:换灯泡先用旧灯泡试一次,就是在排除变量。
  • 职场:报问题时给「操作步骤+期望+实际」三样,比说「它坏了」有用。
  • 写作与创作:写技术情节,让角色先复现再改代码,别盯着屏幕等灵光。

关联知识点

  • 数据结构(data-structures,先读它:不同结构出错方式不同)
  • 算法(algorithm,边界条件就是算法里的那些特例)
  • 编程思维(programming-mindset,调试是四个核心动作之一)
  • 所属主线:因果与系统、风险与概率