开始之前

  本文侧重讲述如何在iOS程序的开发过程中使用单元测试。使用Xcode自带的OCUnit作为测试框架。

  一、单元测试概述

  单元测试作为敏捷开发实践的组成之一,其目的是提高软件开发的效率,维持代码的健康性。其目标是证明软件能够正常运行,而不是发现bug(发现bug这一目的与开发成本是正相关的,虽然发现bug是保证软件质量的一种手段,但是很显然这与降低软件开发成本这一目的背道而驰)。它是对软件质量的一种保证,例如重构之后我们需要保证软件产品的正常运行。

  很多人认为编写单元测试没有用是认为单元测试并不能保证一定能减少bug发生的几率,而由于编写单元测试一定会花费一定的时间与精力,因而必然的会增加成本。客观的说,造成这种原因很大的程度上是程序员的水平不够高。我认为使用使用单元测试带来巨大好处的必要条件如下所示:

  ● 程序员本身的编程水平--是否有较多的代码经验,是否熟练掌握重构

  ● 程序员对项目的认知--是否能正确理解软件或模块的需求

  ● 项目质量--是否稳定,是否长期多版本,是否需要应对较多变化

  如果程序员水平较高,对需求理解较为清晰,项目需要面对较多的变化,那么毫无疑问单元测试对于软件非常有益。假如软件功能简单且开发周期短,不需要进行复杂的维护工作,那么单元测试的意义并不大。

  的单元测试实践的好处:

  ● 好的单元测试是一份好的文档,并且比文档更能为程序员所接受,它直接描述了测试员对受测代码的结果所持的预期。

  ● 当代码由别人维护时(或自己进行重构时),通过单元测试的约束,才能保证在加入新功能或修改旧功能时代码的正确性。

  ● 由于单元测试的自动化执行,保证了在整个开发流程中代码都会被测试,这非常符合XP思想。

  ● 保证在面对软件功能的变化时,程序员可以较为放心的进行代码重构,而不必担心是否破坏了原有功能。

  ● 好的单元测试可以降低bug数量,而对于项目管理来说,修改bug这个过程是无法制定计划的,可以使软件的开发流程更容易掌控。

  ● 可以由老程序员编写描述某个类行为的测试,以此指导新程序员对类的编码。

  ● ……

  好处还有很多,但重要的一点是保证了软件质量的同时,由于减少bug和应对变化造成的回归bug的产生等,提高了劳动生产率。而且,在敏捷流程中,使用单元测试是必须掌握的手段,否则没发保证重构的正确性,从而造成代码无法面对变化。

  二、iOS的单元测试概述

  刚接触客户端编程时,我在很长一段时间内都想不通对于客户端程序如何编写单元测试。单元测试本质上说白了是用一些断言来判定结果,而这种方式是如何应用到具有复杂交互的界面测试上来的呢?

  我们要做的是将客户端代码转化为易于测试的代码。什么样的代码易于测试呢?它至少是这样的:

  1、被测方法需要产生可测量的结果。

  2、类之间的关系应该是松耦合的。

  其中第一条是必要条件。使用断言这种形式指明了测试的方法终要造成某些可以度量的结果。因而,我们需要尽量的将展示和业务逻辑分离开来。展示的代码是没法测试的,例如有的方法只是播放动画。而业务逻辑终都会造成一些数据的改变,这是容易测试的。