实践3:断言语句需要解释测试者的意图。

  解释:基本功

  每种单元测试框架都提供了很多断言语句,从根本上来说它们都是一样的。但是测试者需要根据自己的目的选择适当的语句,这样才可以让别人阅读测试代码时理解用例设计的目的。例如对于STAssertNil和STAssertNotNil等等。

  实践4:判断某个意图有没有达到的很好的方法是检测方法影响的数据有没有合理的变化。

  解释:基本功

  由于单元测试是使用断言语句来做判断的,因而容易做的是判断数据的变化。这也限定了单元测试能测试的方法范围,即引起数据变化的方法。对于一些纯展示的方法,例如播放一段,这种方法是无法靠单元测试来进行约束的。测试数据的特性包括取值范围(int、float等),排列顺序(NSArray等),类型等等。

  实践5:运用重构的手段使方法变得易于被测试。

  解释:单元测试是保障重构安全的手段,重构也可以使代码易于被测试。

  什么样的代码是容易进行单元测试的?简单的一点是,每个被测方法都应该是功能单一的。当然,这也是代码规范中应该做到的。方法的功能单一,则测试方法的断言也会比较好确定。如果你发现某个方法很难进行测试,则应该对这个方法进行拆分重构。

  实践5.1:面向抽象设计类之间的关系。

  解释:利于伪造类的实现。

  类之间通讯如果依赖于抽象(接口),则可以较容易的使用伪造类。参照实践1.1。

  实践6:运用自上而下的方式构建类。

  解释:自上而下的方式可以使类的功能明确,类的构成将会清晰紧凑,不会出现一些废方法。

  先确定类需要负担的责任,以此来确定类具有的公有方法以及属性。通过重构将公有方法中的代码转化为私有方法,以使方法尽量短小紧凑。

  实践6.1:应对所有暴露的属性和方法提供测试,私有方法则不必。

  解释:如果运用自上而下的方式构建类,则理论上私有方法应该都是公有方法重构而得到的。实际上测试公有方法时这些私有方法都应该被测试到了。而且,由于私有方法相对公有方法来说发生变动的可能性很大,会造成不必要的修改测试代码的成本。

  回调方法不属于私有方法,也需要进行测试。

  实践6.2:回调方法的测试方法是直接调用。

  解释:基本功

  由于回调方法一般是异步和不可触发的(按正常流程),例如网络事件的返回和按下按钮的触发事件。因而,测试的时候要直接调用来对其流程进行检测。例如某个按钮的touch up inside事件:

  -(void)buttonPressed:(id)sender;

  可以根据方法中用到的方法、属性伪造一个FakeButton按钮作为参数传递进行测试。