单元测试
单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
单元测试的几种场景:
- 开发前写单元测试,通过测试描述需求,由测试驱动开发。
- 在开发过程中及时得到反馈,提前发现问题。
- 应用于自动化构建或持续集成流程,对每次代码修改做回归测试。
- 作为重构的基础,验证重构是否可靠。
Mock
BDD
BDD:行为驱动开发是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。BDD最初是由Dan North在2003年命名,它包括验收测试和客户测试驱动等的极限编程的实践,作为对测试驱动开发的回应。
BDD的做法包括:
- 确立不同利益相关者要实现的远景目标
- 使用特性注入方法绘制出达到这些目标所需要的特性
- 通过由外及内的软件开发方法,把涉及到的利益相关者融入到实现的过程中
- 使用例子来描述应用程序的行为或代码的每个单元
- 通过自动运行这些例子,提供快速反馈,进行回归测试
- 使用“应当(should)”来描述软件的行为,以帮助阐明代码的职责,以及回答对该软件的功能性的质疑
- 使用“确保(ensure)”来描述软件的职责,以把代码本身的效用与其他单元(element)代码带来的边际效用中区分出来。
- 使用mock作为还未编写的相关代码模块的替身
Spock
简单地说,spock是一个测试框架,它的核心特性有以下几个:
-
可以应用于java或groovy应用的单元测试框架。
-
测试代码使用基于groovy语言扩展而成的规范说明语言(specification language)。
-
通过junit runner调用测试,兼容绝大部分junit的运行场景(ide,构建工具,持续集成等)。
-
框架的设计思路参考了JUnit,jMock,RSpec,Groovy,Scala,Vulcans……
def setup() {} // run before every feature method
def cleanup() {} // run after every feature method
def setupSpec() {} // run before the first feature method
def cleanupSpec() {} // run after the last feature method
when与then需要搭配使用,在when中执行待测试的函数,在then中判断是否符合预期
when :
stack . push ( elem )
then :
! stack . empty
stack . size ( ) == 1
stack . peek ( ) == elem
如果要验证有没有抛出异常,可以用thrown()
when :
stack . pop ( )
then :
thrown ( EmptyStackException )
stack . empty
expect可以看做精简版的when+then
when :
def x = Math . max ( 1 , 2 )
then :
x == 2
简化为
expect :
Math . max ( 1 , 2 ) == 2
Cleanup Blocks
函数退出前做一些清理工作,如关闭资源等。
Where Blocks
做测试时最复杂的事情之一就是准备测试数据,尤其是要测试边界条件、测试异常分支等,这些都需要在测试之前规划好数据。但是传统的测试框架很难轻松的制造数据,要么依赖反复调用,要么用xml或者data provider函数之类难以理解和阅读的方式。