使用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优势。 但是美丽是,我们实际上没有必要。
所有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具有以下优点:

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

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

直到下一次照顾自己。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

i18n php_PHP国际化多语言的实现(非I18N)

PHP开发网站、系统会遇到需要支持多种语言的情况&#xff0c;这时候我们就需要国际化。一般都是推荐使用I18N&#xff0c;而使用I18N我们需要下载相应软件编辑PO文件&#xff0c;然后还要PHP的gettext扩展&#xff0c;有点小烦。下面介绍一种除了I18N以外&#xff0c;最常用的P…

php删除文见,php如何删除文件夹

php删除文件夹的方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后通过“function deldir($dir) {...}”删除目录下的文件并删除当前文件夹即可。php删除文件夹及其文件夹下所有文件function deldir($dir) {//先删除目录下的文件&#xff1a;$dhopendir($dir);while ($…

阿帕奇齿轮泵

Apache Gearpump是实时大数据流引擎。 它从2014年中期开始就在Intel上作为GitHub上的开源项目构想的&#xff0c;并于2016年3月8日进入Apache孵化。Gearpump的名称是对工程术语“齿轮泵”的指称&#xff0c;它是一个超级简单的泵&#xff0c;由只有两个齿轮&#xff0c;但是在流…

php网站标签加小图标,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...

如图在黑色所画圆之中显示一个图标&#xff1a;步骤一&#xff1a;在图片中显示图标&#xff0c;这里的图片只支持ico格式&#xff0c;需要转换图片格式.原始图像可以接受: .jpg .jpeg .gif .png等图像格式在这个网址http://www.php.cn/上传你的原始图片然后生成ico格式图标(百…

java bom json,JSON字符串带BOM头ufeff

调用三方接口返回值JSON字符串带BOM头"\ufeff"&#xff0c;JSON解析死活报错。我是用SpringBoot的RestTemplate调用三方接口的&#xff0c;一开始返回值我是用对象接收返回值&#xff0c;发现一直报错&#xff0c;我以为是RestTemplate的接收转换有问题&#xff0c;就…

hadoop 多节点集群_设置Apache Hadoop多节点集群

hadoop 多节点集群我们正在分享有关在基于Linux的机器&#xff08;多节点&#xff09;上安装Apache Hadoop的经验。 在这里&#xff0c;我们还将分享我们在各种故障排除方面的经验&#xff0c;并在将来进行更新。 用户创建和其他配置步骤– 我们首先在每个集群中添加一个专用的…

php 获取当前目录名称,PHP获取当前执行php文件名的代码

今天写表白墙时候的导航判断遇到的这个问题。我的解决思路是这样&#xff1a;判断当前的php文件名来确定导航条的哪块高亮。那php如何获取当前的url文件名呢&#xff1f;我是这样处理的 :shock:教程首先肯定是要获取当前页面URL的&#xff0c;在这里我们使用php的$_SERVER[PHP_…

在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例

使用Jackson API在Java中解析JSON时的常见问题之一是&#xff0c;当您的JSON包含未知属性&#xff08;即您的Java类没有对应于所有JSON属性的所有字段&#xff09;时&#xff0c;该操作将失败。 例如&#xff0c;如果您正在使用REST Web服务中的JSON&#xff0c;并且明天他们在…

php界面设置编码格式,php设置编码格式的方法

php设置编码格式的方法发布时间&#xff1a;2020-08-15 11:02:56来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;小新这篇文章主要介绍php设置编码格式的方法&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要看完&…

php文件显示不完整,github文件显示不全

github仓库里面有的文件显示不全&#xff0c;具体看这里&#xff0c;在编辑文件时就能看到全部内容看了stackoverflow上类似的问题&#xff1a;Full file not displaying on GitHub?&#xff0c;然后又看了Dealing with line endings&#xff0c;还是没有解决。望解答&#xf…

单元测试 问题描述_单元测试技巧:创建描述性测试

单元测试 问题描述您的单元测试应尽可能具有描述性。 他们给您的反馈应该非常清楚&#xff0c;您甚至不必启动调试器&#xff0c;并一步一步地检查代码以检查局部变量。 为什么&#xff1f; 因为那需要时间&#xff0c;而且我们很懒&#xff0c;对吗&#xff1f; 为此&#xff…

java ftp获取文件夹大小,java 用FTPClient 下载文件时不显示总大小?解决方案

java 用FTPClient 下载文件时不显示总大小&#xff1f;FTPClient ftp new FTPClient();ftp.setControlEncoding("utf-8");OutputStream outputStream null;try {int reply;// 连接FTP服务器// 如果采用默认端口&#xff0c;可以使用ftp.connect(url)的方式直接连接…

php中数组生成下拉选项,php利用数组填充下拉列表框

这篇文章主要介绍了php使用数组填充下拉列表框的方法,涉及php操作数组的技巧,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了php使用数组填充下拉列表框的方法。具体实现方法如下&#xff1a;<?php $data array((object)array("titulo">"For…

同时使用传入和传出连接时,相互TLS身份验证存在Java问题

在大多数企业环境中&#xff0c;在应用程序之间的连接中使用某种形式的安全通信&#xff08;例如TLS或SSL&#xff09;。 在某些环境中&#xff0c; 相互&#xff08;双向&#xff09;身份验证也是一项非功能性要求。 有时将其称为双向SSL或双向TLS身份验证。 因此&#xff0c;…

matlab小波脊线,小波脊线提取,模极大值法。运行的结果不太对,代码有些地方我也没完全看懂...

本帖最后由 1393107100 于 2019-5-1 11:10 编辑clear,clcclose all%%%%%% 小波变换 %%%%%%%%%%%%%%%%fs1024;t1/fs:1/fs:1;f1100;f2200;f3300;scos(2*pi*f1*t.*(t>0&t<0.3))2*cos(2*pi*f2*t.*(t>0.3&t<0.8))3*sin(2*pi*f3*t.*(t>0.8&t<1));%sc…

php json追加500错误,在composer.json中添加了一个git地址;composer update 报错

在composer.json中添加了一个git地址&#xff1b;composer update 报错&#xff0c;不知道是什么原因导致的&#xff0c;如图&#xff1a;问题补充&#xff1a;在BAE包里面添加composer.json 后 重新composer updateYour requirements could not be resolved to an installable…

java 解析gson_使用Java和Google GSON解析ESPN API

java 解析gson在我的第一篇文章中&#xff0c;我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。 首先&#xff0c;您需要请求一个API密钥&#xff0c;然后您可以开始查询REST API以检索JSON响应。 在下面的示例中&#xff0c;我将简单查询在英…

matlab曲线拟合 最低点,Matlab曲线拟合 最小二乘法 polyfit【转】

曲线拟合已知离散点上的数据集 &#xff0c;即已知在点集 上的函数值 &#xff0c;构造一个解析函数(其图形为一曲线)使 在原离散点 上尽可能接近给定的值&#xff0c;这一过程称为曲线拟合。最常用的曲线拟合方法是最小二乘法&#xff0c;该方法是寻找函数 使得 最小。MATLAB函…

多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a;1.层次聚类hierarchical clustering2.k-means聚类这里用最简单的实例说明以下层次聚类原理和应用发法。层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、cluster等…

如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 &#xff08;一个开放源代码日志记录库&#xff09;&#xff0c;但无法找到所需的JAR文件&#xff0c;例如slf4j-api-1.7.2.jar因此它是在线程“ main” java.lang.NoClassDefFoundError&#xff1a; org/s…