spock是一款全能型的单元测试框架。
最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock。由于本身使用Groovy的原因,比较钟情于spock框架,但是奈何兼容性比较差,特别是跟Mockito等框架的高级语法的兼容。不过这不妨碍spock是一个非常优秀的单元测试框架,特别体现在用例的形式和测试报告的展示方式以及报错信息的展示(这个我最中意)。
在简单看过官方文档之后做了一些简单的Demo,分享给大家。(官方文档貌似有段时间没有更新了,如果用的话建议升级最新版)
package com.FunTester.spock.pratice
import org.slf4j.Loggerimport spock.lang.Sharedimport spock.lang.Specification
import static com.fun.frame.SourceCode.getLogger
class test01 extends Specification {
@Shared int a = 10;
@Shared Logger logger = getLogger(this.getClass().getName())
def setupSpec() { logger.info "测试类开始! ${logger.getName()}" }
def setup() { logger.info "测试方法开始!" }
def "这是一个测试"() { given: "准备测试数据" def s = 3 def ss = 3 expect: "验证结果" s == ss }
def "表达式测试,表达式左右运算符号"() { given: "准备数据"
expect: "测试方法" z == x + y
where: "校验结果" x | y || z 1 | 0 || 1 2 | 1 || 3 }
def "表达式测试,表达式左右对象方法"() { expect: name.size() == length where: name | length "Spock" | 5 "Kirk" | 4 "Scotty" | 6 "Sc3otty" | 7 }
def "表达式测试,表达式左右对象方法,数组表示测试数据"() { expect: name.size() == length where: name << ["fjdslj", "fds"] length << [6, 3] }
def "校验对象"() { given: def per = new Per("fun", 12) expect: with(per) { name == "fun" age == 12 } }
def "when then结构测试"() { when: def s = plus(3, 2) def ss = plus(3, 2) then: verifyAll { s == 3 ss == 3 } }
/** * 测试方法 * @param i * @param j * @return */ def plus(int i, int j) { i }
/** * 测试类 */ class Per {
Per(String name, int age) { this.name = name this.age = age }
String name
int age
}}
展示一下spock的测试报告: