测试代码必须要做以下这几件事情:
- 准备测试所需要的各种条件(创建所有必须的对象,分配必要的资源等等)。
- 调用要测试的方法。
- 验证被测试方法的行为和期望是否一致。
- 完成后清理各种资源。
每个测试的运行都应该是相互独立的, 从而你就可以在任何时候,以任意的顺序运行每个单独的测试。
方法或类中6个值的测试的具体部位, 统称Right-BICEP:
Right —— 结果是否正确
B —— 是否所有的边界条件都是正确的
I —— 能查一下反向关联吗
C —— 能用其他手段交叉检查一下结果吗
E —— 你能否可以强制错误条件发生
P —— 是否满足性能要求
好的测试应该具有以下的品质, 合称为A-TRIP:
自动化(Automatic)
彻底的(Thorough)
可重复(Repeatable)
独立的(Independent)
专业的(Professional)
桩对象(stub object)
外部依赖:
外部依赖是指在系统中代码与其交互的对象,而且无法对其做人为控制。(最常见的例子是文件系统、线程、内存和时间等。)
在程序设计中,我们使用桩对象来处理外部依赖问题。
桩对象是对系统中现有依赖项的一个替代品,可人为控制。通过使用桩对象,无需涉及依赖项,即可直接对代码进行测试。
任何面向对象的问题都可以通过添加一个间接层来解决,除非有太多的间接层。
接缝(seam)是指代码中可以插入不同功能(如桩对象类)的地方。
解除依赖的技巧:
- 抽取接口,以允许替换底层实现
- 在被测试类中注入桩对象的实现
- 在构造函数级别上接收一个接口
- 接收一个接口作为属性的get或set的类型
- 在调用一个方法之前获得一个桩对象
有几种行之有效的方法可用于新建基于接口的接缝,我们可以对接缝处所用到的类注入一个接口实现。
- 在构造函数级别上接收一个接口,并保存在一个字段(field) 里以备后用。
- 接收一个接口作为属性的get或set的类型,并保存在一个字段里备用。
-
在调用方法之前,通过以下方式来接收一个接口:
a. 方法参数(参数注入) b。 工厂类 c。 局部工厂方法 d。 以上方法的变种
交互测试用来测试一个对象如何向另一个对象传递消息,或者如何从其他对象接收消息,即测试对象如何与其他对象进行交互。