使用Spock测试您的代码
Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是:
- 极富表现力
- 促进测试的给定/何时/然后语法
- 与大多数IDE和CI服务器兼容。
听起来不错? 通过快速访问Spock Web控制台,您可以非常快速地开始使用Spock。 当您有一个喜欢的小测试时,可以像发布此Hello World测试一样进行发布。
Spock中的HelloWorld
首先,Spock测试是用Groovy编写的。 这意味着,您在Java中拥有的一些样板代码将消失。 有一个Hello World测试可以很好地介绍Spock的某些功能。
- 默认情况下, 无需指示该类为公共类。
- 无需将firstWord和lastWord声明为字符串
- 无需显式调用assert,因为Expect块中的每一行代码都会自动获取该断言。 只要确保该块中的行是布尔表达式即可。 因此,在这种情况下,它只是一个相等表达式,可以为true或false。
如此少的样板代码下一步是什么? 好吧,您知道通过JUnit测试获得的那些真正长的测试名称,而不是必须调用此测试helloWorldIntroductionToSpockTest ()(这很难理解),您可以使用带空格的String来命名测试: Hello World对Spock的介绍测试 。 这使事情更具可读性。
第三,如果我要对测试进行一些小的更改并将firstWord更改为“ Hello1 ”,则测试当然会失败。 但是当我在Spock中失败时,我得到了测试的表达式的完整上下文。 我看到了firstWord的值, secondWord的值以及连接后的值,这使测试失败时可以更快地诊断问题。
Spock显示了失败的背景
模拟和存根对于介绍来说不错。 现在让我们看看更多功能。
在JUnit中( 以及各种附加功能),模拟和存根功能更为强大。 但是,它不仅在Spock中超级强大,而且非常简洁,使您的测试代码非常整洁且易于阅读。
假设我们想在测试中添加一个名为PaymentCalculator的类,更具体地说,是一个方法calculate(Product product,Integer count)。 在存根版本中,无论产品值如何,我们都希望返回计数乘以10。 在Spock中,我们通过以下方式实现这一目标:
PaymentCalculator paymentCalculator = Stub(PaymentCalculator)
paymentCalculator.calculate(_, _) >> {p, c -> c * 10}
如果您还没有意识到这是多么短暂和整洁,那么那就给自己喝杯咖啡吧 。 如果您已经很好地了解了,您仍然可以找到一个保险箱,但是请考虑以下几点:
- 计算值中的下划线表示所有值
- 在右侧,我们看到了Groovy Closure。 现在,将其视为具有两个输入的匿名方法。 p为产品,c为计数。 我们不必键入它们。 那只是更多的样板代码而已。
- 闭包将始终返回计数时间10。我们不需要return语句。 总是返回最后一个表达式的值。 同样,这意味着更少的样板代码。 当存根变得如此简单和整洁时,这意味着您可以真正专注于测试-很棒。
参数化测试
最好的解释方式是通过示例。
@Unroll
def "Check that the rugby player #player who has Irish status #isIrish plays for Ireland"(String player, Boolean isIrish) {given:"An instance of Rugby player validator"RugbyPlayerValidator rugbyPlayerValidator = new RugbyPlayerValidator()expect:rugbyPlayerValidator.isIrish(player) == isIrishwhere:player || isIrish"Johny Sexton" || true"Stuart Hogg" || false"Conor Murray" || true"George North" || false"Jack Nowell" || true}
在此参数化测试中,我们看到以下内容:
- 测试已参数化,我们在测试签名和where块中。
- 有一个输入参数播放器和一个输出参数–对应于期望值。
- 测试被参数化五次。 输入参数在左侧,输出在右侧。 当然,也可以有更多的一个,在这个测试中,我们每个只有一个。
- @Unroll注释表示如果测试失败,则将输出所有参数的值。 该消息将把玩家的详细信息替换为#player,并将爱尔兰身份的详细信息替换为#isIrish。 因此,例如,“ 检查具有爱尔兰身份的橄榄球运动员杰克·诺维尔是否为爱尔兰效力 ”
同样,这使得缩小错误的范围变得更快。 测试是否错误或代码是否错误? 这成为一个可以更快回答的问题。 在这种情况下,测试是错误的。
Groovy的所有好处
还有什么? 好吧,另一个主要好处是Groovy的所有好处。 例如,假设您正在测试一个返回JSON或XML的API。 Groovy在解析XML和JSON方面非常出色。 假设我们有一个API,该API以XML格式返回有关体育运动员的信息。 格式有所不同,但仅略有不同,具体取决于他们参加的运动:
Joey Carberry<details><rugbysummarycategory><players><player>Joey Carberry</player><player>Teddy Thomas</player></players>
</rugbysummarycategory>
</details><details><footballsummarycategory><players><player>Lionel Messi</player><player>Cristiano Ronaldo</player></players></footballsummarycategory>
</details>
我们只想调用此API,然后解析运动员(与运动无关)即可。 我们可以在Groovy中非常简单地将其多态解析。
def rootNode = new XmlSlurper().parseText(xml)
List players = rootNode.'*'.Players.Player*.text()
一些要点:
- 动态类型的功能是立竿见影的。 可以在rootNode上动态调用该表达式。 无需冗长,复杂的XPath表达式。
- “ *”就像通配符。 这将涵盖RugbySummaryCategory和FootballSummaryCategory。
- Player *,表示所有Player元素。 所以这里不需要愚蠢的冗长的循环
- text()表达式只是提取各个Player元素之间的文本值。 那么为什么现在要列出所有玩家并可以简单地进行操作:players.size()== 4请记住,不需要断言。
假设我们要检查玩家的名字。 好吧,在这种情况下,我们不在乎顺序,因此将列表转换为Set然后进行检查更有意义。 简单。
players as Set = ["Joey Carberry", "Teddy Thomas", "Lionel Messi", Cristiano Ranaldo"] as Set
这会将两个列表都转换为Set,这意味着订单检查消失了,这只是Set的比较。 我们可以利用更多的Groovy优势。 但是美丽是,我们实际上没有必要。
所有Java代码在Groovy类中也有效 。 Spock也是如此。 这意味着对于任何有Java背景的人来说,学习者的学习曲线都不陡峭。 他们可以编写纯Java代码,然后从代码评论等中获得一些Groovy技巧。
强大的注释
Spock还为您的测试提供了一系列功能强大的注释。 再次,我们在这里看到了Groovy的强大功能,因为我们可以将闭包传递给这些注释。 例如:
@IgnoreIf({System.getProperty("os.name").contains("windows")})
def "I'll run anywhere except windows"() {...}
或者如果执行时间过长,则使测试失败
@Timeout(value = 100, unit=TimeUnit.MILLISECONDS)
def "I better be quick"() {...}
因此,总之,Spock与普通JUnit具有以下优点:
- 强制执行测试结构。 没有更多的随机断言。 断言只能在代码的指定部分中。
- 测试代码更具可读性。
- 有关失败测试的更多信息
- 可以用更少的代码进行模拟和存根
- 可以利用大量的Groovy功能使代码不再那么冗长
- 非常强大的测试参数设置,可以非常整齐地完成
- 一系列功能强大的注释。
通常被遗忘的要点之一是您的项目不必用Groovy编写。 您可以将其全部保留在Java中,并为生产代码使用Java的静态类型,并为测试代码使用Groovy的功能和速度。
直到下一次照顾自己。
翻译自: https://www.javacodegeeks.com/2018/03/testing-code-spock.html
使用Spock测试您的代码相关推荐
- spock测试_使用Spock测试您的代码
spock测试 Spock是针对Java和Groovy应用程序的测试和规范框架. Spock是: 极富表现力 简化测试的"给定/何时/然后" 语法 与大多数IDE和CI服务器兼容. ...
- spock测试_将Spock 1.3测试迁移到Spock 2.0
spock测试 了解Spock 2.0 M1(基于JUnit 5)的期望,如何在Gradle和Maven中迁移到它以及为什么报告发现的问题很重要:). 重要说明 . 我绝对不建议您永久将您的现实项目迁 ...
- spock测试_用于混合Spock 1.x和JUnit 5测试的Maven项目设置
spock测试 我为Maven创建了一个示例Groovy项目,该项目在一个项目中混合了Spock测试和JUnit 5测试. 在下一节中,我将描述如何设置这种Maven项目. 在项目中启用Groovy ...
- spock测试_用Spock测试AKKA应用程序
spock测试 AKKA是基于消息驱动和基于AKKA模型的并发工具包. 尽管AKKA用Scala编写, AKKA可以在任何基于JVM的语言项目中使用. 这篇文章试图填补关于在利用AKKA框架的多语言J ...
- 用Spock测试AKKA应用程序
AKKA是基于消息驱动和基于AKKA模型的并发工具包. 尽管AKKA是用Scala编写的, AKKA可以在任何基于JVM的语言项目中使用. 这篇文章试图填补关于在利用AKKA框架的多语言JVM项目中编 ...
- 5.6使用Spock测试
另外一个重要的测试工具是Spock,这个是Peter Niederwieser使用Groory写的.使用Groovy基础框架,它很适合用于主要JVM基础语言测试,尤其是Java和Groovy本身.Gr ...
- Spock测试套件入门
文章目录 Spock测试套件 核心概念 整体认识 前置.后置 同junit的类比 Feature 方法 blocks 典型的用法 异常condition then和expect的区别 cleanup ...
- spock测试框架使用指北
文章目录 一.Spock是什么 二.Spock,Junit,Jmock以及PowerMock区别 三.Spock项目引用配置 1. POM版本依赖 2. 新建测试用例 3. 执行单元测试 四.Spoc ...
- 测试nginx网站代码_在40行以下代码中使用NGINX进行A / B测试
测试nginx网站代码 by Nitish Phanse 由Nitish Phanse 在40行以下代码中使用NGINX进行A / B测试 (A/B testing with NGINX in und ...
最新文章
- tomcat 深度优化
- 【云炬大学生创业基础笔记】第1章第4节 为什么需要创业测试
- Tomcat 的 DefaultServlet
- 【Data Cluster】真机环境下MySQL数据库集群搭建
- 我对应聘者的面试原则
- 解决ray报错AttributeError: module ‘aioredis‘ has no attribute ‘create_redis_pool‘
- 华为Mate 50系列明年亮相:或首发高通骁龙898 4G芯片
- 项目管理经验的获取 .
- PDF免费压缩、在线压缩
- 研究生论文阅读方法论—怎样查找综述型文章
- 数据库系统知识点总结与英文课件翻译
- 广告竞价-广义第二出价
- 【Python】 -- from module import * 、from module import function 与 import module
- 一键安装java程序_一键配置java环境工具
- 计算机系统u盘判断,如何在电脑上检测U盘是否是缩水盘
- 结合近半年的谷歌算法更新,总结电子商务网站的推广
- 最新互联网地图资质办理-2021测绘资质新规
- 新概念2 课文和单词(4)
- Android GMS Checklist【Android gms认证自检表】
- vue.js 我在看别人的vue项目的时候,路由配置的path 路径 里面为什么有hidden:true/false
热门文章
- 2017西安交大ACM小学期 神器插座 KMP匹配
- Hadoop生态Flume(三)拦截器(Interceptor)介绍与使用(1)
- 最通俗易懂的乐观锁与悲观锁原理及实现
- vue中如何在地图中标点…
- 20级四班班级管理规章制度
- 法兰克服务器电源维修,发那科FANUC系统控制电源简介
- 范式 第一 第二 第三范式
- kotlin能用嵌入式linux,Kotlin在项目中的应用和踩过的坑
- jedis对redis键加锁+解锁+事务提交
- apache.camel_Apache Camel 3.1 –更多骆驼核心优化(第2部分)