题
在软件开发过程中,代码库中可能存在已知问题的错误。如果测试编写得好,这些错误将导致回归/单元测试失败。
我们的团队一直在争论如何管理失败的测试:
使用 REVISIT 或 TODO 注释注释掉失败的测试用例。
- 优势: :我们总会知道什么时候 新的 缺陷已经被引入,但我们尚未意识到这一缺陷。
- 坏处: :可能会忘记重新访问注释掉的测试用例,这意味着缺陷可能会从裂缝中溜走。
让测试用例失败。
- 优势: :不会忘记修复缺陷,因为脚本失败会不断提醒您存在缺陷。
- 坏处: :很难检测到何时 新的 由于故障噪声,引入了缺陷。
我想探讨一下这方面的最佳实践是什么。就我个人而言,我认为三态解决方案是确定脚本是否通过的最佳方案。例如,当您运行脚本时,您可能会看到以下内容:
- 通过百分比:75%
- 失败百分比(预期):20%
- 失败百分比(意外):5%
您基本上会标记您想要的任何测试用例 预计 某些元数据失败(由于某些缺陷)。这可确保您在测试结束时仍然看到失败结果,但立即知道是否存在 新的 你没有预料到的失败。这似乎采纳了上述两个提案中最好的部分。
有人有管理此问题的最佳实践吗?
解决方案
我会把你的测试用例留在里面。根据我的经验,用类似的东西注释掉代码
// TODO: fix test case
类似于做:
// HAHA: you'll never revisit me
严肃地说,当您越来越接近交付时,重新审视代码中 TODO 的愿望往往会减弱,尤其是单元测试之类的事情,因为您正专注于修复代码的其他部分。
也许将测试留在您的“三态”解决方案中。然而,我强烈鼓励尽快解决这些问题。我对不断提醒的问题是,人们看到它们后,往往会掩盖它们并说“哦,是的,我们总是遇到这些错误......”
举个例子——在我们的一些代码中,我们引入了“可跳过断言”的概念——断言的作用是让您知道存在问题,但允许我们的测试人员跳过它们进入其余部分。代码。我们发现 QA 开始说“哦,是的,我们一直得到这个断言,我们被告知它可以跳过”,并且没有报告错误。
我想我建议的是还有另一种选择,那就是立即修复测试用例发现的错误。可能有实际原因不这样做,但从长远来看,现在养成这种习惯可能会更有利。
其他提示
立即修复该错误。
如果它太复杂而无法立即完成,那么它对于单元测试来说可能太大了。
放弃单元测试,并将缺陷放入错误数据库中。这样它就具有可见性、可以确定优先级等。
我通常使用 Perl 工作,Perl 的 Test::* 模块允许您插入 TODO 块:
TODO: {
local $TODO = "This has not been implemented yet."
# Tests expected to fail go here
}
在测试运行的详细输出中,$TODO 中的消息会附加到 TODO 块中每个测试的通过/失败报告中,以便解释预期失败的原因。对于测试结果的摘要,所有 TODO 测试都被视为已成功,但是,如果有任何实际上返回成功的结果,摘要也会对这些测试进行计数并报告意外成功的测试数量。
那么,我的建议是找到一个具有类似功能的测试工具。(或者只是使用 Perl 进行测试,即使正在测试的代码是另一种语言......)
我们做了以下工作:对测试设置层次结构。
例子:你必须测试三件事。
- 测试登录(登录、检索用户名、获取“上次登录日期”或熟悉的内容等)
- 测试数据库检索(搜索给定的“schnitzelmitkartoffelsalat”-标签,搜索最新标签)
- 测试Web服务(连接、获取版本号、检索简单数据、检索详细数据、更改数据)
每个测试点都有子点,如括号中所示。我们将这些分层。就拿最后一个例子来说:
3. Connect to a web service
...
3.1. Get the version number
...
3.2. Data:
3.2.1. Get the version number
3.2.2. Retrieve simple data
3.2.3. Retrieve detailed data
3.2.4. Change data
如果某个点失败(开发时) 给出一条准确的错误消息. 。IE。3.2.2.失败的。那么测试单元将不会执行3.2.3的测试。和 3.2.4。。这样你就会得到一条(确切的)错误消息:“3.2.2 失败”。因此让程序员(首先)解决该问题而不是处理 3.2.3。和 3.2.4。因为这是行不通的。
这对于澄清问题并明确首先必须做什么有很大帮助。
我认为您需要一个 TODO 观察器来从代码库生成“TODO”注释。待办事项 是 您的测试元数据。它位于已知故障消息前面的一行,并且非常容易关联。
TODO 很好。使用它们。通过定期将它们放入待办事项列表中来积极管理它们。
乔尔的第 5 名 “改善代码的 12 个步骤” 在编写新代码之前修复错误:
当您第一次尝试运行代码时发现代码中有错误时,您将能够立即修复它,因为所有代码在您的脑海中仍然记忆犹新。
如果您在几天前编写的某些代码中发现错误,您将需要一段时间才能找到它,但是当您重读您编写的代码时,您会记住所有内容,并且能够修复该错误在合理的时间内出现错误。
但是,如果您在几个月前编写的代码中发现了错误,您可能会忘记有关该代码的很多内容,并且修复起来要困难得多。到那时你可能正在修复别人的代码,而他们可能正在阿鲁巴岛度假,在这种情况下,修复错误就像科学一样:你必须缓慢、有条不紊、一丝不苟,而且你无法确定需要多长时间才能找到治疗方法。
如果您在已发布的代码中发现错误,您将需要花费大量费用来修复它。
但是,如果您确实想忽略失败的测试,请在您使用的任何测试框架中使用 [Ignore] 属性或其等效属性。在 MbUnit 的 HTML 输出中,忽略的测试显示为黄色,而失败的测试则显示为红色。这可以让您轻松注意到新失败的测试,但您不会失去对已知失败测试的跟踪。