0

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

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

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

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

在 TDD 术语中,这应该是“失败”,但相反,它会引发异常,并且您会得到一个“错误”:

 Ran 1 tests with 0 failures and 1 errors

有人会假设您想要:

 Ran 1 tests with 1 failures and 0 errors

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

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

但这不是问题。

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

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

更多阅读未能阐明这个问题: http: //www.computer.org/portal/web/swebok/html/ch5#Ref1.1.2
“IEEE软件工程术语标准词汇表”(谷歌它)

并查看 Python 2 和 Python 3 单元测试文档之间的编辑: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] 帮助您确定问题出在哪里:失败是由不正确的结果引起的 - 5,而您期望得到 6。错误是由不正确的代码引起的 - 例如,由不正确的函数调用引起的 TypeError。


正在考虑这个问题的其他标题:
“为什么单元测试会出现‘失败’和‘错误’案例?”

“'失败'和'错误'之间的哲学区别是什么

“在 TDD 中,是否应该编写所有“失败测试”以抛出“失败”或“错误”可接受”

仍然试图准确地确定我在这里要问的内容,而没有得到像“一个是断言错误而另一个不是”这样的简单答案,我很乐意投反对票。

4

1 回答 1

1

抛出异常是指示失败的一种方式。这意味着不满足测试的前提条件之一。问“这个调用是否没有抛出异常”通常并不有趣——这是一个我们必须对所有代码提出的问题。

发现“这个名义上有效的输入导致抛出异常”的错误这一事实表明测试套件中存在错误——某些输入类别没有被覆盖。导致抛出异常的输入类通常需要关于预期输出应该是什么的稍微专门的规则,因此在将新发现的错误的测试措辞作为缺乏覆盖错误的修复时几乎总是有文献价值.

这是一种冗长的说法,是的,您编写的测试测试了两件事。但是它测试的东西之一是我们不应该明确测试的东西,因为它并不有趣。无聊的测试是糟糕的测试。

于 2013-03-14T23:57:01.587 回答