我有一套复杂的集成测试,它使用Perl的WWW :: Mechanize来驱动Web应用程序,并根据特定的数据组合检查结果。有超过20个子程序构成测试的逻辑,循环数据等。每个测试在不同的数据集上运行几个测试子程序。
Web应用程序并不完美,因此有时错误会导致测试因特定的数据组合而失败。但是这些组合非常罕见,我们的团队很长时间都不会费心去修复这些错误。建立许多其他新功能是首要任务。
那么我应该怎样处理失败的测试?每个数据组合只有几十个测试。 1)我不能让它失败,因为整个测试套件都会失败。 2)如果我们将它们评论出来,那意味着我们错过了对所有其他数据集进行测试。 3)我可以在失败的特定数据集中添加一个标志,并且如果设置了该标志,则测试不会运行,但是我在测试子例程中的所有地方都传递了额外的标志。
最干净,最简单的方法是什么? 或者干净又容易互相排斥?
答案 0 :(得分:11)
这就是TODO的用途。
使用todo块,内部测试预计会失败。 Test :: More将正常运行测试,但打印出特殊标志,表明它们是“todo”。 Test :: Harness会将失败解释为正常。如果一切顺利,它会将其报告为意外成功。然后你就知道你已经完成的事情并且可以删除TODO标志。
关于todo测试的好处,而不是简单地评论一组测试,就像有一个程序化的待办事项列表。你知道还有多少工作要做,你知道那里有什么错误,你会立刻知道它们何时被修复。
一旦todo测试开始成功,只需将其移到块外即可。当块为空时,将其删除。
答案 1 :(得分:0)
我看到两个主要选项
禁用测试(将其注释掉),并引用您的错误跟踪系统(即错误ig),可能会在错误中保留一个注释,以便为此错误准备好测试
在单独的测试套件中移动失败的测试。你甚至可以反转失败的断言,这样你就可以运行套件了,当它是绿色的时候,bug仍然存在,如果它变成红色,那么bug就会消失,或者其他东西都是可疑的。当然,错误跟踪系统和包的链接仍然是一件好事。
答案 2 :(得分:0)
如果您实际上将Test :: More与WWW :: Mechanize结合使用,则关闭案例(请参阅@daxim的评论)。如果没有,请考虑类似的方法:
# In your testing module
our $TODO;
# ...
if (defined $TODO) {
# only print warnings
};
# in a test script
local $My::Test::TODO = "This bug is delayed until iteration 42";