这是我写的Spock系列的第一篇文章,从本章开始将会带领大家进入Spock的世界。在本篇文章中,我将会为大家介绍什么是Spock?为什么使用Spock?它能给我们带来什么好处?它和JUnit、JMock、Mockito这些测试框架又有什么区别?
定义
Spock是国外一款优秀的测试框架,基于BDD(测试驱动开发)思想,功能强大,使我们的测试代码规范化,结构层次清晰化,它结合Groovy动态语言的特点以及自身提供的各种标签使测试代码更加的高效和简洁;
引用官网的介绍如下(http://spockframework.org)
Spock is a testing and specification framework for Java and Groovy applications. What makes it stand out from the crowd is its beautiful and highly expressive specification language. Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools, and continuous integration servers. Spock is inspired from JUnit, jMock, RSpec, Groovy, Scala, Vulcans, and other fascinating life forms.
“Spock是一个Java和Groovy应用程序的测试和规范框架。它之所以能在人群中脱颖而出,是因为它优美而富有表现力的规范语言。Spock的灵感来自JUnit、RSpec、jMock、Mockito、Groovy、Scala、Vulcans”
Spock的特点如下:
- 规范代码;它内置多种标签来规范单测代码的语义,让我们的测试代码结构清晰,更具可读性,降低后期维护难度。
- 内置标签;比如: where、with、thrown... 帮助我们应对复杂的测试场景。
- 语法高效;它使用Groovy动态语言来编写测试代码,让我们编写的测试代码更简洁,适合敏捷开发,提高编写单测代码的效率。
- 遵从BDD行为驱动开发模式,有助于提升代码质量;
- IDE兼容性好,自带mock功能
Spock通过内置标签(given、when、then、where、expect)去描述代码应该做什么,输入条件是什么,输出是否符合预期,从语义层面规范代码的编写。Spock自带Mock功能,使用简单方便,再加上Groovy动态语言的强大语法,能写出简洁高效的测试代码,同时更方便直观的验证业务代码行为流转,增强我们对代码执行逻辑的可控性,在mock时,便捷的正则语法也提高了书写效率和降低代码维护的复杂度。
对比
初次接触Spock,可能会有疑惑,既然已经有了诸如 JUnit、JMock、Mockito、PowerMock等工具,为什么还需要使用Spock,Spock跟他们有什么异同点?针对一些常用测试框架,我整理了如下一张表格做对比;
Spock | Junit | Jmock | Mockito | PowerMock | |
介绍 | 基于BDD思想,结合groovy语言的一款优秀的测试框架 | 一款纯Java的测试框架 | 基于Java开发,拥有mock能力,简化虚拟对象创建的一款测试框架 | Jmock的一个演进,增强了mock能力简化创建方法 | PowerMock 是一个扩展其他mock类库的框架,提供更加强大的能力 |
Mock能力 | 支持 | 不支持 | 支持 | 支持 | 支持 |
可读性 | 可读性高 | 可读性低 | 可读性低 | 可读性低 | 可读性低 |
维护难度 | 低 | 高 | 高 | 高 | 高 |
静态/final/私有方法Mock | 不支持,但能高效整合PowerMock,复杂度低 | 不支持 | 需整合PowerMock | 需整合PowerMock 较为高效 | 需整合其他单测框架 |
适用范围 | 在运行环境有较高要求、测试分支功能较多的复杂功能测试有独有的优势 | 依赖关系较少或者比较简单类的单元测试 | 测试一些与真实对象进行交互或依赖于真实对象的功能,但书写较为复杂,目前使用较少使用 | 比较主流的测试框架,经常结合PowerMock使用,但Mockito内置了许多API,以及版本选择。 | 常常作为一个辅助功能使用 |
通过以上对比,可以清晰的看到Spock具备非常多的优势,Spock自带Mock功能,使用简单方便(也支持扩展其他mock框架,比如Powermock),再加上groovy动态语言的强大语法,能写出简洁高效的测试代码,同时更方便直观的验证业务代码行为流转,增强我们对代码执行逻辑的可控性。
从下一篇文章开始,我们将结合实际的代码示例由浅入深对Spock的使用进行详细的讲解供大家参考。
本文暂时没有评论,来添加一个吧(●'◡'●)