赞
踩
<!-- Junit单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- Spock依赖 --> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-spring</artifactId> <version>1.3-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> <!-- spring boot spock --> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-spring</artifactId> <version>1.2-groovy-2.4</version> <scope>test</scope> </dependency>
新建一个Groovy Class,命名为Test。
/** * spock单测类 */ class Test extends Specification{ //before setup def setupSpec() { println ("setupSpec"); } //setup def setup() { println ("setup"); } //cleanup def cleanup() { println ("cleanup"); } //after cleanup def cleanupSpec() { println ("cleanupSpec"); } //测试方法 def "testMethod"(){ println "hello world" expect:"期望结果" 1<2 } }
点击运行testMethod()方法,即可看到控制台输出:
通过控制台的输出,可以看到setup()在测试方法执行前运行,可以进行一些测试前的预热操作。cleanup()在测试方法之后运行,可以用作一些扫尾操作。类似于@Before和@After。
而setupSpec()方法在setup()之前执行,cleanupSpec()在cleanup()方法之后执行。可以理解为对setup()和cleanup()方法的增强。
def "method1"() {
expect:"期望结果"
Math.max(1, 3) == 3
Math.max(7, 4) == 7
Math.max(0, 0) == 0
}
expect用于期望结果的校验,比如对比两个数的最大值,1,3的最大值为3,符合期望结果,测试通过。如果执行结果和期望结果不符合,则报错。
def "method1"() {
expect:"期望结果"
Math.max(1, 3) == 1
Math.max(7, 4) == 7
Math.max(0, 0) == 0
}
执行报错
def "method2"() {
given:"准备变量"
def a = 1
def b = 2
expect:"期望结果"
a < b
}
given语句块通常用于单测前的一些数据准备操作,配合expect一起使用。
def "method3"(){
given:"准备变量"
def num1=-10
def num2=-2
when:"调用方法"
def res1= Math.abs(num1)
def res2= Math.abs(num2)
then:"期望结果"
res1==10
res2==2
}
given:单测前的准备
when:当调用方法取得结果
then:判断是否符合期望结果
def "method4"(){ given:"准备变量" String str="aaabbbcd" when:"调用方法" def res1=str.contains(str1) def res2=str.contains(str2) then:"期望结果" res1==true res2==true where: str1 |str2 "aaa" |"bbb" "ab" |"bc" }
where用于多数据依次测试。when语句块中并未对str1和str2变量赋值,如果我们需要多组数据进行测试的话,可以使用where语句块,用表格的形式依次给变量进行赋值。
@Unroll def "method4"(){ given:"准备变量" String str="aaabbbcd" when:"调用方法" def res1=str.contains(str1) def res2=str.contains(str2) then:"期望结果" res1==true res2==true where: str1 |str2 "aaa" |"bbb" "ab" |"bc" "ccdf" |"g" }
method4()方法新增一组测试用例"ccdf" |“g”,该组用例会导致测试结果与期望不符,如果方法体上加上@Unroll注解,在控制台可以更具体的看到报错信息,会显示具体第几组数据测试失败。
@SpringBootTest class Test extends Specification{ @Autowired UserService userService @Unroll @Transactional @Rollback def "method5"(){ given: User user=new User() user.setId(id) user.setName(name) userService.insert(user) when: User res=userService.getById(id) then: res.getId()==id res.getName()==name where: id<<[1,2,3] name<<["张三","李四","赵五"] // 类似于这种写法 // id |name // 1 |"张三" // 2 |"李四" // 3 |"赵五" } }
在测试类顶部加上@SpringBootTest标签,即可将Spock测试类与SpringBoot进行结合,这样我们可以在测试类中进行@Autowired等操作,通过Spring容器获得service类,进行功能测试。还可以配合@Transactional和@Rollback注解,使方法体内的数据库操作通过事务的方式执行,并且测试完后进行回滚,避免造成脏数据。
个人拙见,不足望指。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。