单元测试和测试驱动开发 TDD 是怎么回事? 已翻译 100%

班纳睿 投递于 2017/02/12 13:51 (共 27 段, 翻译完成于 11-06)
阅读 555
收藏 13
0
加载中

对于测试驱动开发和单元测试,我总有一种既爱又恨的感情在里面。

我一直都是这些“最佳实践”的热心支持者,但是我对它们的使用也一直持有怀疑态度。

软件开发中最大的问题之一是开发者或管理者仅仅是因为它们是最佳实践才要去应用这些“最佳实践” ,却不去理解它们的原因或真正的用途

班纳睿
班纳睿
翻译于 10/11 19:03
0

我记得曾经工作在一个这样的软件项目中,据说我们要修改的软件里有一批惊人数量的单元测试——大概有三千左右。

通常来说,这是一个好迹象。

这可能意味着该项目的开发者同时也在践行其他的最佳实践,并且在代码层面的架构做了一些表面上的工作。

我当时听到这个消息是非常高兴的,因为这样会使得我作为一个开发团队的导师或教练的工作会相当轻松了。既然我们已经有了单元测试,那么我要做的就只是让新的团队继续保持他们的风格并完成他们自己的单元测试。

班纳睿
班纳睿
翻译于 10/11 19:04
0

我打开我的IDE,然后将项目加载进来。

那是一个相当大的项目。

我看到一个文件夹名字是“单元测试”。

很好。运行它们看看会发生些什么。

只用了几分钟的时间,而且出乎我的意料之外的是所有的测试都执行了,而且所有的测试结果都显示为绿色。p们全部都通过了。

现在我就有点怀疑了。三千多个单元测试,它们都通过了吗?

班纳睿
班纳睿
翻译于 10/11 19:04
0

到底是怎么回事?

当我刚进入一个新项目去做教练时,大部分时间如果没有任何单元测试的话,会有一大堆测试都会失败。

于是我决定随机抽查一个测试瞅瞅。

乍一看,看起来相当的合情合理。

并不是最好的测试,大部分是我曾见过的解释型的测试,但是我还是可以弄清楚它在做什么。

但之后我注意到了一些事情…

并没有断言。

也就是说根本没有东西被测试

班纳睿
班纳睿
翻译于 10/11 19:05
0

这个测试分了几步而且这些步骤都在运行,但是在测试的结尾应该检查些什么东西的,然而并没有检查。

这个所谓的“测试” 其实并没有在测试任何东西。

然后我打开了另外的测试。

更糟糕了。

那个能够在某种程度上测试一些东西的断言语句却被注释掉了。

哇,那确实是让一个测试通过的不错的方法,仅仅将使它失败的代码注释掉就好了。

我接着去检查了各个测试。

没有一个能够测试什么东西。

三千个测试全部都是毫无用处的。

写单元测试跟理解单元测试,以及测试驱动开发是有很大不同的。

班纳睿
班纳睿
翻译于 10/11 19:06
0

什么是单元测试?

单元测试的基本思想是编写可以执行最小“单元”代码的测试。

单元测试通常跟要测的源代码使用同一种编程语言,并且会直接使用到源代码。

可以将单元测试看作是测试其它代码的代码。

当我使用“测试”这个字眼的时候,我是指相当宽松的含义,因为单元测试实际上不是测试。它们并不能测试任何东西。

班纳睿
班纳睿
翻译于 10/11 19:06
0

我的意思是说,当你运行一个单元测试时,通常情况下你并不能发现某些代码没法工作。

只有在你写一个单元测试的时候,你才能发现它们没法工作。

是的,代码以后可能会变化,会导致测试失败,所以这个意义上来说,单元测试就是一个回归测试。然而,一般来说,单元测试并不像普通的测试那样,通过执行几个步骤,就能观察该软件是否正常运行。

作为一个编写单元测试的开发人员来说,你可以在写单元测试时发现代码是否按你所预想的方式工作, 因为你会不断地修改代码,直到单元测试通过。

班纳睿
班纳睿
翻译于 10/12 20:57
0

为什么你会编写一个单元测试却不能确保该单元测试可通过?

当你按照这种方式思考时,单元测试更多的是在极低的层次上为特定代码单元指定绝对要求。

你可以把单元测试看成绝对规范。

单元测试指定了:在这些条件下给定一系列输入,这些就是我必须从这个代码单元获得的输出。

真正的单元测试可以测试最小的内聚代码单元,在大多数编程语言中 —— 至少是面向对象的语言中 - 是一个类。

Tocy
Tocy
翻译于 10/12 16:32
0

什么有时会被称为单元测试?

单元测试和集成测试经常被混淆在一起.

一些所谓的“单元测试”会测试多个类或测试更大的代码单元。

许多开发人员会争辩说,这些仍然是单元测试,因为它们是在低的层次上用代码编写的白盒测试。

你不该和这些人争论。

只要记住这些是集成测试,真正的单元测试测试的是被隔离的最小代码单元。

ZICK_ZEON
ZICK_ZEON
翻译于 10/12 10:52
0

另一件经常被称为单元测试,而实际上根本不是单元测试的工作就是编写没有断言的测试。换句话说,单元测试并不测试任何东西。

任何测试,无论是单元测试与否,在最后确定它是否通过时,都应该有某种我们称之为断言的检查。

测试用例总是通过的测试是无用的。

测试用例总是失败的测试是无用的。

ZICK_ZEON
ZICK_ZEON
翻译于 10/12 10:55
0
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(0)

返回顶部
顶部