关于单元测试:在维护测试套件时,所有“错误”最终都会变成“失败”吗?

When maintaining a test suite, should all 'errors' eventually become 'failures'?

我是python unittest的用户,但是它跨越了所有语言。

Senario:我在'functionBeingTested'中发现了一个缺陷。
缺点是在有效输入时代码会崩溃(抛出异常)

在编写测试用例时,我可以非常简单地:

1
2
def testThis(self):
    self.assertEqual( functionBeingTested("valid input"),"expected output")

在TDD术语中,这可能会"失败",但相反,它会引发异常,并且您会收到"错误":

1
 Ran 1 tests with 0 failures and 1 errors

人们会认为你会想要:

1
 Ran 1 tests with 1 failures and 0 errors

这个Python单元测试有解决方案:将异常报告为失败

这里有类似的讨论:如果没有抛出异常,则通过单元测试

但这不是问题。

问题是"维护测试套件的最佳实践"

在纯测试驱动开发中编写'错误测试用例'[如果存在这样的事情]在哲学上是否可接受,或者应该编写此单元测试来捕获异常并引发断言错误以证明'失败'而不是'错误'。

还有一些阅读未能揭示这个问题:
http://www.computer.org/portal/web/swebok/html/ch5#Ref1.1.2
"IEEE标准软件工程术语表"(google it)

看看Python 2和Python 3 unittest文档之间的编辑:
http://docs.python.org/2/library/unittest.html#organizing-test-code
http://docs.python.org/3/library/unittest.html#organizing-test-code

似乎在Python 3中省略了这个短语:

[error] helps you identify where the problem is: failures are caused
by incorrect results - a 5 where you expected a 6. Errors are caused
by incorrect code - e.g., a TypeError caused by an incorrect function
call.

正在考虑该问题的其他标题:
"为什么单元测试会出现'失败'和'错误'?"
要么
"'失败'和'错误'之间的哲学差异是什么?
要么
"在TDD中,是否所有"失败的测试"都应该写成"失败"或"错误"可接受"

仍然试图准确地确定我在这里问的问题,而没有得到像"一个是断言错误而另一个不是"这样的简单答案,我很乐意将其投票。


抛出异常是指示失败的一种方式。 这意味着测试的前提条件之一未得到满足。 询问"这个调用是否未能引发异常"通常并不常见 - 这是一个我们不得不问所有代码的问题。

发现"这个名义上有效的输入导致抛出异常"的错误表明测试套件中存在错误 - 某些类型的输入未被覆盖。 导致异常抛出的输入类通常需要稍微专门的规则来预测输出应该是什么,所以在测试新发现的bug时几乎总是有文档价值作为缺乏覆盖bug的修复。

这是一种啰嗦的说法是,你写的测试测试了两件事。 但它测试的东西之一是我们不应该明确测试的东西,因为它没有意思。 镗孔测试是不好的测试。