Automated tests 您如何处理在开发过程中预期失败的单元/回归测试?
在软件开发过程中,代码库中可能存在已知问题的bug。如果测试写得很好,这些bug将导致回归/单元测试失败 在我们的团队中,关于如何管理失败的测试一直存在争议:Automated tests 您如何处理在开发过程中预期失败的单元/回归测试?,automated-tests,Automated Tests,在软件开发过程中,代码库中可能存在已知问题的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都不会发生