与程序员和客户一起工作,我发现有时候验证缺陷的修复方法要比为开发人员修复缺陷更困难。

一个简单的例子是当方法。错误报告不包含重现该问题的任何步骤,仅包含堆栈跟踪。给定如此糟糕的报告,开发人员会更正代码,以便该方法可以吞下此类异常或重新编写该方法。然后他将缺陷标记为已修复。

作为测试人员,我通常更关心上下文。为什么NullPointerException值到达方法?哪个组件产生了它,为什么?因此,仅仅吞下异常不是解决方案:它可能并没有消除错误。

这种问题通常发生,当其他人(例如我的客户代表)报告了一个错误(不是我),而我仅在验证修复程序时才看到错误报告。 br />
所以一切都归结为错误报告的质量。如果在修复bug之前没有编写重现步骤,则必须在修复后识别它们。然后通常很难做到这一点,因为我需要从SVN中检出/设置两个系统版本:一个在修复之前,而另一个在提交修复之后。

那么我们怎么能改进过程?


测试人员和开发人员是否应在修复错误报告之前先进行重现,并提供重现步骤?我不在乎谁会这样做,但是我认为应该在bug生命周期中采取这样的步骤。

编辑:也许我不够清楚。我没有问过如何编写良好的错误报告。我宁愿在寻找使开发人员,客户代表,业务分析师,我等完成在我们手中的错误报告的实用方法。到目前为止,还提出了其他一些解决方案:


在错误报告中引入模板
与利益相关者一起查看好的和坏的报告,以展示它们如何帮助或阻碍重现错误并进行修复
不断地要求客户提供更多详细信息(与客户交谈对我来说似乎是另一回事) ,尤其是他们在发生故障之前所做的事情。

特别地,我没有看到任何答案,在解决错误后,开发人员应在错误报告中提供什么?根本原因?感动了哪些区域?他们是如何改变的?在哪个修订版本中进行过更改?

评论

相关问题-sqa.stackexchange.com/questions/28789/…

#1 楼

首先,我想说的是,通常只需照顾例外就足够了。也许这是一个被遗忘的特殊情况(排序一个列表,但是忘记它可能是空的)。当然,当您可以信任开发人员以确保修复程序正确时,您会更加了解。

然后回答您的问题:




在每个错误中都有相应步骤非常好。最好有一个测试用例在修复该错误之前重现该错误。就是说,我还编写了错误报告,这些报告没有确切的步骤,但确实尽力解释了这种情况。有时,即使我什至不知道破坏系统的确切原因,我也必须提交错误。当然,在这些情况下,我可以帮助开发人员解决他们可能遇到的任何问题。

也许开发人员也不知道如何准确地重现它,但是会对损坏的部分进行代码审查并找到一些问题。完全有可能知道某个问题,而又不知道如何使系统完全运行到确切的状态。

如果问题显然出在沟通中,而不是重现问题的困难,那么我只能建议所有人,为什么写一个好的错误报告很重要。指出可能有很多人在不同的时间阅读案例(开发人员修复错误,测试人员测试修复,为客户提供技术支持,其他报告错误的人,产品所有者和其他股东试图了解产品的状态, ...)。

我认为仅仅拒绝这些错误并没有取得成功。这听起来很自大,只会妨碍与记者的讨论。将错误保持开放状态,但要问清楚要重现的问题或步骤,但仍准备好在未得到这些问题的情况下解决该问题。如果明显存在问题,即使指出该问题的人无法告诉他们确切的解决方法,也应予以解决。他们无论如何都已经看到了。也许他们甚至对产品不太了解,也不了解导致问题的原因,或者太忙而无法解决问题。这样做不好,但是不同的人有不同的优先级,并且对于某些人来说,错误报告的位置可能并不靠前。

总的来说,我认为我们经常所需要的信息少于我们想要的。以在这样的条件下也能工作而感到自豪,但不断推动人们改善流程。

评论


好。因此,没有可复制的步骤,几乎没有希望我们能够在合理的时间内获得它们。因此,开发人员基于代码审查来修复代码。基于什么您可以确定缺陷是否已修复?您可能只会获得一定程度的信心,这将基于查看修复程序,与开发人员讨论可能的情况以及了解系统的工作原理。然后,您将构建传递到生产中,并保持手指交叉;-)对吗?

– dzieciou
2013年9月22日21:10



还有一件事。也许我误解了您,但是阅读您的帖子听起来像是验证该修补程序是对开发人员的信任功能。因此,让我开个玩笑:下一次我的经理问我如何确保缺陷不会出现在生产中时,我会回答:“我问了一个开发人员,他说他已修复它。我信任他。”开玩笑。认真地说,我更愿意基于事实而不只是基于信任来验证修补程序。我什至可以将检查范围限制为检查开发人员为验证其修补程序而编写的测试,如果我信任我的开发人员,甚至可以从表面进行检查,但是这样的测试应该存在。

– dzieciou
2013年9月22日在21:21



当然,这里的情况是不需要的,有时您的第一条评论是您可以做的最好的事情。关于信任:我相信开发人员能够分析情况并确定是否足以进行较小的修复或是否需要进行较大的更改。然后,我的工作是验证该修补程序确实涵盖了所有情况,并且没有破坏其他任何内容。我发现了我们所有开发人员所犯的错误,因此我没有通过基于他们的话的测试。

–教育
2013年9月22日22:01在

#2 楼

我喜欢将“错误”视为三部分:



失败。系统产生的结果与我们想要产生的结果之间观察到的差异。

故障。在某些情况下会导致故障的系统错误。

条件。故障导致故障的条件。

在这三部分中,一个测试人员(和其他人员)首先遇到的是故障。在OP的情况下,您会看到NullPointerException

有时故障的性质会提供足够的信息以识别故障。在OP的情况下可能就是这种情况。因此,开发人员修复了错误……据我们所知。

OP场景中(通常在缺陷报告中)缺少的是导致失败的条件。 />
要确定情况,通常必须进行一些调查。有人可能是测试人员,开发人员或团队。想法是隔离涉及的变量。我使用的技术的简要概述:


头脑风暴,您可以想到的所有可能涉及的变量。


测试动作和输入,以识别可能受动作和输入影响的变量(前提条件,动作,输入,事件序列)。

从故障(甚至是故障,如果发生故障,请向后退)您知道)来识别可能导致该故障的变量。

从每个变量向前和向后进行工作,以识别可能涉及的其他变量。


分类变量。我喜欢使用思维导图将它们聚类。您可以使用鱼骨图。或者,您可以在变量之间建立某种因果关系图。
通过选择最可能的类别或变量并进行试验以查看其对故障是否有影响,从而确定相关条件。如果它似乎没有效果,请转到下一个变量。

此调查可能会很昂贵。它可能需要对系统内部有详细了解的人员。可能需要当前正在优先处理其他活动的人员。

但是不仅包含故障而且包括条件的缺陷报告更有助于发现故障,更有助于重现故障,并且对测试和重新测试更有帮助。

评论


有人无缘无故地拒绝了这个答案。您(下注者)可以更具建设性吗?

– dzieciou
2013年9月23日在12:16

这个答案被否决了吗?对我来说看起来很坚如磐石(逻辑,有意义和写得很好)。 +1

–卢卡斯·施瓦茨(Lucas Schwarz)
2013年9月25日18:59

+戴尔,+卢卡斯,答案说明了如何编写良好的错误报告。我没有要求。我宁愿问过如何在组织中定义一个流程来改进报告,从客户代表,修复该问题的开发人员那里获得更好的报告,是否应该完成该报告(但我不是拒绝这样做)。

– dzieciou
2013年9月26日6:20



#3 楼

错误编写者可能没有收集正确的信息,因为他们不了解要包含的内容和时间。对于那些认为编写错误报告很容易但是却不了解好的错误报告的元素的人来说,常见的错误。

碰巧我写了一篇有关如何编写好的错误报告的文章。在本文中,我尝试从BBST Bug Advocacy类中提取良好的bug报告的元素。阅读。您也可以查看来自Bug Advocacy的源信息,以获取更多信息。

那么,如何解决问题:

您可以与团队成员(程序员,其他测试人员)一起查看现有的错误报告,以期了解他们的各种要素报告以及如何改进它们。标题和摘要如何编写?简短,简洁和准确?向他们展示不良和良好报告的示例。看看他们是否必须找出方法来改进自己的报告(如果他们必须重写它们)。您甚至可以开始修复发现质量较低的错误报告。这将使整个团队集中精力确保报告的质量,无论他们是否编写报告,都是高质量的。

现在,如果客户直接报告问题,则可能需要设置一些基本规则并/或模板,以确保它们包含有价值的信息。示例在这里效果很好。他们总是有机会不予理attention,在这种情况下,您可以回覆以获取更多信息。如果其他人(内部人员)为您的客户记录了错误,则将其与程序员一起接受培训。

我喜欢这样看:提交错误报告的原因是为了获取错误已修复。如果您没有足够的简洁信息来识别问题,则没有理由打开错误报告-您将无法对其进行任何处理。

评论


我不同意不应打开您没有足够信息(尚未发现!)来识别问题的错误。请参阅Joe Strazzare对此的回答。

– dzieciou
2013年9月26日下午6:16

这取决于您如何使用错误跟踪系统,还取决于问题的类型。如果它是间歇性问题,则可以将其归档为问题而不是错误。如果客户报告的是您在没有更多信息的情况下无法理解/复制的内容,则可以等到报告为止,直到您有足够的证据来支持有关错误,问题等的结论。

–克里斯·肯斯特(Chris Kenst)
2013年9月26日在18:42

#4 楼

有关其他人提出的建议的几点想法:




复制问题:在任何可能的情况下,我都会尝试复制任何客户报告的问题,因为可能还会涉及其他问题客户没有报告-特别是如果错误报告本身仅包含堆栈转储。可能只有在使用特定配置时才会发生这种情况,或者这是客户执行的一系列操作所浮出水面的其他一些不稳定的可见端点。

指导错误工具有帮助:如果有可能,有一个针对客户报告的错误的模板,它包含以下内容(我的措辞很粗略,但您明白了)会有所帮助:


问题在系统中的哪里发生? (几行空格,因此很明显可以预期得到答案)

您期望发生什么? (再次添加几行空间)

实际发生了什么(请尽可能具体)?

每次都会发生这种情况吗? (也就是说,是否可以重现该问题)

请描述您为重现该问题所采取的步骤:(以及下面的许多空白)




如有必要,请更新错误报告:可能由于客户报告的问题,最初的信息还不够。客户往往会忘记他们的配置不是Universe中唯一的配置,因此,除非您拥有准确的客户配置数据库,否则其他人可能需要添加此信息。谁进行更新都没有关系,只要进行了更新,以便在两个月后需要重新测试该问题时,测试人员所需的所有信息就可以在错误报告中找到。

记录测试步骤和测试配置:这应该很明显,但是仍然值得重复。在测试生涯的早期,我曾多次向客户报告一个错误,因为实际上存在多个具有相同症状的错误,每个错误所显示的配置略有不同。在第一步中,开发人员修复了该问题,我验证了最明显的体现。下一遍,我们获得了有关客户配置的更多信息,其中增加了第一次迭代中不存在的条件。因此,该问题已得到解决和验证-但是还涉及其他条件和配置,当被询问时,这些条件和配置都是由客户一个接一个地发出的,“哦,是的,我们在做X”。如果我知道确切地记录我为设置,复制和验证所做的工作,那么来回的希望就不会那么多了(在发现该错误之后,我才学会了。我学到了男孩子)。当然,如果有的话,我可能不会偶然发现所有相互关联的错误,那么谁知道呢?


#5 楼

作为测试人员,我总是喜欢以高效的方式报告错误,以便通过提供尽可能多的信息来减少在开发人员处进行错误修复的成本(时间和精力)。
我想对于改进bug报告过程的几点要说的要点:

报告新的BUG时,我们应该尝试提及以下内容:

1。简短描述:
每个错误都必须有一个简短描述,其中应尽可能以最短的方式包含有关该问题的尽可能多的信息。

2.Severity:Term本身表明它是对问题的度量。发现的错误对整个系统或系统操作的影响。错误的严重性必须提及。

3.优先级:先修复此错误有多重要?
报告新错误时必须标记优先级。

4。子系统:
如果我们提到当前错误所属的子系统(模块/子模块),则在修复或评估已开发/开发模块的过程中有助于检查错误。

5 。描述:
描述也是错误报告中非常重要的部分。
在描述部分中,我们应该在各个方面提供尽可能多的与BUG相关的信息。以下是一些内容:


报告者:帮助开发人员找回该人,以防他在修复它时可能无法重现该人。
报告日期
测试服务器信息(如果有的话)
经过测试的版本/版本

以上提到的三种方法都可以在根本原因分析中帮助您解决错误。通过直接单击链接作为参考的页面链接可以看到错误。

6。附件:
附件基本上包括屏幕快照,以及再现错误时所需的任何其他文件。

拍摄屏幕快照时,我们应重点注意以下内容:
-不应在屏幕截图中包含不必要的部分,但请注意包括所有必要的内容。
-实际问题所在的区域应标记为红色
-应在其中提供一些消息屏幕上显示了有关该错误的画面

7。重现步骤:
这是报告错误时最重要的步骤
在这里,我们应该逐步编写确切的步骤,然后在质量检查结束时重现错误。
这必须包括:
当前/实际行为以及预期行为(按照我的看法,这并不总是强制性的,但是在报告错误时是强制性的)。

8。错误日志:
即使我们包含了错误消息,该消息在重现在UI上获得的错误时也会得到,但是并没有给出有关错误的完整而详细的想法。因此,我们应该提供带有错误的错误日志。
错误日志是开发人员本身包含在代码中的代码的一部分,因此应在应用程序发生任何崩溃或某些故障时捕获。
错误日志提供了一个关于发生故障的原因有很多想法,查看此日志开发人员可以轻松地找出问题所在的区域。

有可能有时候我们没有上面提到的所有信息,但我们可以尝试提供尽可能多的信息。

这不仅非常重要,不仅可以降低修复成本,而且在验证修复程序时也如您在上述情况中所述。报告错误的人在修复错误后并不一定会验证错误,因此,在报告错误时提供详细信息是一种很好的做法。

关于第二个问题:“如果开发人员和测试人员无法从客户那里收集信息以重现该错误,那么他们应该修补该错误(如上例所示)还是将错误报告拒绝为“无法重现”?”

如果错误是由客户自己报告的,则不能总是期望他们会提供逐步的操作来由开发人员或测试人员重现该错误,在这种情况下,测试人员应该尝试以所有可能的方式重现该错误。无法复制,则可以要求客户提供更多信息以复制该错误。但是无论如何,在一次尝试从客户那里收集更多信息之前,我不建议您拒绝一个错误。