spock(Spock测试框架的介绍和用法)

发布时间:2025-12-11 03:03:36 浏览次数:1

Java项目中使用groovy简化测试 、 java项目测试框架spock的使用教程

简介

Spock 框架是一个基于groovy语法的测试框架,由于使用groovy,所以使用起来比 junit 更加灵活,测试用例的写法更加简单易懂,一目了然。

如果使用过junit,spock的则很容易上手,可以类比来学习。

使用

下面直接使用实例来介绍spock的用法:

1.加入依赖

<dependency><groupId>org.spockframework</groupId><artifactId>spock-core</artifactId><version>1.2-groovy-2.4</version><scope>test</scope></dependency><!--Spock需要的groovy依赖--><dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.4.15</version></dependency><!--springbootspock--><dependency><groupId>org.spockframework</groupId><artifactId>spock-spring</artifactId><version>1.2-groovy-2.4</version><scope>test</scope></dependency>

2. 测试方法的生命周期

在junit使用时,主要用以下注解来标记测试类的方法:

@Test:标记需要运行的测试方法,一个测试类中可以有多个@Test方法;@Before/@After:标记的方法,会在每个测试方法运行之前/之后运行一次;@BeforeClass/@AfterClass:标记的方法会在测试类初始化时/销毁时运行;

spock 没有使用以上的注解形式,而是测试类需要继承 Specification 父类,重写父类中的以下方法,就可以自定义测试方法的生命周期:

defsetup(){}//runbeforeeveryfeaturemethoddefcleanup(){}//runaftereveryfeaturemethoddefsetupSpec(){}//runbeforethefirstfeaturemethoddefcleanupSpec(){}//runafterthelastfeaturemethod

所以有如下测试代码:

packagecom.yawn.spockimportspock.lang.Sharedimportspock.lang.Specification/***spock测试*@authoryawn*2019/6/109:43*/classCalculateSpecextendsSpecification{//初始化defsetupSpec(){calculateService=newCalculateService()println">>>>>>setupSpec"}defsetup(){println">>>>>>setup"}defcleanup(){println">>>>>>cleanup"}defcleanupSpec(){println">>>>>>cleanupSpec"}def"testlifecycle"(){given:defa=1defb=2expect:a<bprintln"testmethodfinished!"}}

运行结果为:

spock测试的生命周期方法执行顺序

3. 测试方法的格式

(1)given … expect … 格式:

given语句块为条件,expect为测试期望得到的结果,结果为true则通过测试。上面的示例就是这种格式的。

(2)given … when … then …

classCalculateSpecextendsSpecification{@SharedCalculateServicecalculateService//初始化defsetupSpec(){calculateService=newCalculateService()}//测试方法def"testplus1"(){given:"准备数据"defa=1defb=2when:"测试方法"defc=calculateService.plus(a,b)then:"校验结果"c==4-1}

其中,@Share注解表示的是各个测试方法共享的一个实例。setupSpec() 方法中初始化了这个实例。

(3)when … then …

语义同上。

(4)given … expect … where …

def"test1"(){given:"准备数据"expect:"测试方法"z==calculateService.plus(x,y)where:"校验结果"x|y||z1|0||12|1||3}

expect 为核心的测试校验语句块。where 为多个测试用例的列举,很直观的写法。

由于有两个测试用例,所以plus()方法会在这里运行两次。

(5)expect … where …

同上。

(6)expect …

同上。测试单个语句是否成立。

4.where 测试用例的列举格式:

where 后可列举多个测试用例,有以下不同的格式:

//1映射格式def"lengthofSpock'sandhisfriends'names"(){expect:name.size()==lengthwhere:name|length"Spock">}//2数组列表格式(每个数组顺序不能乱)def"lengthofYawn'sandhisfriends'names"(){expect:name.size()==lengthwhere:name<<["Yawn","Tim"]length<<[4,3]}

5.verifyAll 校验多个表达式结果

def"没有参数的verifyAll"(){when:intz1=calculateService.plus(1,1)intz2=calculateService.plus(1,2)intz3=calculateService.plus(1,3)then:verifyAll{z1==1z2==3z3==3}}

verifyAll语句块可以分别校验多个boolean的结果。

6.with()和verifyAll() 取对象属性的值

def"testpersonusewith(p)"(){given:"initaperson"Datenow=newDate()Personp=newPerson(name:"yawn",age:18,birthday:now)expect:"测试p"with(p){name=="yawn"age<20birthday==now}}def"多个预期值的测试使用verifyAll()"(){when:Personp=newPerson(name:"yawn",age:18)then:verifyAll(p){name=="yawn"age<20}}staticclassPerson{privateStringnameprivateintageprivateDatebirthday}

with()和verifyAll()传入对象后,可以直接使用其属性值。

7.多次执行被测试的语句:

def"多次执行测试语句"(){given:defa=0expect:"aaa"3*calculateService.plusPlus(a)==3//执行3次后结果为3}

“3 * _” 表示这个语句会被执行三次,再与“==”后面的3进行比较。

到此,相信大家对“Spock测试框架的介绍和用法”有了更深的了解,不妨来实际操作一番吧!这里是本站网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

spock
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477