在软件开发过程中,代码库中可能存在已知问题的错误。如果测试编写得好,这些错误将导致回归/单元测试失败。

我们的团队一直在争论如何管理失败的测试:

  1. 使用 REVISIT 或 TODO 注释注释掉失败的测试用例。

    • 优势: :我们总会知道什么时候 新的 缺陷已经被引入,但我们尚未意识到这一缺陷。
    • 坏处: :可能会忘记重新访问注释掉的测试用例,这意味着缺陷可能会从裂缝中溜走。
  2. 让测试用例失败。

    • 优势: :不会忘记修复缺陷,因为脚本失败会不断提醒您存在缺陷。
    • 坏处: :很难检测到何时 新的 由于故障噪声,引入了缺陷。

我想探讨一下这方面的最佳实践是什么。就我个人而言,我认为三态解决方案是确定脚本是否通过的最佳方案。例如,当您运行脚本时,您可能会看到以下内容:

  • 通过百分比: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。因为这是行不通的。

这对于澄清问题并明确首先必须做什么有很大帮助。

我倾向于把这些留在里面, 忽略 属性(这是使用 单位) - 测试在测试运行输出中提到,因此它是可见的,希望这意味着我们不会忘记它。考虑在“忽略”消息中添加问题/票证 ID。这样,当潜在问题被认为成熟时,它就会得到解决 - 立即修复失败的测试会很好,但有时小错误必须等到时机成熟。

我考虑过 显式的 属性,它的优点是无需重新编译即可运行,但它不需要“原因”参数,并且在我们运行的 NUnit 版本中,测试不会在输出中显示为未运行。

我认为您需要一个 TODO 观察器来从代码库生成“TODO”注释。待办事项 您的测试元数据。它位于已知故障消息前面的一行,并且非常容易关联。

TODO 很好。使用它们。通过定期将它们放入待办事项列表中来积极管理它们。

乔尔的第 5 名 “改善代码的 12 个步骤” 在编写新代码之前修复错误:

当您第一次尝试运行代码时发现代码中有错误时,您将能够立即修复它,因为所有代码在您的脑海中仍然记忆犹新。

如果您在几天前编写的某些代码中发现错误,您将需要一段时间才能找到它,但是当您重读您编写的代码时,您会记住所有内容,并且能够修复该错误在合理的时间内出现错误。

但是,如果您在几个月前编写的代码中发现了错误,您可能会忘记有关该代码的很多内容,并且修复起来要困难得多。到那时你可能正在修复别人的代码,而他们可能正在阿鲁巴岛度假,在这种情况下,修复错误就像科学一样:你必须缓慢、有条不紊、一丝不苟,而且你无法确定需要多长时间才能找到治疗方法。

如果您在已发布的代码中发现错误,您将需要花费大量费用来修复它。

但是,如果您确实想忽略失败的测试,请在您使用的任何测试框架中使用 [Ignore] 属性或其等效属性。在 MbUnit 的 HTML 输出中,忽略的测试显示为黄色,而失败的测试则显示为红色。这可以让您轻松注意到新失败的测试,但您不会失去对已知失败测试的跟踪。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top