我们在公司不这样做,但是我的一位朋友说他的项目经理要求每个开发人员在产品进行质量检查之前添加故意的错误。它是这样工作的:


在产品进行质量检查之前,开发团队在代码中的随机位置添加了一些故意的错误。他们适当地备份了原始的有效代码,以确保最终产品没有附带这些错误。
测试人员也将被告知这一点。因此他们将进行艰苦的测试,
因为他们知道存在错误,并且未找到它们可能被认为是不称职的标志。
如果发现了错误(故意或其他) ,他们将报告给开发团队进行修复。然后,在产品进入第二级质量保证之前,开发团队在代码的相关部分中添加了另一个故意的错误。项目经理说,测试人员应该像开发人员一样思考,并且他/她应该在进行更改的部分中期望出现新的错误。

事情就是这样。他们说这种方法具有以下优点。


测试人员将始终处于警惕状态,并且将疯狂地进行测试。
这有助于他们还发现隐藏的(无意的)错误因此开发人员
可以修复它们。
测试人员可以获取错误。没有发现任何bug都会影响他们的士气。
所以给他们一个容易找到的bug会帮助他们的士气。

如果您忽略了其中一个故意的bug随最终版本一起运送的情况产品,甚至在考虑采用这种方法之前,我们还应考虑哪些其他弊端?

一些说明:


它们适当地备份了源代码控制中的原始代码。
当测试人员发现故意的错误时,开发团队将忽略它。如果测试人员发现一个非故意(原始)的错误,则开发团队首先检查它是否是由任何故意的错误引起的。也就是说,开发团队首先尝试在原始工作代码上重现该问题,并尝试对其进行修复。
只需忽略质量检查与开发团队之间的关系问题。我是在程序员而不是在工作场所上专门问这个问题的。考虑到质量保证和开发团队之间的融洽关系,他们在下班后聚会。项目经理是一位很好的老绅士,他随时准备支持两个团队(Godsend)。


评论

“测试应该像开发人员一样思考”……很有趣。我本以为很明显,测试人员不应该像开发人员那样思考,而应该像用户一样。

如果故意引入的错误掩盖了测试人员在没有引入故意引入的错误的情况下可能发现的另一个错误,将会发生什么?例如,假设有一段代码存在击剑问题,并且开发团队没有意识到此错误。程序员决定在该位置插入故意的栅栏错误。现在,该代码有一个双重击剑错误。假设测试人员检测到错误,但是看不到它是双重击剑错误。恭喜!测试人员发现了一个引入的错误。将恢复原始代码以包含原始的击剑杆错误。糟糕!

我是量化宽松。我宁愿找到真正的错误,谢谢。我要离开这家公司,因为它着火了。没有人会(故意)浪费我的时间。

“我们在公司没有这样做,但是我的一位朋友说他的CTO要求每个产品经理在每个功能开发周期的开始时添加额外的功能...”

我怀疑添加故意的错误会带来风险。如果故意的错误实际上修复了意外的错误怎么办?没有报告积极的副作用,代码被删除,并且真正的错误通过QA获得。从本质上讲,这些最后一刻的“故意错误”将被认为是错误的,否则,这些错误会浪费过多的开发人员时间。

#1 楼

这听起来绝对是坚果。它花费了很多精力来取得非常可疑的收益,而且这种做法似乎是基于一些错误的前提:


质量检查人员不会努力工作,除非他们知道每个人都在接受测试。一天(这对士气不利)
软件中没有足够多的无意引入的错误,可供质量检查人员发现
质量检查人员的工作是查找错误-不是;是确保软件具有生产质量。
开发和质量保证之间的这种斗智斗勇对公司来说是健康的-事实并非如此。所有员工都应该与公司的竞争对手而不是彼此对抗。

这是一个糟糕的主意,所讨论的项目经理是一个混蛋/白痴,对人和动力一无所知。


要扩展我对“ QA的工作:”的描述,QA肯定应该在代码和测试套件中找到错误,作为错误的产物。做他们的工作,但角色不应该定义为“您必须找到错误”。应该是“您必须使测试套件保持最新以考虑新功能并确保所有高测试范围。如果这没有导致发现错误,则测试过程对于产品而言不够复杂。

评论


质量检查的工作是发现错误-不是。这是为了确保软件的生产质量。这需要澄清。隔离和修复错误是交付生产质量软件的重要过程。

–克里希那巴德拉
15年1月28日在11:26

实际上,在许多公司中,QA的工作是查找错误,并且如果产品中添加了新功能,并且QA当时运行了一个不会显示任何错误的测试套件,我个人将不相信该测试套件和认为它是不完整的。

–布朗博士
15年1月28日在12:08



我同意,除了最后一点。在质量保证与开发(和业务)之间采取对抗性方法在很大程度上是不可避免的。每个小组都有自己的愿望和专业知识。作为一家公司,这些需要平衡才能正常工作。以我的经验,“玩得开心”只会导致这些团体没有推动自己的议程,从而导致停滞或不平衡。我见过的最好的公司都是开发,质量保证和业务方面满足其需求的公司,但它们可以作为对其他公司的检查,从而为公司的最佳平衡做出妥协。

– Telastyn
15年1月28日在12:44

我还要补充一点:如果故意的错误之前没有阻止进程(例如抛出异常),那么故意的错误可能会隐藏一个真实的错误。

–nkoniishvt
15年1月28日在17:58



如果我是一名质量检查人员,却发现我在浪费时间研究和记录故意引入的废话错误,那我将找到一份新工作。

– Kik
15年1月28日在20:01

#2 楼

好吧,根据我所学到的知识:

这不是学校或工作面试;
测试员不是孩子;
这不是游戏;


QA不仅在这里查找错误,而且还担心系统的直观性,用户的学习曲线,可用性和可访问性一般。例如:“系统丑陋吗?”,“用户是否是色盲用户并且东西是红色和绿色?”他们也应该抱怨。
系统通过质量保证的最低要求通常是在用户故事中描述的特定功能,或者是PO希望系统掌握在他脑海中的神奇程度。
tl; dr
这不仅是bug,测试人员应该从这种狭view的视角中成长出来。

评论


+1非常同意所有4点,尤其是第一点。许多新开发人员采用的竞争方法通常反映了他们过去15年的教育经历-极具竞争性的环境-不像工作场所那样,合作会是更好的方法。

–迈克尔·杜兰特(Michael Durrant)
15年1月28日在12:51



与首选答案相比,此答案更受欢迎。

–法老王
15年2月2日,0:24

“质量检查不仅可以发现错误,还可以找到[...]”-我只是想说,在许多地方,软件测试和质量保证这两个术语可以互换使用。是的,那很糟糕。在我以前工作的地方,我们有一个使用状态的员工-在每次QA部门会议上-我们在这里所做的不是质量保证而是质量控制。 (她的意思是对我们质量检查部门的批评。)

–马里奥
15年4月17日在13:41

1.是学校。每天都是上学日。如果您在工程学科工作,但又不想每天学习,则应该离开我的办公室。这也是一次采访。应每天评估绩效,以确保部门获得物有所值。 2.如果我的职业生涯教给我任何东西,那它的QA会具有14岁的智力。他们是孩子,应该像一群羊一样管理。

– Gusdor
18年1月19日在9:27



1.从意义上来说,这不是一所学校,人们可以相互协作,而彼此之间不争分夺秒,没有复制工作的事情,因为任务只能完成一次,而向同事寻求帮助也没有什么可耻的。 2.如果您的质量保证很糟糕,那么您的问题就是人力资源部,那就是那些应该离开办公室的人。

– SparK
18年1月19日在14:54

#3 楼

从测试人员的角度来看,这是个坏主意。

:“因此他们将进行艰苦的测试,因为他们知道存在错误,没有发现错误可能被认为是他们的无能。”基本上,开发人员是在诱骗程序中捕获代码。很少有人喜欢做最终没有意义的工作(因为错误是事先知道的),但是仍然会影响他们的看法。如果因为找不到诱捕装置而受到明显惩罚,那就更是如此。而且您知道测试人员能够在发现错误时壮成长吗?听起来像是一个有毒的对抗环境。如果他们正在检查的代码是高质量的,那么质量检查人员应该很高兴。尽管它们是由错误支付的...从开发人员的角度来看:http://thedailywtf.com/articles/The-Defect-Black-Market

:从开发人员的角度出发:正在激励QA来查找您知道的错误在那里。这很可能会增加真正的漏洞出门的可能性; QA花费了至少一些时间来寻找易于植入的错误,而不是真正的错误。另外,诱捕装置极有可能将其带出室外。

评论


如果他们按错误付费,那么这

–BЈовић
15年1月28日在12:22

“有动机去发现您知道的错误”。如果组织正在这样做,则可能意味着某人正在垂涎质量保证人员,以确保他们找到了已植入的错误,因此这将是他们的头等大事。如果他们聚在一起弄清楚该怎么办,说:“嘿,植入的错误几乎总是会导致它无法在编辑屏幕上保存带有大量数据的字段”(或其他)。然后,他们将花费大量时间寻找一种错误,并增加错过其他错误的机会。

–杰伊
15年1月28日在18:23

我想到的第一件事是沃利今天下午要给别人写一辆小型货车

–丹在火光中摆弄
2015年1月30日在22:13



>真正的错误会出门。我曾经做过大型测试。您从一个论点开始,即(非平凡的)代码总是有错误。质量检查人员是在客户之前找到他们的英雄。这些错误始终存在。如果引入人为错误,那是在浪费时间,您可能会花费大量时间查找真正的错误;测试时间有限,您正在通过添加不必要的工作来降低质量。

– RedSonja
2015年2月2日在8:14



#4 楼

我完全同意上述答案,这说明为什么这样做不利于动力,而且通常对人的管理不利。但是,可能有不完善的技术原因:


在产品进入质量检查之前,开发团队在产品的随机位置添加了一些故意的
错误。编码。他们正确地备份了原始的工作代码,以确保最终产品没有附带这些错误。




基于第一条语句,您实际上从未在这两个过程中真正测试过您想要的生产代码。
我想您会极大地增加在尝试匆忙进行更改时意外地在发布的生产代码中包含“故意”错误的可能性一个客户。在某些时候可能会引起一些面颊。
我想这只会训练您的测试人员像您的开发人员那样思考(例如,Tom在这里如何添加错误),这可能使他们不太可能找到Tom的错误。没想过。


评论


+1绝对不会在这两遍中真正测试您想要的生产代码。我什至不考虑发布代码而无需测试生产代码,这超出了我的范围。如果您在没有故意错误的情况下再次进行测试,那么您将重复您的工作并浪费了最初的工作。

–adamdc78
2015年1月30日,0:21



#5 楼

编辑

我想清楚一点,这个答案只是在谈论测试您的质量检查流程的概念,我并没有捍卫问题中所描绘的特定方法。

结束编辑

有充分的理由检查您的测试/检查是否确实有效。让我给您一个制造示例,但是原理是一样的。

通过机器进料时,进料器可能无法将物料推得足够远。这称为“短进纸”,为防止这种情况,我们可能会安装“短进纸传感器”(通常是被物料阻塞的对射型传感器)。当物料到达整个进给长度时,此传感器将检测物料的末端。在机器周期的某个时刻,我们检查传感器是否被阻塞,如果检查失败,则停止机器。

现在您必须考虑一下测试本身如何失败。例如,一些灰尘或其他杂物可能会阻塞传感器,并且始终会报告“ OK”,并且永不停止机器。同样,传感器的性质是当光束撞击到接收器时,接收器会打开,因此,根据您安装的传感器的类型,在未阻塞传感器的情况下,您会获得“ ON”输入。这意味着如果电缆被切断或该传感器断电,或者输入失败,则程序的逻辑将显示为“ OFF”,这意味着“阻塞”或“确定”。

为了赶上测试的这些失败模式,我们通常会插入第二次检查,以确保在周期的第二部分中传感器实际上未被阻塞。通过这种方式,我们可以检查测试是否仍在实际运行中(尽我们所能)。

同样,质量检查部门可以通过许多方式使测试失败。也许自动化测试没有运行,并且报告正在查看测试数据的旧副本。也许有人做得不好。测试质量检查部门是一件合理的事情。

明显的缺点是,“测试错误”可能使其通过质量检查部门进入成品。在制造业中,有时会将已知的不良零件(有时称为“红兔”)插入到流程中(通常由QA的人员来进行),他们观察该零件经过流程并测量所需的时间。找到零件并将其删除。通常,此部分被涂成鲜红色(或橙色),因此可以轻松对其进行跟踪。由于有人在测试过程中观察零件的加工过程,因此将其制成最终产品的机会几乎为零。当然,还有一些虚假的故事,有人将某个已知的不良零件扔进了流程中,以“查看系统是否可以找到它”,当然,必须隔离当天产生的所有最终零件,并手动对其进行分类,但这仅仅是未能尽职调查的情况。

评论


评论不作进一步讨论;此对话已移至聊天。

– yannis
15年1月29日在19:02

大家好。讨论时间太长,无法发表评论。正如您从我之前的(自动)评论中看到的那样,我已将所有评论移至专用的聊天室。如果您想继续讨论答案,请在该聊天室中进行,而不要在此处进行。谢谢。

– yannis
15年1月29日在19:07



所描述的方法可以偶尔用于测试质量检查,而不是作为一个永久过程。

– Gerlos
15年2月3日,11:40

#6 楼

老实说,我称这种行为公然不道德且不切实际。项目经理需要进行认真的重新培训,甚至还需要终止培训。




它表明,人们对质量保证的概念根本缺乏了解。测试人员不应该像开发人员那样思考:他们应该像最终用户那样思考。拥有质量检查团队的全部原因是,开发人员天生就太接近代码了。 QA应该与代码保持足够的距离,以使他们能够捕获开发人员错过的内容。

这浪费了QA的工作量。假设这些bug并非微不足道-何时出现-表示质量检查人员正在花费时间和资源来调查已知的事物,而他们可能会花精力去寻找未知的事物。

这浪费了开发人员的精力。为了使质量检查人员能够发现这些不重要的错误,开发人员必须首先编写它们。这需要进一步的努力,不仅花费在编写错误上,还花费在考虑软件需求和设计上。

使生产处于不必要的风险中。更改不能正确合并只是时间问题。

如果以上操作均不成功,则毫无意义。如果所有已知的错误都是微不足道的,那么它们将不会吸引不合格的工人:它们只会吸引根本不工作的人。有更好的方法可以做到这一点。

它毒化了工作环境。您的质量检查测试人员是专业人士。除非有真正的理由怀疑他们,否则应该相信他们是专业的。当有理由怀疑时,应该进行适当的调查,而不要进行这些心理游戏。其他任何事情都会扼杀士气。

严重。即使在此特定情况下PM的偏执症被证明是有充分根据的,也不是拥有任何业务管理测试人员的人。

#7 楼

就我个人而言,我对这种方法感到不舒服。

与我有关的主要事情是插入故意错误的实用性。在我看来,这很难以可预见的方式做到。

任何代码更改(有意或其他)都有副作用的风险。这些副作用很可能在测试过程中被揭示出来,但是根本原因(甚至对于植入该错误的开发人员而言)并不明显。如果您知道我的意思(我是从我的直觉出发),那并不安全。

此外,测试人员将浪费大量时间来测试不是实际上要被释放。我认为,一旦清除了故意的错误,就应该进行完整的重新测试。这就是测试的重点。某些事情发生了变化,您重新测试了所有内容。好的,我知道这在实践中永远不会发生,但这就是回归测试的全部内容。

因此,总的来说,我们并不确定。

另一方面,我们倾向于让客户验证质量检查团队的工作,这可能并不理想。不过,这是一个非常强大的反馈循环。

评论


我喜欢反馈回路电源的想法!

– jxramos
2015年2月6日在2:19

#8 楼

由于已经给出的所有原因,这是一个坏主意,但是错误植入是一个用于不同目的的有用工具。您可以使用它来粗略地评估质量检查流程的有效性。

在最简单的情况下,假设您植入了100个错误,它们代表了实际错误的全部范围(知道,不太可能,但我正在简化)。您不会告诉质量检查人员这样做是为了避免破坏实验。在质量检查流程结束时,假设他们在100个种子错误(以及其他实际错误)中发现了60个。现在您知道QA正在发现60%的错误。

您可以通过计算发现的QA实际错误的数量并应用假错误比率来进一步扩展。在我们的示例中,如果质量检查人员发现200个真正的错误,那么您可以得出结论,他们仅发现了60%的错误,因此,仍然有133个错误。

当然,这只是一个巨大的估计值,并带有巨大的误差线。编写现实的,有代表性的错误很难。质量保证很容易找到您编写的错误,因为开发人员受过训练,不能编写错误。最好模拟一类错误,例如一次性错误,Unicode错误,缓冲区溢出等。

这应该应用于包括开发人员在内的整个质量检查流程单元测试,持续集成,以及专业的质量检查团队(如果有)。

这是一个度量标准,不应被劫持为管理激励工具。

评论


这将是收集任何有意义的数据的唯一方法。但是,确定适当的测试用例以获得有意义的结果所需的时间和精力将破坏任何预算和进度。即使您获得了预算和时间表,您也必须克服困难,以确保您有足够的资格来理解统计数据和软件,从而能够识别出正确的测试子集。我认为您不会在一个项目中得到所有这些。因此,在现实生活中,这种方法最好的方法就是得到错误的数字,即使不会误导数字。

–扣篮
15年1月29日在16:20

SQL注入是执行此操作的一个好方法,因为您可以随机选择n条sql语句以“破坏”

–伊恩
15年1月29日在18:19

一个很大的问题是,故意的错误将与您自然会遇到的错误大不相同-您可能只是在训练QA以像程序员一样思考。这几乎破坏了质量保证的全部内容-使POV更贴近客户而不是代码。 QA的很大一部分是对开发人员认为直观的事物进行健全性检查(要么是因为对用户的无知所为,要么是对代码的接近度,以及花费在UI上的时间等)。故意错误不是一个分布良好的示例。

–罗安
15年2月6日在8:28

#9 楼

馊主意。

这是开发人员经常采用的一种逻辑,二进制方法,但对于量化宽松政策却是不利的。它只是表明缺乏信任。量化宽松常常在没有太多投入的情况下被置于这种情况下,它认为它们可以接受,因此不建议这样做。

这种思维与量化宽松相结合仅测试人员,没有动力去理解要测试的实际代码。

我是一名高级QE,这是我工作过的大多数组织中的一个熟悉的问题。

评论


我的妻子做了8年质量检查,然后才去开发-主要是因为这样的信任问题。这只是侮辱测试人员。

–布莱恩·博特彻(Bryan Boettcher)
15年1月28日在15:23

#10 楼

我会说一个坏主意。

一个:程序员将花费时间在代码中放置故意的错误,并付出一些努力来保存好的版本。虽然测试人员可能应该测试所有东西,包括带有已植入的bug的功能,但是当他们找到一个东西时,他们大概必须返回并重新运行该测试以验证这确实是bug(而不是使测试人员感到困惑)某种程度上来说)。至少,测试人员将花时间编写植入的bug。然后,程序员必须花时间修复他们植入的错误。

二:它向测试人员发出明确的信息,即程序员和/或管理层认为他们不是程序员。做他们的工作,必须被视为儿童。我无法想象这对士气有好处。作为程序员,如果给我一个程序的模棱两可或相互矛盾的规范,并且不得不花大量时间弄清楚它们,然后在浪费了数小时或几天后,我的老板告诉我:“哦,是的,我故意在文件中放入矛盾的陈述。这些规范只是为了确保您确实在阅读它们”,我想我真的会很生气。如果那件事经常发生,那可能足以让我寻找另一份工作。

在现实生活中,除了最琐碎的代码更改之外,所有更改都会出现错误。我从来没有遇到过让测试人员沾沾自喜的问题,因为给出的初稿通常是100%完美的。我不得不与懒惰的测试人员打交道,他们没有做足够的工作,但是他们没有那样做,因为程序员是如此的完美。我曾经与过的最好的测试人员曾经告诉我,对于一个新的软件版本,他为自己设定了一个发现100个错误的目标。好的,100是一个实际数字取决于产品的规模和变化的范围,但是在我们的案例中,他几乎总是设法实现这一目标。有时他不得不做些事情,例如在消息中称一个错误拼写的单词为“ bug”,但是嘿,它确实必须修复。

后记脚本:如果您这样做,我敢打赌程序员迟早会故意植入一个错误,测试人员找不到那个特定的错误,而程序员却忘记了将好的代码放回去。因此,现在将故意植入的错误发送给客户。

评论


关于“ Two”中的规范的要点是一个很好的类比。

– Kyralessa
15年4月17日在18:06

#11 楼

我真的不认为这是个坏主意。我认为很多事情可以做得更好:


让质量检查人员尽一切可能对质量负责。例如,通过支持他们的责任。这将增加他们确保所运输产品具有更高质量的动力。自己发现不足之处(错误,明显缺少的功能,违反直觉的行为)之后,总是会花费较少的精力,然后尝试了解您的烦恼用户试图解释的内容。并且甚至将某些责任推给开发人员,可能会增加他们的动力,以帮助质量检查人员尽其所能。
拥有多个质量检查团队,可以相互竞争。您当然需要找到一个明智的指标。绝对不仅仅是问题的数量。考虑缺陷的严重性或提议的增强功能的业务价值(由利益相关者确定)应该会有所帮助。

很难断定质量检查是否“足够好”。从长远来看,找到使质量检查“不断改进”的方法更容易,甚至可能更好。

如果引入故意的错误,仍然有一个问题要注意:如何知道首先,“正确的”代码实际上是正确的吗?在第二次质量检查之后,您将删除所有尚未发现的故意错误。没有办法知道您不是只是将它们替换为以其他方式破坏的代码,或者没有启用以前无法实现的破坏行为(夸大的示例:某些对话框由于故意的错误而无法打开,但是对话框本身是坏的-您只是找不到,因为测试人员看不到它。

评论


如果您忽略了第一句话,我会为您+1,因为其他一切都很好:)这只是一个糟糕的主意,不好就是轻描淡写。使质量保证负责的最简单方法是跟踪使该质量保证进入现场的错误数量。仅此一项就可以完成所提议方法所声称的一切。

–扣篮
15年1月28日在15:56



@Dunk:跟踪该数字不会自动使您的团队变得更好,就像在一项运动中保持得分并不能使您成为最好的运动员一样。实际上,运动员确实会训练,即执行人工任务以可控的方式提高他们的表现,这与这里提出的建议没有什么不同。除非您有一个如何使人们提高这个数字的想法,否则它没有什么价值。

–back2dos
15年1月28日在18:01

我没有声称它将改善任何事情。我只声称它将完成“插入错误错误”方法将要完成的所有工作,但不会花费所有成本和时间。它会做的是指示是否有太多缺陷通过质量检查。如果确定是这种情况,则需要对过程或人员进行重新评估。 “错误错误”方法提供的信息不多,但实际上提供的信息较少。因此,使用“错误错误”方法,成本较高,收益较少。就像我说的,这是一个可怕的想法。

–扣篮
15年1月28日在18:35



@Dunk然后您没有正确阅读问题。这表明该方法可以提高士气并提高通透性。同样,通过质量检查进行测试的错误数量也无法可靠地衡量质量检查团队的有效性。同样,它受到开发人员引入的错误数量的影响。如果他们开始使用TDD,并且发行版中的缺陷突然减少,那对测试人员有何看法?没有。

–back2dos
15年1月29日在8:01

@Dunk与此相反,假设发现它们的难度不会随频率波动(可以安排),则“错误错误”实际上确实为您提供了更多信息。因为您知道有多少人为缺陷,所以您可以准确地说出在质量检查中被捕获的百分比。因此,您获得的额外信息是质量保证在检测人为缺陷方面的有效性。与您所建议的数字相比,这个数字肯定与它们的整体有效性有着更大的关联。

–back2dos
15年1月29日在8:12

#12 楼

正如其他人所说,开发人员不应故意在软件中添加错误,但是将测试中的错误添加到软件中作为测​​试过程的一部分,这是您的测试套件的合法策略。

变异测试。想法是使用软件自动在源代码中创建小的更改(称为突变体)。这些更改旨在创建不同的行为,例如,我们可以将

if x < 10:
    print "X is small!"


更改为

# we flipped the inequality operator
if x > 10:
    print "X is small!"


良好的单元测试应能检测到突变体代码片段不再按预期工作并杀死了该突变体。当原始代码通过测试,并且所有变体(功能上不等效)均未通过测试时,您便知道您的代码和测试很强大。

#13 楼

我喜欢这个主意。是帕顿将军说的:“您在和平中出汗越多,在战争中流血就越少。”

放置故意的错误“浪费了测试人员的时间”。但这也使他们更加努力,这意味着他们在发现意外缺陷方面也将做得更好。 (而且您有“原始”的副本,因此您不必继续做下去。)

从长远来看,发现更多无意的错误可能会为您节省更多的痛苦

此外,您还可以了解测试人员的水平,而这本身并不是一个小好处。

评论


我认为这有很多方面。最好在发现它之前就发现一个错误,我宁愿按我的内部质量检查(毕竟,他们为此得到报酬吗?)而不是响应外部攻击。 Bug Hunting是其中的一部分,只要正确地进行了这种测试,我就看不出为什么它不能成为有价值的部分。

–WernerCD
15年1月28日在14:53

“原始”副本可能并非没有错误,并且根据定义也未经测试(因为更改了代码以添加错误)。

–罗杰·罗兰德
15年1月28日在15:06

以我的经验,虫子不是孤立的动物,它们不是一个人坐。软件是系统的一部分,错误(无论是否有意)都会影响系统。当然,除非我们在谈论琐碎的软件。

–罗杰·罗兰德
15年1月28日在15:14



零证据表明,此方法将在故意插入的错误之外再发现1个其他错误。零证据表明,这会使质量检查人员更加难以发现错误。他们可以减少努力。此外,由于在测试有意破损的代码时浪费了整个验收测试过程测试周期的运行时间(我们完整的测试耗时3周),因此现在您必须重新测试将要部署的实际代码,因为版本不是同一版本,因此其测试对于验证“真实”版本几乎没有用。

–扣篮
15年1月28日在15:21



我猜想Patton意味着您在和平时期应该进行严格的培训和野外练习。类比是在IT学校或学位后的培训中进行严格的课程。我敢肯定,巴顿(Patton)并不意味着应指示军官从背后向自己的部队开枪,以使部队保持警惕!

–杰伊
15年1月30日在17:01

#14 楼

没有依据本身的优点进行奖励或惩罚的依据,而是基于您所针对的行为的结果。有时会产生意想不到的后果。目的是使质量检查团队不致懈怠,或者使一些管理人员觉得自己实际上在贡献自己的力量而没有意识到自己只是在妨碍自己。

阳性结果-质量检查团队会更加努力地发现错误。谁知道,也许他们认为这是一个挑战。这是一个友好的游戏。还是他们只是因为被监视而正在做这些事情(霍桑效应?)。

负面结果-他们可能不会更努力地工作并发现错误。质量检查人员认为这是小事和对抗。因此,现在,他们开始寻找超级错误,并返回各种挑剔的小问题。当我截屏并将其转换为pdf并以500%的比例查看时,该字体无法正确呈现。

没有影响-对我来说听起来没什么区别,所以为什么要打扰?您只是冒着浪费时间和激怒他人的风险。

我们都可以同意,这在90%的时间内都行不通。这对其他10%并没有多大好处。自己测试一下。客户是否对具有故意的代码错误的发行版更满意?它会影响其他领域的员工士气和生产率吗?增加营业额?你告诉我们。

评论


绝对同意这会导致出现一些挑剔的问题。

–亚当·约翰斯(Adam Johns)
15年1月28日在15:27

@AdamJohns-您永远无法确定,除非您尝试对其进行测试。有更好的方法,所以这对我几乎是不得已的方法。

– JeffO
15年1月28日在16:56

#15 楼

来自一个期望开发人员自己编写和运行测试的世界,您指的是这个“测试”“ QA”筒仓,这让我感到恐惧和困惑,因此,我将尝试从这个角度回答。顺便说一句,从我的角度来看,合格的QA工程师(如@SparK的答案中所述)应关注更大的问题,以确保软件完全满足用户需求并具有整体“质量”(

吸引我的是@JamesMcleod在问题注释中提到“缺陷注入”。实际上,我认为让开发人员考虑如何将错误注入系统是针对深度防御概念的一个好主意。任何单一的错误都不应以无法控制的方式关闭整个系统(没有明确的可操作日志记录),导致任何数据损坏或本身暴露出安全漏洞。

让每个系统的开发人员组件会产生有意的缺陷,处理其他组件的缺陷,并且总体上对它们的软件更具对抗性,这可能会大大改善软件的健壮性。即使是直接的好处也可能是显着的-我要求在每次此类新缺陷的注入期间(迄今尚未测试),开发人员应立即通过新的测试覆盖该缺陷,该测试将设置一个标志,该标志将允许该bug暂时保留在代码库中一小段时间,然后在交付之前将其打开(并消除了缺陷),以将其转变为常规测试,从而使测试套件更加全面。

一个相关的选项是使用功能标志来有意关闭特定组件中的功能,以检查其他组件如何处理该功能。我还强烈建议您阅读免费的书/文章“向第一响应者学习:当您的系统必须工作时”,其中描述了对奥巴马团队用于2012年大选的软件基础设施的广泛测试。

评论


与其让开发人员在代码中“注入”错误,不如让他们的时间更好地确定这些错误是如何在系统中开始的,然后更正代码以确保这些错误不会发生或无法正确处理,这将更好地服务于他们。该软件。开发项目的目的不是测试质量保证系统,而是建立一个可使用的,功能强大且可正常运行的系统,该系统可以执行其用户想要的操作。

–扣篮
15年1月29日在16:33

#16 楼

正如其他人已经说过的那样,仅查找错误并不是QA的工作。从技术上讲,我会进一步说这根本不是他们的工作。开发人员应负责保持自己的代码没有错误。测试套件应该在甚至提交新代码之前就运行,并且如果测试套件失败,那么它首先就不应进行质量检查。故意引入错误意味着您绝对无法通过测试套件,所以为什么您的代码要进行质量检查?

质量检查的工作是根据应用程序实现的用户故事对应用程序进行验证。他们应该测试流程,UI等,并确保用户能够以最可用和最易访问的方式完成用户应做的所有事情。当然,这样做的时候,他们可能会偶然发现bug,但这只是他们所做的事情的副作用,而不是他们所做的事情。请记住,质量检查意味着质量保证,而不是无缺陷的保证。

#17 楼

这不一定像听起来那样疯狂。而是取决于您的动力。如果您正在寻找一个能击败您的测试团队的棍子,那真是太疯狂了。另一方面,软件开发中最困难的事情之一就是要知道测试方法的有效性。

因此,如果结构正确,则可以使用此技术来估计要发货的产品中还剩下多少未发现的错误。因此,假设您在测试版本中人工植入了100个错误,而测试人员发现了其中的50个。然后,您可以推断出,如果他们还发现了50个非种子错误,则很有可能还剩下50个。

当然,这充满了许多问题。您可以根据这些统计信息决定是否发货,但在现实生活中,您可能会发现一个非常讨厌的问题或一千个小麻烦。

还是-知识就是力量,没有这种技术,您对代码库质量的了解就更少了。如果您可以出于正确的理由而认真地实施它,我会说“为什么不呢?”

#18 楼

还没有人提到过一件事:突变测试。

这是自动化工具获取您的源代码并故意在其中插入错误的地方。 (例如,删除随机选择的语句,将AND更改为OR或其他。)然后运行完整的测试套件,并检查测试是否通过。

如果所有测试都通过,则有两种可能:


更改的内容无济于事。换句话说,您的代码已经失效。
更改引入了一个错误,您的测试套件无法捕获该错误。您需要更多测试。

请注意,与您的建议不同,上文所述的所有操作都是自动化的。您不会在浪费开发人员手动插入毫无意义的错误的时间。而且您不会浪费测试人员的时间来发现已知的错误。您唯一用尽的时间就是机器时间,这要便宜得多。 (机器不会对进行20,000次相同的测试感到无聊。人类会在一段时间后停止照顾!)

我建议自动突变测试比您手动进行的方法好得多。

请注意,如果您要求开发人员手动插入错误,则您所得到的错误类型可能并不代表人类可能犯的意外错误。 (例如,如果您还没有意识到可能存在竞争情况,那么您也不大可能会插入故意的竞争条件。)当然,自动化工具是否能够达到更加客观的目标还有待观察……

#19 楼

尽管通常这是一个坏主意(其他答案可以很好地解释为什么),但在某些特殊情况下,有意以受控的临时方式向生产代码中注入错误是有道理的。

您重构测试代码-并且应该对测试代码和生产代码一样重视细节-您可能想知道测试代码是否仍在寻找应该发现​​的错误。

您然后可以故意破坏生产代码,以验证测试是否仍然有效。

有多个级别可以实现:


开发人员可以刚刚重构过的某些单元测试可能会破坏生产代码,以验证该单元测试仍能找到应该找到的内容。
刚刚重构了某个验收测试的测试仪可能会破坏生产代码,以验证验收测试仍然验证应该验证的内容。
如果接口稳定且抢劫足够的灰尘(即该公司可能希望保留一组已知的错误产品版本并针对它们进行测试,以便对测试进行回归测试。

这些事情是否有意义取决于情况。如果我是一名开发人员,而我只需要花一分钟时间注入一个bug,请测试单元测试,然后删除该bug-然后为什么不这样做。但是我应该让我的编辑器,我的周期和我的版本控制系统处于良好的控制之下,以免我意外地提交/交付/签入/推送错误。测试人员和验收测试也是如此。

对于组织而言,保留已知的错误产品版本套件和测试所依赖的回归测试是否有意义。对于网上商店,我不会。对于汽车嵌入式,航空航天嵌入式,银行卡或付费电视卡,我可以。

这需要付出多少努力,很大程度上取决于测试与生产代码之间的脱钩程度。测试与生产代码的分离越多,执行此操作所需的工作越少,则测试与生产代码的凝聚力越强,则需要付出更多的努力。

原因很简单:您的测试和生产代码具有内聚性,更改生产代码需要经常更改测试,这将破坏测试与错误的生产样本之间的依赖性。然后,您还必须维护有缺陷的生产样本。在极少数情况下,即使是值得付出的努力,版本控制系统的模拟和智能使用也可以显着减少工作量,但这需要远远超过熟练的开发人员。

有意注入的概念生产代码中的错误称为破坏活动,注入的错误称为破坏活动。

#20 楼

不直接从存储库中获取待测试代码的测试人员做错了。 (1)

将已知故障代码检入到存储库中的开发人员做错了。 (2)


因此,在此阶段,如果没有一方或双方违反应该如何进行开发和测试的非常基本的前提,该方案就无法工作。 br />

(1)因为您需要记录测试的版本。您可以测试带有Git哈希或SVN修订版号标记的版本,而不是“ Joe给我的代码”。

(2)因为您没有,所以预期会失败的测试驱动程序。


这是出于最短的“电梯音调”原因而进行的尝试,对开发人员,测试人员和管理人员都应立即有意义。 />

评论


这是一个循环的论点。您说的是“在测试构建中植入错误是错误的,因为开发人员不应使用已知的错误代码进行构建”。

– Dominic Cronin
2015年2月5日,11:34

@DominicCronin:关于它没有任何通告。提交到存储库的任何内容都应该是最好的质量。那里有很多原因-避免人为更改代码行是一个原因(w.r.t.“ svn blame”和类似的存储库功能)。 “忘记”再次清除错误的危险。测试人员基本上可以通过查看存储库更改日志来查找“种子”的问题。还有更多原因,实际上对平衡毫无益处。但是我用光了空间,无论如何,这个想法只是提供一个简短的理由。

–DevSolar
2015年2月5日在11:43



@DominicCronin:或者换句话说,可能存在“播种”错误的情况,但是在将其提交给仓库之前必须划清界限。另一方面,尽管将“种子”代码用于测试可能需要做一两件事,但是您应该只测试已提交的代码。这两个想法-各自已经存在争议-根本没有任何明智的联系。

–DevSolar
2015年2月5日,11:52



#21 楼

我建议您不要故意将错误注入您发送给质量检查人员的每一个版本中。

您可以不定期说每年一次,进行隐蔽的“质量检查”。采取“经过测试且有效”的代码库,并从Todo列表中获得尽可能多的小新功能。比平常更“草率地”实施它们。考虑一些极端的情况,将它们写下来,但不要修改代码以将它们考虑在内。将其发送给质量检查。

如果他们发现比您所记录的更多的非正常工作的bug,肯定不是您的质量检查需要监督... ;-)

评论


在之前的16个答案中,这似乎并没有提供任何实质性的解释。

– gna
15年1月30日在12:48