Automated tests 您如何处理在开发过程中预期失败的单元/回归测试?

Automated tests 您如何处理在开发过程中预期失败的单元/回归测试?,automated-tests,Automated Tests,在软件开发过程中,代码库中可能存在已知问题的bug。如果测试写得很好,这些bug将导致回归/单元测试失败 在我们的团队中,关于如何管理失败的测试一直存在争议: 用重访或TODO注释注释掉失败的测试用例 优点:我们总是知道何时引入了新的缺陷,而不是我们已经意识到的缺陷 缺点:可能忘记重新查看已注释掉的测试用例,这意味着缺陷可能会从裂缝中滑出 让测试用例失败 优点:不会忘记修复缺陷,因为脚本失败会不断提醒您存在缺陷 缺点:由于故障噪音,在引入新缺陷时很难检测到 我想探讨一下这方面的最佳实践是

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

在我们的团队中,关于如何管理失败的测试一直存在争议:

  • 用重访或TODO注释注释掉失败的测试用例

    • 优点:我们总是知道何时引入了新的缺陷,而不是我们已经意识到的缺陷
    • 缺点:可能忘记重新查看已注释掉的测试用例,这意味着缺陷可能会从裂缝中滑出
  • 让测试用例失败

    • 优点:不会忘记修复缺陷,因为脚本失败会不断提醒您存在缺陷
    • 缺点:由于故障噪音,在引入新缺陷时很难检测到
  • 我想探讨一下这方面的最佳实践是什么。就我个人而言,我认为三态解决方案是确定脚本是否通过的最佳方案。例如,在运行脚本时,可以看到以下内容:

    • 通过率:75%
    • 失败百分比(预期):20%
    • 失败百分比(意外):5%
    基本上,您可以使用一些元数据来标记任何预期失败(由于某些缺陷)的测试用例。这可以确保您在测试结束时仍然看到失败结果,但立即知道是否存在您不期望的新失败。这似乎是上述两项提案中最好的部分


    是否有人有任何管理此测试的最佳实践?

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


    我考虑过这个属性,它的优点是可以在不重新编译的情况下运行,但它不带“reason”参数,并且在我们运行的NUnit版本中,测试不会在输出中显示为unrun。

    我将保留您的测试用例。根据我的经验,用类似

    // TODO:  fix test case
    
    类似于做:

    // HAHA: you'll never revisit me
    
    说真的,随着您离发布越来越近,重新访问代码中的TODO的愿望会逐渐消失,特别是对于单元测试之类的事情,因为您正专注于修复代码的其他部分

    将测试留在“三态”解决方案中。然而,我强烈建议尽快解决这些问题。我经常提醒的问题是,当人们看到它们后,他们往往会掩饰它们,并说“哦,是的,我们总是会遇到这些错误…”

    举个例子——在我们的一些代码中,我们引入了“可跳过的断言”的概念——这些断言可以让您知道存在问题,但允许我们的测试人员越过它们进入代码的其余部分。我们发现QA开始说“哦,是的,我们一直得到那个断言,我们被告知它是可跳过的”,而bug没有被报告


    我想我的建议是,还有另一种选择,那就是修复您的测试用例立即发现的bug。不这样做可能有实际的原因,但从长远来看,现在养成这样的习惯可能更有益。

    我们做了以下工作:在测试中设置层次结构

    示例:您必须测试3件事情

    • 测试登录(登录、检索用户名、获取“上次登录日期”或熟悉的信息等)
    • 测试数据库检索(搜索给定的“Schnitzelmitkartofelsalat”标记,搜索最新标记)
    • 测试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
    
    如果一个点失败(在开发过程中)给出一条准确的错误消息。即3.2.2。失败。那么测试单元将不会执行3.2.3的测试。和3.2.4。这样您会得到一条(确切的)错误消息:“3.2.2失败”。因此,让程序员(首先)解决这个问题,而不是处理3.2.3。和3.2.4。因为这行不通


    这有助于澄清问题,并明确首先要做什么。

    我认为您需要一个TODO观察器,从代码库中生成“TODO”注释。TODO是您的测试元数据。它位于已知故障消息前面一行,很容易关联


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

    我通常使用Perl和Perl的测试::*模块允许插入TODO块:

    TODO: {
      local $TODO = "This has not been implemented yet."
    
      # Tests expected to fail go here
    }
    
    在测试运行的详细输出中,$TODO中的消息被附加到TODO块中每个测试的通过/失败报告中,以便解释预期失败的原因。对于测试结果的摘要,所有TODO测试都被视为已成功,但是,如果有任何TODO测试实际返回成功的结果,则摘要还将统计这些测试并报告意外成功的测试数

    因此,我的建议是找到一个具有类似功能的测试工具。(或者只使用Perl进行测试,即使测试的代码是用另一种语言编写的……)

    Joel's的5在编写新代码之前正在修复错误:

    当您在第一次尝试运行代码时发现代码中有一个bug时,您将能够很快修复它,因为所有这些bug都不会发生