如果我的代码包含一个应该修复的已知缺陷,但尚未修复,并且不会在当前版本中修复,并且在可预见的将来可能不会修复,如果该缺陷中的某个单元测试失败,测试套件?如果添加单元测试,它将(显然)会失败,并且习惯于失败的测试似乎是个坏主意。另一方面,如果它是一个已知的缺陷,并且存在一个已知的失败案例,那么将其排除在测试套件之外似乎很奇怪,因为应该在某个时间点对其进行修复,并且该测试已经可以使用。
如果我的代码包含一个应该修复的已知缺陷,但尚未修复,并且不会在当前版本中修复,并且在可预见的将来可能不会修复,如果该缺陷中的某个单元测试失败,测试套件?如果添加单元测试,它将(显然)会失败,并且习惯于失败的测试似乎是个坏主意。另一方面,如果它是一个已知的缺陷,并且存在一个已知的失败案例,那么将其排除在测试套件之外似乎很奇怪,因为应该在某个时间点对其进行修复,并且该测试已经可以使用。
Answers:
答案是肯定的,您应该编写它们并运行它们。
您的测试框架需要“已知失败的测试”类别,您应该将这些测试标记为属于该类别。您如何执行此操作取决于框架。
奇怪的是,突然通过的失败测试与意外失败的通过测试一样有趣。
我认为您应该针对当前行为进行单元测试,并在注释中添加正确的测试和正确的行为。例:
@Test
public void test() {
// this is wrong, it should be fixed some time
Assert.assertEquals(2, new Calculator().plus(2,2));
// this is the expected behaviour, replace the above test when the fix is available
// Assert.assertEquals(4, new Calculator().plus(2, 2));
}
这样,当修复程序可用时,构建将失败,并通知您测试失败。当您查看测试时,您将知道您已更改了行为并且必须更新测试。
编辑:正如曼上尉所说,在大型项目中,这不会很快得到解决,但是出于文档的考虑,原始答案总比没有好。
更好的方法是复制当前测试,使克隆断言正确的事情,@Ignore
并用一条消息声明它,例如
@Test
public void test() {
Assert.assertEquals(2, new Calculator().plus(2,2));
}
@Ignore("fix me, Calculator is giving the wrong result, see ticket BUG-12345 and delete #test() when fixed")
@Test
public void fixMe() {
Assert.assertEquals(4, new Calculator().plus(2, 2));
}
这与您团队中的约定减少了@Ignore
d个测试的次数。与引入或更改测试以反映错误的方式相同,不同之处在于,如果这对您的团队至关重要,则不会使构建失败,例如OP表示该错误修复将不包含在当前版本中。
@Ignore
方法。在我看来,仅使用注释不是一个好主意,因为我认为人们不会经常打开单元测试来检查它们(除非它们失败了,或者(希望)当他们想知道为什么忽略了某些东西时) )。
@Ignore
方法。在我看来,仅使用注释不是一个好主意,因为我认为人们不会经常打开单元测试来检查它们(除非它们失败了,或者(有希望)当他们想知道为什么某些东西被跳过了) )。
根据测试工具的不同,您可以使用omit
或pend
功能。
红宝石示例:
gem 'test-unit', '>= 2.1.1'
require 'test/unit'
MYVERSION = '0.9.0' #Version of the class you test
class Test_omit < Test::Unit::TestCase
def test_omit
omit('The following assertion fails - it will be corrected in the next release')
assert_equal(1,2)
end
def test_omit_if
omit_if(MYVERSION < '1.0.0', "Test skipped for version #{MYVERSION}")
assert_equal(1,2)
end
end
该omit
命令跳过测试,omit_if
将其与测试结合-在我的示例中,我测试版本号,并且仅对希望解决错误的版本执行测试。
我的示例的输出是:
Loaded suite test
Started
O
===============================================================================
The following assertion fails - it will be corrected in the next release [test_omit(Test_omit)]
test.rb:10:in `test_omit'
===============================================================================
O
===============================================================================
Test skipped for version 0.9.0 [test_omit_if(Test_omit)]
test.rb:15:in `test_omit_if'
===============================================================================
Finished in 0.0 seconds.
2 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 2 omissions, 0 notifications
0% passed
所以我的答案是:实施测试。但是不要将测试人员与错误混为一谈,因为它会导致测试失败。
答案是恕我直言。在开始修复该错误之前,您不应该为该错误添加单元测试,然后您将根据该错误报告编写证明该错误的测试以及该测试失败的时间( s)您将去更正实际代码以使测试通过,并且错误将得到解决,然后将其覆盖。
在我的世界中,我们将有一个手动测试用例,即在修复错误之前,QE均将失败。作为开发人员,我们将通过手动失败的TC和错误跟踪器意识到这一点。
不添加失败的UT的原因很简单。UT用于直接反馈和验证我作为开发人员目前正在从事的工作。在CI系统中使用了UT,以确保我没有在该模块的其他代码区域中无意间破坏了某些内容。让UT故意由于已知错误而失败,恕我直言,这会适得其反,而且纯属错误。