使用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,一经查实,立即删除!

相关文章

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中解析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;感兴趣的小伙伴们一定要看完&…

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

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

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…

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

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

sin查找表 matlab,利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

1.使用matlab制作.coe文件查找表的构造构造256点的正余弦表exp(-j*2*pi*(0:255)/256)&#xff0c;分别得到 cos和sin的查找表matlab代码: 求sinfid fopen(sin.txt,a );str1 MEMORY_INITIALIZATION_RADIX10;;str2 MEMORY_INITIALIZATION_VECTOR;fprintf(fid,\t%s\n \t%s\n, s…

php提取pdf首页图片,pdf图片怎么提取

pdf图片的提取方法&#xff1a;首先用极速PDF阅读器打开文档&#xff1b;然后在图片处单击鼠标右键并选择“复制图片”&#xff0c;这时就可以粘贴发送了。本文操作环境&#xff1a;Windows7系统&#xff0c;Microsoft Office PowerPoint2020版本&#xff0c;Dell G3电脑。pdf图…

dlopen linux 实例_Linux静态库和动态库

库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a&#xff1b;利用静态函数库编译成的文件比较大&#xff0c;因为整个 函数库的所有数据都会被整合进目标…

反射setaccessible_advancedday16类加载器,反射

加载配置文件在src目录下创建一个config.properties配置文件&#xff0c;使用类加载器加载配置文件。//创建集合Properties propertiesnew Properties();//获取src目录下&#xff0c;配置文件的流InputStream in ClassLoader.getSystemClassLoader() .getResourceAsStream(…

基于matlab的语音信号,科学网—[转载]【信息技术】【2014.06】【含源码】基于MATLAB的语音信号处理与分析 - 刘春静的博文...

本文为瑞典耶夫勒大学(作者&#xff1a;Nan Wu)的学士论文&#xff0c;共48页。语音传递是人类最重要、最有效、最常用的信息交流方式。语言是人类特有的特征&#xff0c;而人声是常用的工具&#xff0c;也是相互传递信息的重要途径。语音具有较大的信息容量。因此&#xff0c;…

string.intern_使用String.intern()减少内存使用

string.intern时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此&#xff0c;并认为分享最近的一个战争故事会很有趣。 在这种情况下&#xff0c;我们就有机会使用String.intern&#xff08;&#xff09;之类的简单补丁来修补应用程序。 …

微信批量退款php,微信支付退款接口详解

微信支付有2个退款相关的接口&#xff0c;分别是申请退款API和查询退款API&#xff0c;这2个接口在实际微信支付开发中都会用到。其中申请退款API因为安全性&#xff0c;需要使用证书&#xff0c;证书在商户平台后台下载.申请退款接口支持一年以内的订单退款&#xff0c;可以分…

1235813找规律第100个数_人教版一年级下册数学第1-8单元知识点梳理填空,附答案...

参考答案&#xff1a;第一单元 认识图形1、认识平面图形 2、平面图形的拼组用相同的正方形、长方形或三角形可以分别拼成更大的正方形、长方形或三角形。3、认识七巧板 七巧板是由1个正方形、1个平行四边形、5个三角形组成的。第二单元 20以内的退位减法1、十几减几的计算方法(…

pandas整表写入excel指定位置_当Python遇到Excel,一个能打的都没有~

几乎人人都在用Excel&#xff0c;这种极易上手的数据分析工具无处不在&#xff0c;一旦你掌握了窍门&#xff0c;它就变得非常强大。而Python通常被认为更具有挑战性&#xff0c;但能做的事也更多。当Python遇到Excel会发生什么&#xff1f;本文将告诉你&#xff0c;这三项Exce…

无需再忙了:Lambda-S3缩略图,由SLAppForge Sigma钉牢!

如果你还没有注意到了&#xff0c;我最近被唠叨试图开始使用时&#xff0c;我遭遇了陷阱AWSλ-S3正式例子 。 虽然大多数这些愚蠢的错误的指责是对我自己的懒惰&#xff0c;过度自尊和缺乏对细节的关注&#xff0c;我个人觉得&#xff0c;在开始与一家领先的无服务器供应商不应…

sqlyog设置自动补全_Visual Studio Code 最好的功能、插件和设置

Visual Studio Code 是由 Microsoft(微软) 发布的一个免费的&#xff0c;开源的跨平台文本编辑器。他们基于在线编辑 Visual Studio Online (代号为 “Monaco”)&#xff0c;并结合 GitHub 的 Electron 实现的一个跨平台编辑器。他们在为程序员创建一个快速且高效工作环境方面取…