使用Junit参数在更短的时间内编写更好的单元测试

大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们。 而且,大多数人不喜欢在他们从事的项目中编写单元测试。 TDD的人当然处于另一面,但根据我的经验,他们在IT行业中是少数派。

说到我,我和大多数人在一起:-)。 我知道为什么进行单元测试会很好,以及如何提高代码和项目的质量。 我知道您为什么应该投资于它们,但是我对编写单元测试并不满意,这不是让我彻夜难眠的原因。 我更喜欢创建出色的软件并解决复杂的问题,然后编写单元测试。 这就是为什么我一直在寻找可以帮助我获得更多,更好的单元测试的东西,而这方面的工作却少了很多,因为最后您应该在项目中进行单元测试。

Junit Params是可以帮助您以更少的时间编写更好的单元测试的那些事情之一。

您为什么要关心Junit Params?

让我们想象一下,我们有一个简单的类Person,它具有名字和姓氏。 业务要求是,姓氏和名字不能为null或空字符串。

我们可以结束与这一课类似的课

 public class Person { private final String firstName; private final String lastName; public Person(String first, String last) { if (first == null || first.trim().isEmpty() || last == null || last.trim().isEmpty() ) { throw new RuntimeException( "bad input" ); } this .firstName = first; this .lastName = last; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; }  } 

下一步是确保代码按预期工作,并且考虑了所有极端情况。

我们当然希望使用单元测试来涵盖所有可能性,但是如果您考虑一下,我们将有很多重复的代码,在这些代码中,我们会测试所有可能性的名字,然后是姓氏,然后是所有组合,依此类推我们要涵盖所有边缘情况。 在这个简单的类中,我们将在单元测试中得到更多的代码,然后在业务逻辑中得到更多的代码。

让我们看看JUnit Params如何帮助我们。

初始化设定

为了使用Junit Params,您只需像添加其他任何库一样添加依赖项

 <dependency> <groupId>pl.pragmatists</groupId> <artifactId>JUnitParams</artifactId> <version> 1.1 . 1 </version> <scope>test</scope>  </dependency> 

之后,我们可以开始在单元测试中使用JUnit Params

使用JUnit参数进行JUnit测试

现在让我们使用JUnit Params编写一些单元测试。

创建简单的测试类PersonTest并添加@RunWith( JUnitParamsRunner.class

 @RunWith (JUnitParamsRunner. class )  public class PersonTest { .......  } 

现在,我们可以编写简单的单元测试来验证我们的类。 让我们先检查一下是否一切都很好,如果我们将null用作名字

 @Test (expected = RuntimeException. class )  public void fistNameNull() { Person p = new Person( null , "dummyLast" );  } 

关于JUnit Params的伟大之处在于,我们仍然可以编写标准的单元测试,并将其与JUnit Params结合使用。

为了在此单元测试中利用JUnit参数,我只需要添加具有适当值的@Parameters ,然后它将看起来像这样

 @Test (expected = RuntimeException. class )  @Parameters ({ "" , " " , " " , "  " })  public void fistNameParamaters(String param) { Person p = new Person(param, "dummyLast" );  } 

使用此代码,我进行了4个单元测试,以验证代码中的值“”,“”,“”,“”和“”。

这已经显示了JUnit参数是多么有用,因为您只编写了一个单元测试,并且它将针对您参数的所有不同可能性执行该测试。

将参数传递给多个输入参数

如果我们要传递输入值(名字和姓氏)的参数,会发生什么情况。 在这种情况下,我们会做这样的事情

 @Test (expected = RuntimeException. class )  @Parameters ({ " " , "   " , // firstName, lastName " " , "" , "  " , " " , "   " , " " })  public void fistNameLastNameParamaters(String first, String last) { Person p = new Person(first, last);  } 

由于有两个输入参数,因此将提供的值一分为二并用作输入。

如您所见,为多个参数提供输入非常容易,尽管通过这种方式,我们需要提供要测试的所有组合。

以用户友好的方式将参数传递给多个输入参数

如果说老实话,尽管上面的测试对于多个输入参数可以很好地工作,但是它不是非常用户友好的。 让我们在下一个示例中修复该问题

 @Test (expected = RuntimeException. class )  @Parameters ({ " |   " , " |" , "  | " , "   | " })  public void fistNameLastNameParamaters2(String first, String last) { Person p = new Person(first, last);  } 

现在,可以更清楚地知道每次迭代中哪个值将用于哪个输入参数。

使用非字符串值作为输入参数

到目前为止,所有参数都是字符串。 如果我们的输入参数不是String或容易从String转换为String的东西,例如null值,该怎么办。

在这种情况下,我们可以使用命名参数

 @Test (expected = RuntimeException. class )  @Parameters (named = "emptyStrings" )  public void namedParamaters(String first, String last) { Person p = new Person(first, last);  }  @NamedParameters ( "emptyStrings" )  private Object[] emptyStrings() { return new Object[]{ new Object[]{ null , "" }, new Object[]{ "" , null }, new Object[]{ " " , " " }, new Object[]{ "  " , " " } };  } 

参考

这篇文章中提到的代码示例可以在此网址上找到

  • https://github.com/vladimir-dejanovic/junit-params-blog-examples

翻译自: https://www.javacodegeeks.com/2019/02/writing-unit-tests-time-junit-parameters.html

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

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

相关文章

光端机常见五大故障问题及解决方法

光端机&#xff0c;就是光信号传输的终端设备。光端机在安防中的作用&#xff0c;主要还是起到光端机本身的传输作用。光端机的作用是把一些传输距离比较近的信号转换为传输距离相对较远的信号进行传输&#xff0c;主要的作用是增加传输距离和在监控中起到节约成本的作用。光端…

用香港服务器建收费网站,使用香港站群服务器搭建网站的好处有哪些?

香港站群服务器搭建网站的作用&#xff1a;1、香港站群服务器有利于提高网站被搜索引擎收录情况;2、搭建站群能够有效降低网站被封的风险;3、当网站遭受攻击时&#xff0c;可快速通过带有独立IP的网站来查出问题所在&#xff0c;从而有效提高服务器的维护。香港站群服务器搭建站…

分数化简_分数应用题七讲 (一) 图示法解分数应用题

一、今日一讲图示法就是用线段图(或其它图形)把题目中的已知条件和问题表示出来&#xff0c;这样可以把抽象的数量关系具体化&#xff0c;往往可以从图中找到解题的突破口。运用图示法教学应用题&#xff0c;是培养思维能力的有效方法之一。图示法不仅可以形象地、直观地反映分…

E1光端机和2M光端机有什么区别?

光端机&#xff0c;电信非压缩光端机&#xff0c;就是将多个E1&#xff08;一种中继线路的数据传输标准&#xff0c;通常速率为2.048Mbps&#xff0c;此标准为中国和欧洲采用&#xff09;信号变成光信号并传输的设备。E1的定义的就是2048K。 接下来我们就来为大家详细介绍下光端…

javadoc maven_创建Maven源代码和Javadoc工件

javadoc maven许多人都知道Maven源代码和Javadoc工件&#xff0c;但是不知道为什么要创建它们。 我绝对是在这个阵营中–我可以理解为什么人们想要此信息&#xff0c;但是由于需要手动导航Maven存储库&#xff0c;因此获取信息似乎相对效率较低。 然后我被线索棒击中。 这些工…

发送广播_DHCP服务器什么时候发送?为什么request要广播发送?那还不看?

动态主机配置协议&#xff1a;DHCP 用来集中管理、分配IP地址&#xff0c;使网络环境中的主机能够动态获取IP地址、网关地址、DNS服务器地址等信息&#xff1b;DHCP采用客户端服务器模式&#xff0c;端口号&#xff1a;客户端为68(中继模式下67)&#xff0c;服务器端为67版本一…

开关量光端机指示灯说明及常见故障问题处理方法

开关量光端机可以使开关量信号通过光缆在光纤上传输双向控制。全数字光传输通道&#xff0c;确保高质量的信号传输。面板上有电源指示灯、光信号指示灯数据信号指示灯&#xff0c;可以直观的检测电源、光信号、数据信号状态。单向系列开关量光端机是高性能&#xff0c;高可靠性…

为特使建立控制平面的指南-部署权衡

部署控制平面组件 构建并设计了控制平面后&#xff0c;您将需要确切确定如何部署其组件。 在这里&#xff0c;您可以选择将控制平面与数据平面共置一处以集中控制平面。 这里还有一个中间立场&#xff1a;部署与控制平面位于同一位置的某些组件&#xff0c;并使某些组件保持集中…

大牛服务器超时位置模拟失败,大牛模拟定位掉线怎么办 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-07-07在第四期"微分享"活动中,有许多游戏大牛向小智讲述了关于玩游戏的妙招.巧招和绝招,现小智将这些内容推送给大家! 1.如何在3v3中取得好名次?(由"天才的小白"玩家供稿) 打3v3 ...标签&#xff1a;游乐网 游戏攻略发布时间&am…

宋佳乐博客全站正版PHP源码下载丨自助建站源码丨音乐外链源码丨最新图床源码丨官方网站源码丨网页跳转源码丨云相册源码丨打包下载

本套源码共包含了六套网站系统&#xff0c;请在下方看演示站&#xff1a; 一&#xff1a;主页跳转演示地址&#xff1a;http://ssl.songjiale.com&#xff08;无演示图&#xff09; 二&#xff1a;官方网站演示地址&#xff1a;http://ssl.songjiale.com/upload &#xff08;…

丰田pcs可以关闭吗_别只知道开不坏,现在的丰田还有这些厉害绝招!

记得我刚毕业一年多的时候&#xff0c;有个同龄的同事——三金&#xff0c;买了一台丰田的卡罗拉。那是一台上一代的卡罗拉。三金之所以买卡罗拉&#xff0c;就是图它省心省油保养便宜。那一代卡罗拉采用了keen-look设计&#xff0c;算是在年轻化上迈出了半只脚后来大家调侃他“…

模拟光端机与数字光端机的区别详解

模拟光端机采用了 PFM调制技术实时传输图象信号。发射端将模拟视频信号先进行PFM调制后&#xff0c;再进行电-光转换&#xff0c;光信号传到接收端后&#xff0c;进行光电转换&#xff0c;然后进行 PFM解调&#xff0c;恢复出视频信号。数字光端机是一种通过数字电路控制光信号…

css3怎么排除第一个,css怎么排除第一个子元素

css排除第一个子元素的方法&#xff1a;1、通过使用伪类选择器“:not”实现排除&#xff1b;2、通过使用“nth-of-type”或者“nth-child”实现排除&#xff1b;3、通过使用“”或者“~”兄弟选择符实现获取排除第一个之外的子元素。本文操作环境&#xff1a;windows7系统、HTM…

在Gradle中为JPMS构建Java 6-8库

通过提供Java 9 module-info.class来了解如何使用Gradle构建支持JPMS&#xff08; Java平台模块系统 &#xff09;的Java 6-8库。 介绍 如果您需要JPMS本身的介绍&#xff0c;请查看此概述 。 这篇文章主要针对Java库维护者。 任何此类维护者都必须选择要针对的JDK&#xff…

mysql5.7.24怎么打开_mysql-5.7.24-winx64安装教程

5.2 配置环境右击此电脑-->点击属性-->点击高级系统设置-->点击环境变量(N)...-->点击系统变量(S)下面的新建-->1).第一行写MYSQL_HOME第二行写C:\Program Files\mysql-5.7.17-win322).点击系统变量中的path点击新建-->写入%MYSQL_HOME$\bin5.3进入cmd命令行…

如何解决光端机的开关量问题?

光端机开关量问题可以说是光端机的常见问题之一&#xff0c;对监控效果有比较大的影响&#xff0c;那么&#xff0c;我们应该如何解决光端机的开关量问题呢&#xff1f;接下来就由杭州飞畅科技的小编来为大家详细讲解下吧&#xff0c;感兴趣的朋友就一起来了解下&#xff01; …

qq群发信息显示服务器检测到,关于如何突破QQ群发消息屏蔽或限制经验总结

文章导读&#xff1a;本文主要介绍关于如何突破QQ群发消息屏蔽或限制经验总结 &#xff0c;包括&#xff1a;WebQQ发送消息很多人反映说消息收不到啊&#xff0c;发布多久就屏蔽了。其实我还是那句老话。当你短时间在同一个IP段之内发送这么多消息&#xff0c;明眼人都知道你这…

mysql 授权访问_windows开启3306端口并用可视化工具访问远程mysql(授权访问)

开启 MySQL 的远程登陆帐号有两大步&#xff1a;1、确定服务器上的防火墙没有阻止 3306 端口。MySQL 默认的端口是 3306 &#xff0c;需要确定防火墙没有阻止 3306 端口&#xff0c;否则远程是无法通过 3306 端口连接到 MySQL 的。如果您在安装 MySQL 时指定了其他端口&#xf…

微信小程序服务器请求post,微信小程序使用HTTP请求_绕过HTTPS_云函数 request-promise get、post...

request-promise GET 请求1、云函数中> 云函数的console.log();只能在云函数的日志中查看&#xff0c;不会打印到控制台上,以为云函数不是本地// 云函数入口文件const cloud require(wx-server-sdk)//引入request-promise用于做网络请求var rp require(request-promise);c…

什么是电视光端机?电视光端机是怎么分类的?

现如今&#xff0c;随着国内通信网络的发展&#xff0c;电视光端机应用的监控范围也越来越广。在高速公路、银行、电力、电信等的监控领域都要求对视频信号进行远程的传输&#xff0c;目前主要的解决方法是利用光端机将视频信号转化为数字信号通过光纤进行传输。那么&#xff0…