03-为什么测试
为什么测试
测试在有些软件开发范式中是整个开发过程的“一等公民”。这意味着测试非常重要,在开发过程的开始和整个过程中都要考虑,并且通常在决定某事是否完成时发挥作用。的确,公认测试对于软件开发是件好事,但在某些范例中测试扮演了核心角色。例如,可能听说过测试驱动开发(Test-Driven Development,TDD)。顾名思义,当实践TDD时,编写软件的过程就是由测试驱动的。应用时,开发人员通常会编写一个失败的测试(一个断言尚未满足的测试),只编写足够的代码通过测试,重构任何重复的代码,然后继续下一个特性,如此反复。
尽管不必成为TDD的严格实践者也能编写优秀的软件,但在继续之前考虑一下其带来的一些好处。如果已经明白测试的好处,请随意继续下一节,我们将在那里开始React的测试。但我想问一个重要问题:我们为什么要测试?
首先,也是最重要的,我们想要编写可工作的软件。现代软件有如此多相互关联的部分以至于假定软件栈的每个部分都将始终可靠地工作是非常愚蠢的。东西总会坏掉,所以与假设事情会始终正常发展相比,假设事情会失败更为合适。我们可以尽我们所能通过测试自己的假设来减少软件可能崩溃的方式。测试迫使开发人员去审视(或重新审视)对软件的假设。开发人员可以详细检查软件能够处理的不同情况并确保它能恰当地处理所有情况。
其次,测试软件的过程有利于编写出更好的代码。经历编写测试的过程可以促进开发人员仔细思考代码的作用,尤其是先写测试的情况下(如TDD那样)。开发者也可以在事后编写测试,虽然这样不太可取,但这也比完全不进行测试要好。经历测试的过程将帮助开发者更好地理解自己编写的代码并验证自己和他人对程序如何运行所做的假设。
再次,将测试集成到软件开发流程中意味着可以更频繁地发布代码。你可能之前听过技术行业中的人提到“频繁交付”。这通常意味着以增量和频繁的方式发布软件。软件公司在过去倾向于在一个非常大的流程之后才发布软件,一年只发布几次(或者至少不那么频繁)。
今天人们的想法已经发生了改变,人们已经意识到增量迭代通常会给软件带来更好的结果:可以更快从用户和其他人那里获得有关软件的反馈,更容易进行实验,等等。对经过良好测试的应用的信心是这个过程的关键部分。通过使用Circle CI、Travis CI或其他类似的持续集成(Continuous Deployment,CI)或持续部署工具可以让测试成为软件部署过程的一部分。其想法是:如果测试通过,软件就会被部署。这些工具通常在一个原始的环境中运行测试,如果测试通过,则将代码发送到可以运行应用程序的任何系统。图9-2展示了Letters Social应用程序用来测试和部署的过程。

最后,测试还可以帮助开发者回头重构代码或移动代码。比方说,需求发生了变化,开发人员需要移动一些组件。如果组件保持模块化并且拥有良好的测试,移动它们就很容易。当然,没有经过测试的代码也可以移动,但与代码经过测试时的感觉相比,开发人员不太明确它是否破坏了系统的其他部分。
关于软件测试的好处和理论还有很多要说的,但这超出了本书的范围。如果想要了解更多,建议看看Roy Osherove的The Art of Unit Testing(第2版)和由Nat Pryce与Steve Freeman共同编写的Growing Object-Oriented Software, Guided by Tests。