Spock测试框架浅尝


在这里插入图片描述

0. 写在前面

这篇文章会介绍 Spock 测试框架相关的一些基本概念,包括数据驱动测试(Data Driven Testing)、基于交互的测试(Interaction Based Testing)、Mocking 和 Stubbing 等,这其中会带有一些简单的例子。

这篇文章绝大部分内容来自Spock官方文档,说它为官方文档的粗糙翻译也不为过🥲。我把自己使用 Spock 时认为比较重要的内容放在了这里,它们只是概念性的解释,参考资料 - 2是一篇快速上手文档,我也会尽量在下篇文章中展示工程中实际使用 Spock 的场景。如果哪些地方描述的太过晦涩,你可以直接移步至官方文档。

文章主要会从单元测试的角度介绍 Spock,对于集成测试,使用方式不会相差很多。还有你可能需要懂一点 Groovy 语言,如果例子中的某些地方你看起来有些吃力,它们很可能是 Groovy 的特性。现在,让我们开始吧!

1. 为什么要进行单元测试?

你可能很随意地说出单元测试的一些好处,不过我们不妨再复习一遍,你会对单元测试有新的体会。

1.1 什么是单元测试?

单元测试(Unit Testing)是一种软件测试方法,它会测试源代码中的各个单元来确定它们是否适合使用。单元是指最小的可测试软件组件,通常是一个只包括单一功能的方法。相比于更大的代码块,记录和分析测试结果更容易,单元测试揭示的缺陷更容易定位,也相对更容易修复,简单讲,单元测试更容易进行。

1.2 单元测试的几个好处

  1. 提高代码质量、尽早发现缺陷和降低后期修复成本:软件工程中提到过,越早的暴露缺陷,修复的成本越低,单元测试应该算是发现代码bug的最早过程。同时,这也会间接地提高代码质量,你可能还会思考有没有更好的代码设计,并考虑测试单元的核心功能,因为你需要保证它可测试;
  2. 开发过程会更敏捷、有利于安全重构:当你向工程中添加越来越多的功能时,有时需要修改旧的设计和代码。然而,更改测试过的代码既危险又昂贵。如果我们有单元测试,你就可以很自信地进行重构,及时地确保重构后的代码没有问题;
  3. 方便调试、对所写代码更有体感:毫无疑问,单元测试更容易调试,当进行单元测试时,我们的目光会聚焦于单个单元,你不必去考虑依赖和上下文。更重要的是,对于无法在本地启动的较大工程,单元测试能让你在本地执行和调试,这会具体到你需要考虑单元中的每个数据类型和边缘条件。

2. Spock框架介绍

我们首先来看 Spock 官方文档对自己的定义:

Spock is a testing and specification framework for Java and Groovy applications. …Thanks to its JUnit runner, Spock is compatible with most IDEs, build tools, and continuous integration servers.

和某篇优秀的guide提及的内容:

Mainly, Spock aims to be a more powerful alternative to the traditional JUnit stack, by leveraging Groovy features.

首先,Spock 是用于 Java 和 Groovy 应用程序的测试和规范框架。因为测试代码需要用 Groovy 来写,所以你可以用到 Groovy 的一些灵活的特性,并且 Spock 还有自己的一些很酷的语法。因为其底层依赖 JUnit,所以你不必担心 JUnit 完成的测试 Spock 做不到,而且 Spock 会让测试代码更简洁。我们接着来看与 Spock 有关的一些概念。

2.1 规范 Specification

我们先来看官方文档中的一段介绍:

Spock lets you write specifications that describe expected features (properties, aspects) exhibited by a system of interest.

我们重点说明下划线标记的3个地方。首先,这里 Specification 是指软件需求规范(Software Requirements Specification),它完整描述了期望某个系统怎样运行。我们会使用 Spock 编写 Specification,它会描述一个兴趣系统(System Of Interest,我们这里简称为 SOI ) 的预期 features。SOI 可以是一个简单类或整个应用程序,这主要看你想测试什么,比如想做集成测试或系统测试,SOI 的范围就会相应变大;如果是单元测试,把范围限制到单个类即可。接着 features 就是我们想测试的一个个功能点,后面还会提到它。

class HelloSpecification extends Specification {
   
    // fields
    // fixture methods <--
    // feature methods <--
    // helper methods
}

我们实现的 specification 是一个继承自spock.lang.Specification的 Groovy 类,类Specification包含很多我们编写规范时有用的方法。命名时通常和 SOI 关联,比如PlanetServiceSpecCustomerSpec

夹具方法 Fixture Methods

def setupSpec() {
   }    // runs once -  before the first feature method
def setup() {
   }        // runs before every feature method
def cleanup() {
   }      // runs after every feature method
def cleanupSpec() {
   }  // runs once -  after the last feature method

Fixture methods 负责初始化和清理运行 feature methods 的环境。你可以将它类比到 JUnit 中的@Before@After。这些夹具方法会有一定的运行顺序,更详细说明你可以参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值