Bug、Defect、Issue、Error 到底有什么区别?

Bug 是 defect 的口语说法,defect 是正式术语——都指「软件不符合要求」的缺陷;而 issue 是伞词,把缺陷、需求、任务、疑问都装进去。 三者其实是同一件事在不同「仪式感」下的叫法,真正制造混乱的,是同一个团队里三种词混着用。 这些区别在聊天里不重要,但在三个地方会直接影响钱和结论:你度量什么、合同里承诺什么、以及你要求报障人填什么。 这篇给一套能写进术语表、从此不用再争的分法。

一句话版本

术语 范围 常见场景
Bug Defect 的口语词。通常指「以前能用」或「显然应该能用」的地方坏了 站会、聊天群、「结算页有个 bug」
Defect(缺陷) 正式术语:实际行为与预期行为之间的任何偏离,无论它曾经是否正常 QA 报告、审计、合同、度量
Issue(问题/事项) 伞词:任何需要决策的事项——缺陷、需求、任务、疑问 工具里的单号、发布说明
Error(错误) 人的行为导致了不正确的结果 根因分析、复盘
Fault(故障/缺陷点) 软件内部那段错误的指令或数据,是失败的成因 工程讨论、标准文档
Failure(失效) 可观测到的事件:系统没有做到它该做的 事故复盘、监控告警
只记一句:error → fault → failure 是一条因果链,而 defect 是你登记下来的那个东西(通常就是 fault),bug 是大家嘴上说的那个词。

因果链:Error / Fault / Failure

这套模型在标准和复盘里一直用得上:
  • Error(错误):人犯了错——需求理解偏了、假设错了、检查跳过了。
  • Fault(缺陷点):这个错变成了代码、配置或数据里一个具体的问题。
  • Failure(失效):在特定条件触发下,用户看得见结果——页面白了、金额算错了、保存在无声中失败。
  • 这条链解释了为什么「人为失误」永远不能单独作为根因:它只说明缺陷是怎么来的,没解释它为什么能上线。至于怎么给这些缺陷定级和排序,看缺陷分诊指南。

    为什么工具里更适合叫 Issue

    一个台账装的东西远不止缺陷。把对象定义为 issue(或保留 bug 作为口语),你才能在一处装下:
    • defect:行为错了;
    • feature request:行为本来就是缺的,是想要;
    • task:不涉及行为的活儿;
    • question:不需要改代码的疑问。
    最大的坑是「只有 bug 一种类型」的台账。团队会把需求当 bug 提进去抢队列位置,于是你的缺陷度量被永久污染——你再也分不清质量是在变好,还是大家只是换了个标签。 如果你正在选工具,问题跟踪系统选型指南讲的是更外层的标准;只关心 QA 生命周期的话,看缺陷管理软件对比。

    三个「叫对了能省钱」的场合

    1. 合同与 SLA。 一份承诺「严重缺陷 24 小时内修复」的支持协议,必须附上 defect 和 critical 的书面定义。没有定义,每次讨论都变成谈判。合同里写「bug」通常模糊到无法执行。 2. 度量。 缺陷密度、逃逸率、重开率只有在统计口径稳定时才有意义。如果一半「bug」其实是需求,这些数字全部作废。 3. 审计与合规。 受监管的产品通常需要可追溯的缺陷记录:严重级、验证证据、关闭依据。这是正式产物,用 defect 这个词本身就在提示它的正式性。

    Bug 还是需求?

    最容易吵起来的分界线:
    属于缺陷,如果…… 属于需求,如果……
    行为与书面要求或已确认的设计相矛盾 没有对应要求,这个行为从未被承诺过
    用户做不成以前能做成的事 用户能完成,只是不是他偏好的方式
    系统状态变得不一致,或数据丢失 系统是一致的,只是输出不是某人想要的
    涉及可访问性、安全或数据完整性 只是布局、文案、流程上的偏好
    真正难判的是「约定俗成」那一类:一个禁用的按钮点下去毫无反馈,在多数设计体系里算缺陷,哪怕需求文档没写。这类边界必须用书面规则定下来,否则每个迭代都要重吵一次。

    Bug 还是「报错」?

    屏幕上出现一条 error 提示,本身不是缺陷。「邮箱格式不正确」的校验提示是正确行为。缺陷是:提示内容错了、该提示时没提示、或不该提示时提示了。而「Console error」里的 error,指的是运行时打出的异常——它可能是缺陷,也可能完全是被正常捕获处理的预期情况。这也正是为什么报告要附上 Console 原文而不是拍一张截图:定级的人需要文本、堆栈和出现频次,不是一张图。

    选一套词,写下来

    大多数团队能落地的方案:
    • Issue 是工具里的对象,所有类型都在它下面。
    • Defect 是「行为错误」这个类型,也是度量、合同、报告里用的词。
    • Bug 保留为口语,但不进仪表盘。
    • Error / Fault / Failure 只在根因分析里按这个顺序使用。
    然后把这五行写进 QA 文档的术语表,连同上面那条「缺陷 vs 需求」的判定规则。目的不是语言洁癖,而是:只有术语稳定,报告才能复用,指标才能跨月比较。

    这对报告本身意味着什么

    不管你怎么叫,定级的人需要的字段是一样的:
    • 精确的页面或接口;
    • 做了什么、预期是什么、实际发生了什么;
    • 证据:截图、Console 报错、失败请求;
    • 环境:浏览器、系统、分辨率、时间戳。
    这就是「两分钟能定级」和「十五分钟审讯」的差别。逐字段的写法看Bug 报告格式,第一行怎么写得可搜索看标题示例。

    常见问题

    Bug 和 defect 是一回事吗? 日常使用中就是一回事。严格说,defect 是对「偏离预期行为」的定义,bug 是它的口语名。合同和审计用 defect,因为可定义;团队说 bug,因为短。 Defect 和 failure 是一回事吗? 不是。Defect 是软件里存在的缺陷;failure 是它在合适条件下被执行时、可被观察到的事件。一个缺陷可以在代码里躺几年,一次都没触发过 failure。 工具里该叫 bug 还是 issue? 对象叫 issue,把 defect 作为一种类型。只有「bug」一种类型的台账,会逼着需求混进缺陷队列,最终毁掉质量度量。 Error 放在哪? Error 是「人的行为引入了缺陷」,它是原因,不是工单类型。把「人为失误」当根因,会让分析提前一步停下。 需要用工具强制这套分类吗? 轻量即可。一个必填的「类型」字段,加上缺陷与需求的书面判定规则就够了。分类再细,通常只会更完整地记录错误的东西。