“编写测试+重构直到通过”方法看起来令人难以置信的反工程。
您似乎对重构和TDD都有误解。
代码重构是更改计算机程序源代码而不修改其外部功能行为,以改善软件的某些非功能属性的过程。
因此,直到代码通过,您才能重构代码。
TDD,特别是单元测试(我认为是核心的改进,因为其他测试对我来说似乎很合理),并不是在重新设计组件之前就可以进行工作。它是关于设计组件并进行实现直到组件按设计工作为止。
真正掌握单元测试与测试单元有关也很重要。由于总是从头开始编写很多东西的趋势,因此测试此类单元很重要。一位土木工程师已经知道他使用的单元的规格(不同的材料),并且可以期望它们能够工作。这是两件事,通常不适用于软件工程师,并且在使用它们之前非常容易进行工程设计,因为这意味着要使用经过测试的高质量组件。
如果土木工程师有想法使用一些新的纤维纸来制作覆盖体育场的屋顶,则您希望他将其作为一个单元进行测试,即定义所需的规格(例如重量,渗透性,稳定性等),并然后进行测试和优化,直到满足要求。
这就是TDD起作用的原因。因为如果您构建经过测试的单元的软件,则将其工作的机会要大得多,将它们连接在一起时,如果没有,则可以认为问题出在您的粘合代码中,前提是您的测试覆盖范围广。
编辑:
重构意味着:功能没有改变。编写单元测试的一点是要确保重构不会破坏代码。因此,TDD的目的是确保重构不会产生副作用。
粒度不是透视图的主题,因为正如我所说,单元测试是测试单元而不是系统,因此可以精确定义粒度。
TDD鼓励良好的体系结构。它要求您为所有单元定义和实施规格,迫使您在实施之前设计它们,这与您似乎想的完全相反。TDD规定了单元的创建,这些单元可以单独测试,因此可以完全解耦。
TDD并不意味着我对意大利面条代码进行了软件测试,并搅拌通心粉直到通行。
与土木工程不同,在软件工程中,项目通常会不断发展。在土木工程中,您需要在位置A建造一座桥梁,该桥梁可以承载x吨,并且足够宽,每小时可容纳n辆汽车。
在软件工程中,客户基本上可以在任何时候决定(可能在完成后),他想要一个双层桥,并且希望它与最近的高速公路连接,并且他希望它成为吊桥,因为他的公司最近开始使用帆船。
软件工程师的任务是更改设计。不是因为他们的设计有缺陷,而是因为那是作案手法。如果软件设计良好,则可以在不重新编写所有底层组件的情况下,从高层次进行重新设计。
TDD是关于使用经过单独测试的,高度分离的组件来构建软件的。如果执行得当,它将比不使用它更快,更安全地帮助您响应需求的变化。
TDD在开发过程中增加了要求,但并不禁止任何其他质量保证方法。诚然,TDD不能提供与形式验证相同的安全性,但是同样,形式验证非常昂贵,并且无法在系统级别使用。而且,如果您愿意,可以将两者结合起来。
TDD还包含在系统级别执行的单元测试以外的测试。我发现这些内容很容易解释,但难以执行且难以衡量。而且,它们很合理。尽管我绝对看到它们的必要性,但我并没有真正将它们视为思想。
最后,没有工具能够真正解决问题。工具只会使解决问题更加容易。您可以问:凿子将如何帮助我打造出色的建筑?好吧,如果您打算做直墙,直砖会有所帮助。是的,当然,如果您将该工具提供给白痴,他可能最终会用脚猛击它,但这不是凿子的错,这并不是TDD的缺陷,它给新手提供了虚假的安全保障,谁没有写好的测试。
因此,最重要的是,可以说TDD比没有TDD的要好得多。