如何有效地报告Bug?

自由软件开发者Simon Tatham针对如何有效地报告Bug发表了自己的看法,他列举了一系列拙劣Bug报告的例子,并提出了改正建议。

Simon首先列举了一系列拙劣Bug报告的例子,包括:

  • 在报告中说“不好用”;
  • 所报告内容毫无意义;
  • 在报告中用户没有提供足够的信息;
  • 在报告中提供了错误信息;
  • 所报告的问题是由于用户的过失而产生的;
  • 所报告的问题是由于其他程序的错误而产生的;
  • 所报告的问题是由于网络错误而产生的;

接着,他点出了报告Bug的目的:

简单地说,报告bug的目的是为了让程序员看到程序的错误。您可以亲自示范,也可以给出能导致程序出错的、详尽的操作步骤。如果程序出错了,程序员会收集额外的信息直到找到错误的原因;如果程序没有出错,那么他们会请您继续关注这个问题,收集相关的信息。

在bug报告里,要设法搞清什么是事实(例如:“我在电脑旁”和“XX出现了”)什么是推测(例如:“我想问题可能是出在……”)。如果愿意的话,您可以省去推测,但是千万别省略事实。

然后,Simon针对Bug报告的不同问题分别提出了自己的见解: 

“程序不好用”

程序员不是弱智:如果程序一点都不好用,他们不可能不知道。他们不知道一定是因为程序在他们看来工作得很正常。所以,或者是您作过一些与他们不同的操作,或者是您的环境与他们不同。他们需要信息,报告bug也是为了提供信息。信息总是越多越好。

许多程序,特别是自由软件,会公布一个“已知bug列表”。如果您找到的bug在列表里已经有了,那就不必再报告了,但是如果您认为自己掌握的信息比列表中的丰富,那无论如何也要与程序员联系。您提供的信息可能会使他们更简单地修复bug。

“演示给我看”

报告bug的最好的方法之一是“演示”给程序员看。让程序员站在电脑前,运行他们的程序,指出程序的错误。让他们看着您启动电脑、运行程序、如何进行操作以及程序对您的输入有何反应。

他们对自己写的软件了如指掌,他们知道哪些地方不会出问题,而哪些地方最可能出问题。他们本能地知道应该注意什么。在程序真的出错之前,他们可能已经注意到某些地方不对劲,这些都会给他们一些线索。他们会观察程序测试中的每一个细节,并且选出他们认为有用的信息。

这些可能还不够。也许他们觉得还需要更多的信息,会请您重复刚才的操作。他们可能在这期间需要与您交流一下,以便在他们需要的时候让bug重新出现。他们可能会改变一些操作,看看这个错误的产生是个别问题还是相关的一类问题。如果您不走运,他们可能需要坐下来,拿出一堆开发工具,花上几个小时来好好地研究一下。但是最重要的是在程序出错的时候让程序员在电脑旁。一旦他们看到了问题,他们通常会找到原因并开始试着修改。

“哪儿出错了?在我看来一切正常哦!”

如果您给了程序员一长串输入和指令,他们执行以后没有出现错误,那是因为您没有给他们足够的信息,可能错误不是在每台计算机上都出现,您的系统可能和他们的在某些地方不一样。有时候程序的行为可能和您预想的不一样,这也许是误会,但是您会认为程序出错了,程序员却认为这是对的。

同样也要描述发生了什么。精确的描述您看到了什么。告诉他们为什么您觉得自己所看到的是错误的,最好再告诉他们,您认为自己应该看到什么。如果您只是说:“程序出错了”,那您很可能漏掉了非常重要的信息。

如果您看到了错误消息,一定要仔细、准确的告诉程序员,这确实很重要。在这种情况下,程序员只要修正错误,而不用去找错误。他们需要知道是什么出问题了,系统所报的错误消息正好帮助了他们。如果您没有更好的方法记住这些消息,就把它们写下来。只报告“程序出了一个错”是毫无意义的,除非您把错误消息一块报上来。

特殊情况下,如果有错误消息号,一定要把这些号码告诉程序员。不要以为您看不出任何意义,它就没有意义。错误消息号包含了能被程序员读懂的各种信息,并且很有可能包含重要的线索。给错误消息编号是因为用语言描述计算机错误常常令人费解。用这种方式告诉您错误的所在是一个最好的办法。

在这种情形下,程序员的排错工作会十分高效。他们不知道发生了什么,也不可能到现场去观察,所以他们一直在搜寻有价值的线索。错误消息、错误消息号以及一些莫名其妙的延迟,都是很重要的线索,就像办案时的指纹一样重要,保存好。

如果您使用UNIX系统,程序可能会产生一个内核输出(coredump)。内核输出是特别有用的线索来源,别扔了它们。另一方面,大多数程序员不喜欢收到含有大量内核输出文件的EMAIL,所以在发邮件之前最好先问一下。还有一点要注意:内核输出文件记录了完整的程序状态,也就是说任何秘密(可能当时程序正在处理一些私人信息或秘密数据)都可能包含在内核输出文件里。

除此之外,Simon还举了其他一些例子,他最后总结到:

  • bug报告的首要目的是让程序员亲眼看到错误。如果您不能亲自做给他们看,给他们能使程序出错的详细的操作步骤。
  • 如果首要目的不能达成,程序员不能看到程序出错。这就需要bug报告的第二个目的来描述程序的什么地方出毛病了。详细的描述每一件事情:您看到了什么,您想看到什么,把错误消息记下来,尤其是“错误消息号”。
  • 当您的计算机做了什么您料想不到的事,不要动!在您平静下来之前什么都别做。不要做您认为不安全的事。
  • 尽量试着自己“诊断”程序出错的原因(如果您认为自己可以的话)。即使做出了“诊断”,您仍然应该报告“症状”。
  • 如果程序员需要,请准备好额外的信息。如果他们不需要,就不会问您要。他们不会故意为难自己。您手头上一定要有程序的版本号,它很可能是必需品。
  • 表述清楚,确保您的意思不能被曲解。
  • 总的来说,最重要的是要做到精确。程序员喜欢精确。

感兴趣的读者可以查看Simon的原文和中文版翻译

崔康 热情的技术探索者,资深软件工程师,InfoQ编辑,从事企业级Web应用的相关工作,关注性能优化、Web技术、浏览器等领域。


<think>嗯,用户这次聚焦在如何规范记录和提交BUG报告上,正好接续上次讨论的"无法复现BUG"场景。从引用内容看,用户明显需要实操层面的具体指导,而非泛泛而谈。用户提供的三个引用很有价值:[^1]强调高质量BUG报告要素,[^2]补充了语言表达规范,[^3]则涉及跟踪流程。需要将这些分散的要点整合成体系化的操作指南。注意到用户特别要求"参考站内引用",说明ta可能正在准备测试工作文档或面试。上次回复中关于"无法复现BUG"的步骤1(立即记录)其实已经涉及报告基础,这次要深化到日常所有BUG报告规范。用户没提具体业务场景,所以需保持通用性,但可以暗示不同系统(如Web/APP)的特殊字段差异。 核心矛盾在于:测试人员要平衡报告的完整性和效率。引用[^2]提到"避免复杂句型"很关键——很多新人会犯过度描述的毛病。应该用"模块化写作"的思路来化解:将报告拆解为标题、环境等必填字段,再配以自由描述的复现步骤。 特别要注意引用[^3]隐含的团队协作视角。BUG报告本质是测试与开发的通信协议,需要包含"开发拒绝时如何论证"的预防性设计,比如截图证据的保存要求。这点在面试场景常被忽略。最后考虑加入风险控制维度。用户没问但实际需要的是:如何避免因报告不规范导致的BUG遗漏?可以在总结部分强调"报告即承诺",每个字段都对应后续跟踪责任。</think>在软件测试中,规范地记录和提交BUG报告是保障缺陷高效处理的核心环节。以下是基于行业实践和引用资料的标准化操作流程,确保报告清晰、可追溯、可操作: --- ### **一、BUG报告的必备要素(结构化记录)** 根据引用[^1][^2],高质量报告需包含以下核心字段: | **字段** | **规范要求** | **示例** | |-------------------|-----------------------------------------------------------------------------|------------------------------------------| | **标题** | 简明概括缺陷本质,包含模块+现象 | `[支付模块] 提交订单后支付状态未更新` | | **严重等级** | 按影响分级:<br>• 致命(系统崩溃)<br>• 严重(功能阻塞)<br>• 一般(功能异常)<br>• 建议(优化问题) | `严重` | | **优先级** | 按修复紧急性分级:<br>• P0(立即修复)<br>• P1(当前版本修复)<br>• P2(后续版本修复) | `P1` | | **测试环境** | 精确描述环境变量:<br>• 操作系统+版本<br>• 浏览器/APP版本<br>• 网络环境<br>• 测试数据 | `Windows 11, Chrome 115, 4G网络, 测试账号user_test` | | **复现步骤** | 分步骤描述操作路径,避免遗漏关键动作 | `1. 登录账号<br>2. 选择商品A加入购物车<br>3. 点击支付按钮` | | **实际结果** | 客观描述缺陷现象 | `支付成功提示弹出,但订单状态仍显示"待支付"` | | **预期结果** | 明确正确行为标准 | `订单状态应同步更新为"已支付"` | | **附件证据** | 必须提供:<br>• 截图/录屏(标注问题点)<br>• 日志文件(错误堆栈)<br>• 控制台报错信息 | ![支付状态错误截图](url) | --- ### **二、提升报告质量的关键技巧** 1. **语言精准性** - 使用短句和短语,避免复杂修饰(如:“点击后**偶尔**出现空白页” → “**步骤3后页面概率性空白**”)[^2] - 禁用主观表述(如“我觉得”“可能”),改用客观事实(如“**控制台输出TypeError: undefined**”) 2. **复现路径优化** - 最小化复现步骤:删除无关操作,保留最简触发路径[^1] - 标注偶现条件:如“**连续操作5次后必现**”或“**仅在低网络带宽下出现**” 3. **附件使用规范** ```markdown ![缺陷截图描述](图片URL) • 截图需包含:URL地址、操作元素、错误提示 • 日志文件需标注错误时间戳(如:`[2024-07-20 14:25:32] ERROR PaymentService: Line 45`) ``` --- ### **三、团队协作与跟踪流程** 1. **提交后的沟通机制** - 若开发拒绝修复,需补充技术证据: - 提供相同环境下的复现录屏 - 引用需求文档条款(如:“**需求文档v1.2第5章规定支付状态需实时同步**”)[^3] - 争议时发起三方会议(测试+开发+产品经理) 2. **BUG状态跟踪** ```mermaid graph LR A[新建] --> B[开发修复] B --> C{测试验证} C -->|通过| D[关闭] C -->|不通过| B D -->|偶现缺陷| E[监控3个版本] E -->|未重现| F[注释后关闭] ``` - 对无法复现的BUG:标记“**暂无法复现**”,并在后续版本回归测试中监控[^3] --- ### **四、避免的常见错误** - **❌ 模糊描述**: “支付功能有问题” → **✅ 修正为**:“使用支付宝支付成功后,订单列表页金额显示为0” - **❌ 环境缺失**: 未注明iOS版本 → **✅ 修正为**:“iOS 17.5.1, iPhone 15 Pro” - **❌ 步骤冗余**: 包含登录、搜索等无关操作 → **✅ 修正为**:仅保留支付流程关键步骤 --- ### **五、总结:高质量报告的核心原则** 1. **完整性**:覆盖所有必备字段,提供完整证据链[^1] 2. **可复现**:开发人员可快速复现缺陷(提供测试账号/数据) 3. **可追溯**:通过标题和模块快速定位问题场景 4. **标准化**:遵循团队统一的缺陷管理模板 > 引用行业实践:“缺陷报告的目标是**用最少的信息量让开发快速定位问题**。测试人员需像法医一样客观记录现场,而非撰写小说。”[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值