标签:
本文是个人对于UT的一些想法和总结,参考时建议请查阅官方资料。
转载请注明出处:http://www.cnblogs.com/sizzle/p/4476392.html
编写UT测试代码,通常是为了达到下面几个目的:
但是在实际的开发过程中,UT做成后很难达成以上目标,反而会产生一些副作用:
以上问题发生的原因是开发人员在设计和编码时没有考虑可测试性,导致UT容易发生弊大于利的情况。
在设计和编码时充分考虑可测试性,需要具备丰富的测试经验,而且难于达成,因此产生了”测试驱动开发“(Test Driven Development,简称TDD)。
TDD的测试做成过程很简单,基本可以概括为以下步骤:
总之,TDD过程就是先写期待实现功能的测试代码,然后实装代码使测试通过的。当然,设计时是要优先考虑可测试性的,才能确保TDD过程更顺畅。
使用TDD思想开发的好处有很多,不做详细介绍,感兴趣可以baidu ”TDD 测试驱动开发“关键字,资料很多。
但是,即使利用TDD,开发过程中难免会出现一些测试相关问题:
以上问题在开发过程中难于避免,而且随着代码规模增加可能会爆发甚至导致UT被废弃不用。
为了减少该类问题发生,控制其增长的趋势,新的思想被引入到测试开发过程中--“行为驱动开发”(Behavior Driven Development,简称BDD)。
BDD其实是一种解决方案,它在TDD的基础上提出使用类似自然语言的方式描述软件的行为过程,从而使代码与需求说明更相近,可以与需求同步变化,因此代码也就容易理解和维护。
根据BDD一条Test case可以概括表示为下面三个阶段,测试代码也需要按照下面三段式上下文做成。
现在已经有很多基于BDD的测试框架,Java有JBehave,Ruby有RSpec和Cucumber,Object-C有Kiwi,Swift有Quick C++有CppSpec等。基于这些框架,我们可以写出优美的测试代码。下图是基于Swift语言使用Quick框架编写的测试代码以及对应的三段式上下文描述供参考:
理论上,基于BDD开发,全部代码都需要测试,而且UT是针对“行为”,应该可以对应到明确的函数方法。但是实际开发过程中,有许多范围需要明确。
下面列举一些确定测试范围的“教条”,所谓“教条”就是只需灵活运用,不必刻意追求:
在开发过程中,测试与设计相辅相成,设计时需要考虑程序的可测试性,测试时可以看出模块间的耦合是否过于紧密,模块的功能是否单一,从而驱动架构改善,减少项目后期因设计问题导致重构而产生的工数和关联功能间的影响。因此,在设计阶段就需要明确测试范围,规范模块间和模块内的“行为”,相应的测试代码就会简单明晰。
明确测试范围后,对于测试范围外而且依赖的对象需要做成Mocker,如下图所示:
如果测试模块B,那么需要做成Tester,以使用者A的角度测试B的“行为”是否满足期待值。其中模块C和D被B依赖,因此需要做成相应的Mocker,提供接口供B使用。Tester可以确认Mocker中收到的B传送的数据,从而测试B的“行为”是否正确。
标签:
原文地址:http://www.cnblogs.com/sizzle/p/4476392.html