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}

如果您还没有意识到这是多么短暂和整洁,那么那就给自己喝杯咖啡吧 。 如果您已经很好地了解了,您仍然可以找到一个保险箱,但是请考虑以下几点:

  1. 计算所有值的下划线
  2. 在右侧,我们看到了Groovy Closure。 现在,将其视为具有两个输入的匿名方法。 p为产品,c为计数。 我们不必键入它们。 那只是更多样板代码而已。
  3. 闭包将始终返回计数时间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}

在此参数化测试中,我们看到以下内容:

  1. 测试已参数化,我们在测试签名和where块中。
  2. 有一个输入参数播放器和一个输出参数–对应于期望值。
  3. 测试已进行五次参数设置。 输入参数在左侧,输出在右侧。 当然,也可以有更多的一个,在这个测试中,我们每个只有一个。
  4. @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()

一些要点:

  1. 动态类型的功能是立竿见影的。 可以在rootNode上动态调用该表达式。 无需冗长,复杂的XPath表达式。
  2. “ *”就像通配符。 这将涵盖RugbySummaryCategory和FootballSummaryCategory。
  3. Player *,表示所有Player元素。 所以这里不需要愚蠢的冗长的循环
  4. text()表达式只是提取各个Player元素之间的文本值。 那么为什么现在要列出所有玩家并可以简单地进行操作:players.size()== 4请记住,不需要断言。

假设我们要检查玩家的名字。 好吧,在这种情况下,我们不在乎顺序,因此将列表转换为Set然后进行检查更有意义。 简单。

players as Set = ["Joey Carberry", "Teddy Thomas", "Lionel Messi", Cristiano Ranaldo"] as Set

这会将两个列表都转换为Set,这意味着订单检查消失了,这只是Set的比较。 我们可以利用更多的Groovy优势。 但是美丽是,我们实际上没有必要。
在Groovy类中,所有Java代码也是有效的 。 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具有以下优点:

  1. 强制执行测试结构。 没有更多的随机断言。 断言只能在代码的指定部分中。
  2. 测试代码更具可读性。
  3. 有关失败测试的更多信息
  4. 可以用更少的代码进行模拟和存根
  5. 可以利用大量的Groovy功能使代码不再那么冗长
  6. 非常强大的测试参数设置,可以非常整齐地完成
  7. 一系列功能强大的注释。

通常被遗忘的一点之一是您的项目不必用Groovy编写。 您可以将其全部保留在Java中,并为生产代码使用Java的静态类型,并为测试代码使用Groovy的功能和速度。

在下一次之前,请您自己保重。

翻译自: https://www.javacodegeeks.com/2018/03/testing-code-spock.html

spock测试

spock测试_使用Spock测试您的代码相关推荐

  1. spock测试_将Spock 1.3测试迁移到Spock 2.0

    spock测试 了解Spock 2.0 M1(基于JUnit 5)的期望,如何在Gradle和Maven中迁移到它以及为什么报告发现的问题很重要:). 重要说明 . 我绝对不建议您永久将您的现实项目迁 ...

  2. spock测试_用Spock测试AKKA应用程序

    spock测试 AKKA是基于消息驱动和基于AKKA模型的并发工具包. 尽管AKKA用Scala编写, AKKA可以在任何基于JVM的语言项目中使用. 这篇文章试图填补关于在利用AKKA框架的多语言J ...

  3. 编写junit 测试_编写JUnit测试的另一种方法(Jasmine方法)

    编写junit 测试 最近,我为一个小型个人项目编写了很多Jasmine测试. 我花了一些时间才终于感到正确地完成了测试. 在此之后,当切换回JUnit测试时,我总是很难过. 由于某种原因,JUnit ...

  4. 机器学习中qa测试_机器学习项目测试怎么做?(看实例)

    机器学习交付项目通常包含两部分产物,一部分是机器学习模型,另一部分是机器学习应用系统.机器学习模型是嫁接在应用之上产生价值的.比如:一款预测雷雨天气的APP,它的雷雨预测功能就是由机器学习模型完成的. ...

  5. spock 集成测试_使用Spock Mocks进行Grails 3.3集成测试

    spock 集成测试 在Grails单元测试中,可以轻松使用Grails随附的Spock框架来模拟或存根协作者(例如服务). " 测试"一章对模拟协作者, doWithSpring ...

  6. spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试

    spock 集成测试 了解如何利用Spock 1.2切片传统应用程序的Spring上下文,编写集成测试. 您是否曾经想过,要开始使用一些遗留应用程序,编写一些测试以了解正在发生的事情,并可能收到有关回 ...

  7. 大样品随机双盲测试_训练和测试样品生成

    大样品随机双盲测试 This post aims to explore a step-by-step approach to create a K-Nearest Neighbors Algorith ...

  8. 汽车线束测试软件,Aigtek线束测试仪,汽车线束测试_高精度自动测试_操作简单...

    高颜值的事物仿佛拥有一种魔力,让人想要靠近:而质量,则是另一种磁力超强的特性,它有着永恒的魅力.Aigtek线束测试仪在颜值与质量的道路上一路向前,用精益求精的设计以及对产品严谨的态度征服了每一位消费 ...

  9. idea使用junit测试_在JUnit测试中使用Builder模式

    idea使用junit测试 这并不是要成为技术含量很高的职位. 这篇文章的目的是为您提供一些指导,以使您的JUnit测试生活更加轻松,使您能够在几分钟内编写复杂的测试场景,并获得具有高度可读性的测试. ...

最新文章

  1. 高斯混合模型图像聚类、图像生成、可视化分析实战
  2. 操作系统和Web服务器那点事儿
  3. (69)番外 —— 编写一个简易的反调试引擎
  4. 实用的IDE工具助力你学好Python
  5. 走的走的居然飞起来了……
  6. 记录一次空指针异常(NullPointerException)的断点调试
  7. python3菜鸟教程电商网站开发_python3菜鸟教程笔记
  8. 大话数据结构系列之快速排序算法
  9. 百度地图离线调用(详细教程)
  10. 房屋出租系统(Java实现-命令行练习版)
  11. 社会工程学——基础认知(补充)
  12. pdftomusic pro(音乐谱曲软件) v1.0.4
  13. java 梯形校正_高清投影神器 联想YOGA平板2 Pro评测
  14. 电脑硬盘分区,新电脑只有C盘怎样分区
  15. spark 随机森林 源码解析
  16. Enterprise Library 2.0 -- Exception Handing Applcation Block
  17. 初识MQ和RabbitMQ
  18. 恭贺经纬恒润参股企业“挚途科技”实现L3级自动驾驶重卡商业化落地
  19. 零基础开发 Node.js Addons 插件:参数与返回值处理
  20. 从分手的挽回成功的真实经历

热门文章

  1. 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路
  2. CF1580B Mathematics Curriculum(笛卡尔树、树形dp)
  3. AT2305-[AGC010D]Decrementing【博弈论】
  4. P3343-[ZJOI2015]地震后的幻想乡【dp,数学期望】
  5. P3185-[HNOI2007]分裂游戏【SG函数】
  6. P5290-[十二省联考2019]春节十二响【贪心,堆】
  7. p2762-太空飞行计划问题【网络流,最大权闭合图,最小割】
  8. 【数论】能量采集(P1447)
  9. 这可能是最生动的加密相关科普文章
  10. art-template 入门(二)之安装