在Java中给出的时间

tl; dr,您可以使用标签来阐明给定的测试时间样式。

什么时候给出?

给定的时间,然后是一种指定系统行为的常用样式,其中您的测试分为三个部分。

  • 给定的部分列出了测试的前提条件,即在开始之前假设世界所处的任何状态。
  • When子句执行要测试的动作。
  • 然后,Then语句检查后置条件是否成立。 通常以声明值或检查与模拟的交互的形式。

并非总是这种情况,您需要在每个测试的代码中包含三个部分。 例如,您的给定部分可能被通用的setUp方法覆盖。 我认为遵循模式并拆分不同的部分是一个好主意,因为它使您可以从树木中清晰地看到木材。

在Junit中使用标签

在某些项目中,我一直在尝试进一步扩展工作,而不仅仅是将给定/何时/然后拆分并使用Java标签,以便对测试的不同部分进行布局以使事情变得更加清晰* 。 以下代码段显示了如何使用Junit来实现。

Cafe cafe = new Cafe();@Testpublic void cafeShouldNeverServeCoffeeItDoesntHave() {Given:cafe.setCoffeesRemaining(1);When:cafe.serveCoffee();Then:assertFalse(cafe.canServeCoffee());}

这是一个非常简单的示例,仅用于演示布局。 我们的测试检查了Cafe提供了从未提供过的咖啡。 标签清楚地划分了代码的三个部分。 看到这样使用标签是有点不寻常的-它们在Java中最常用,是一种一次性突破嵌套循环的方法。 当然,没有真正的理由不这样使用它们,这只是一个样式问题,带有标签和不带有标签的代码之间没有语义差异。

将标签与Lambda行为配合使用

我确定大多数Java开发人员都在使用Junit,但我最近发布了一个名为Lambda Behave的新库。 它被设计为Java 8的现代测试和行为规范框架,使编写流畅和易读的测试变得更加容易。 在lambda-behave中,您通过列出描述性字符串而不是限制性方法名来编写测试,并在lambda表达式中描述测试的主体。 我发现以这种风格编写的测试更容易阅读。

您可以在lambda-behave规范中使用相同的给定/何时/然后标签样式,如以下代码示例所示:

describe("a cafe", it -> {Cafe cafe = new Cafe();it.should("never serve coffee it doesn't have", expect -> {Given:cafe.setCoffeesRemaining(1);When:cafe.serveCoffee();Then:expect.that(cafe.canServeCoffee()).is(false);});});

局限性与替代方案

以这种方式使用标签的最大麻烦在于,由于我不知道的原因,您不能在Java中的变量声明语句之前编写标签。 这意味着,如果要使用新变量启动Given:子句,则需要将变量声明提升到块顶部或a字段中。 我还没有发现这是个大问题,实际上吊装机可以进一步清理东西。

另一种可能也是更常见的方法是使用注释来表示给定/何时/然后子句。 我认为两者之间的选择主要是文体而非实质。 在这两种情况下,您都只是编写一些说明性文字,而不是像Cucumber和JBehave这样将功能烘焙到测试框架中。 我认为,如果您已在团队中达成约定,并且希望使这些标签比常规注释更突出,则将标签用作单个注释的想法比较合适。

有些人在给定/何时/然后使用相似的替代模式,但是具有更多阶段,例如四阶段测试方法,甚至使用不同的名称,例如Arrange,Act,Assert 。 这些样式也可以使用基于标签或基于注释的约定。

结论

如果有人想在其IDE中进行外观或玩耍,我会将示例代码放在github上 。 没有太多的代码,因为它们只是非常简单的示例,但是显示没有魔术可能会有所帮助!

在本博客文章中,我已经展示了如何使用标签来阐明代码块的意图,希望这是人们发现有用和有用的一种技术。 无论您是否使用标签来实现给定时间,我都希望人们遵循某种约定编写测试。 这确实使事情变得更加清晰。 我确定有人对此事有意见,所以让我知道您认为这是个好主意吗?

*我/认为/我在一次LJC活动上与他交谈后从Jose Llarena那里得到了这个主意,所以谢谢Jose!

翻译自: https://www.javacodegeeks.com/2015/01/given-when-then-in-java.html

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

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

相关文章

Vue.js环境搭建

简述小弟刚刚开始写博客,学习VueJs也不久,开这个博客,只是为了多多学习和记录自己的 学习之旅,可能很多地方都很浅薄,还望各位海涵和多多拍砖。 学习Vue也有两个多月了,接触它是在一个很偶然的机会。当初是…

【Python】Python中对目录路径的要求

Python中使用的目录路径一定不能以"\"结尾,否则会报未知符号错误 另外Python中的编码不支持VisBuild的output窗口,在python开头处定义了UTF-8输出,然后在下面调用了某个字符串的decode(UTF8),始终会在VisBuild的output里…

我如何想成为Java

我喜欢Java。 我喜欢用Java编程。 但是在使用Python一段时间后,我希望对其进行一些更改。 它几乎纯粹是语法上的,因此可能有更好的JVM语言,但是我并不真正感兴趣,因为我仍然需要使用普通的Java来工作。 我意识到这些更改将不会实施…

9.1定时器 小时分秒

功能:用切换图片0-9效果显示当前系统时间 属性:img的src 1.用到 new Date() getHours(),getMinutes(),getSeconds() getFullyear(),getMouth() 1月数需要加1,getDay()星期为0,1,2,3,4,5&am…

浏览器中的JavaFX

浏览器中的JavaFX屏幕截图 最近,Carl Dea和我启动了一个新项目,将JavaFX 8引入浏览器。 今天,我想介绍我们创建的前两个概念验证,以查看该想法是否完全可行。 对于不耐烦的人,这里是到PoC的链接。 但请注意&#xff0…

如何用代码对repeating section控件新增Item(InfoPath)

在做项目的时候,有一个场景,当用户切换不同选项时(radio button),repeating section会随着切换而变换两种状态1:删除所有item. 2.新增而且只新增一个item. 对于删除比较容易,但对于从没有任何一个item状态下&#xff0…

MDB!= JMS,反之亦然

基本 消息驱动Bean(又称为MDB)只是另一个EJB,如无状态,有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 ,因为它们都是由EJB容器池化的 但是,它们与无状态EJB不同…

4.1邮箱的全选,全不选,反选

事件&#xff1a;onclick 属性&#xff1a;checked 对于分清getElementsByTagName(元素名)里的元素名&#xff0c; 可以先提取其外面一层的元素&#xff0c;再在此基础上用getElementsByTagName(元素名) 用到for语句&#xff0c;if语句&#xff0c;length <!DOCTYPE ht…

调了 好几天的问题 treeview 的js 处理复选框之间的关系,选中子框父框自动选中,单独执行 没问题 放到框架页里 就有问题...

刚开始的js 这么写的 function OnTreeNodeChecked() {var ele event.srcElement;if (ele.type checkbox) {var childrenDivID ele.id.replace(CheckBox, Nodes);var div document.getElementById(childrenDivID);if (div ! null) {var checkBoxs div.getElementsByTagName…

1.2鼠标移入移出改变背景色和其他大小样式

功能&#xff1a;鼠标移入div,背景色变为绿色&#xff0c;宽变小&#xff0c;长变大&#xff0c;移出恢复原状 事件&#xff1a;onmouseover,onmouseout 属性&#xff1a; background,width,height <!DOCTYPE html><html><head><meta charset"utf…

JDK 9 –给圣诞老人的信?

众所周知&#xff0c;冬天&#xff08;尤其是圣诞节前的时间&#xff09;是做梦的合适时机&#xff0c;希望有一个梦想似乎可以触摸的时刻。 当孩子们和大人在纸上或在对圣诞老人的虚构或真实信件中写下自己的梦想的那一刻&#xff0c;希望他们的梦想将成为现实。 这很引人注目…

周三的工作 张孝祖

今天的任务是主面板master嘿嘿 上头有几个按钮&#xff0c;登录登出&#xff0c;个人信息&#xff0c;注册注销等&#xff0c;他们是根据用户是否等率决定的 具体代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System…

H5本地存储

在以前&#xff0c;我们想要存储一些数据&#xff0c;并且只是在前端使用&#xff0c;服务端并不会使用&#xff0c;我们只能存在cookie里&#xff0c;但是cookie会跟随请求头在客户端和服务端之间来回传递&#xff0c;而且cookie还有一些缺点&#xff0c;H5提供了webStorage的…

在哪里可以运行EJB?

EJB不仅为Java EE应用服务器而建。 他们还可以执行在的Java EE Web Profile的容器或简单的Java SE环境&#xff08;Java SE的啊- &#xff01;E&#xff01;ASY 的J ava 乙是指合同&#xff09;。 EJB Lite 仅支持完整的EJB规范提供的功能的子集所必需的-相同功能的轻量级版本…

sql查询结果字段名与字段值倒过来了

数据库为sybase, sql如下&#xff1a; 1 select substring(LRRJG,1,7) as SSQJ, 2 sum(case when RWDL_BH 01 then 1 else 0 end) AS A, 3 sum(case when RWDL_BH 01 and XBHSJG ! null then 1 else 0 end) AS B 4 from ZYH_DBRW_LRNSRRW 5 where LR_DBRW_ID ! null and DR …

Promise实战AJAX封装

一、利用Promise的知识&#xff0c;对最开始的ajax的例子进行一个简单的封装&#xff1a; var url xxx; // 封装一个get请求的方法 function request(url){return new Promise(function(resolve,reject){var XHR new XMLHttpRequest();XHR.open(GET,url,true);XHR.send();XHR…

重新设计Hamcrest

我在Hamcrest库上做了几篇文章 &#xff0c;我确实很喜欢使用它&#xff0c;但是我希望对其进行一些更改。 我了解他们做出的大多数设计决策&#xff0c;但我认为其中一些确实不值得。 介绍Litecrest 我对库所做的大多数更改都有助于减轻Hamcrest的负担&#xff0c;因为我觉得…

CSS 垂直居中

1、使用绝对定位垂直居中 绝对对位原理&#xff1a;元素在过度受限情况下&#xff0c;将margin设置为auto&#xff0c;浏览器会重算margin的值&#xff0c;过度受限指的是同时设置top/bottom与height或者left/right与width。 .absolute_center{/*display:none;*/position:absol…

Java EE拦截器

历史 我认为重要的是要看一下Java EE中的Interceptor的发展&#xff0c;因为它是从EJB特定的项目开始的&#xff0c;后来又演变成一个单独的规范&#xff0c;现在可供其他Java EE规范扩展&#xff0c;这一事实很简单。 版本1.0 拦截器最初是在EJB 3.0 &#xff08; Java EE 5的…

New Begin

已经研究生三年级了&#xff0c; 最近也找好了工作&#xff0c;应该要开始自己的程序人生了。 虽然说写程序也写了很一段时间了&#xff0c; 决定现在开始在cnblogs这个&#xff0c;记录下自己的学习轨迹。开始维护自己的blogs。转载于:https://www.cnblogs.com/binzeehale/ar…