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

单元测试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

单元测试junit参数

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

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

相关文章

Linux CentOS安装zsh插件提示/usr/bin/env: python: No such file or directory。

执行 ./install.py 文件时&#xff0c;提示&#xff1a; /usr/bin/env: python: No such file or directory查看系统已安装的 python 版本&#xff1a; ➜ ~ ls -l /usr/bin | grep python lrwxrwxrwx 1 root root 36 11月 2 18:11 python -> /etc/alternativ…

3l如何使用_慢阻肺患者如何选购呼吸机和制氧机,需要注意哪些?

慢阻肺(COPD)是慢性阻塞性肺疾病的简称&#xff0c;进一步发展为肺心病和呼吸衰竭的常见慢性疾病。与有害气体及有害颗粒的异常炎症反应有关&#xff0c;致残率和病死率很高&#xff0c;全球大约有2.1亿人患有慢阻肺&#xff0c;中国大概约有4000-8000万人。慢阻肺已成为全球范…

apache ignite_通过示例获取Apache Ignite Baseline拓扑

apache ignite点燃基准拓扑或BLT代表群集中的一组服务器节点&#xff0c;这些服务器节点将数据持久存储在磁盘上。 其中&#xff0c;N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员&#xff0c;该集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的…

自定义报错返回_MybatisPlus基础篇学习笔记(五)------自定义sql及分页查询

本章目录自定义sql分页查询1. 自定义sql在dao文件中编写自定义接口&#xff0c;并在方法上使用注解形式注入SQL&#xff0c;如图所示&#xff1a;第一种&#xff1a;第二种① application.yml加入下面配置mybatis-plus:mapper-locations: com/ethan/mapper/*② MemberMapper.ja…

精简jdk包_具有JDK 12精简数字格式的自定义精简数字模式

精简jdk包帖子“ 紧凑数字格式出现在JDK 12中 ”已经成为有关Java subreddit线程的讨论主题 。 在那个线程中表达的与紧凑数字格式表示有关的问题涉及显示的精度数字和显示的紧凑数字模式。 可以通过使用CompactNumberFormat.setMinimumFractionDigits(int)来解决精度数字问题&…

两个数相乘积一定比每个因数都大_人教版五年级数学:因数、倍数与分数的整理与复习...

写在前面的话&#xff1a;因数与倍数和分数基本性质之间存在紧密的联系&#xff0c;可以将之放在一起学习&#xff0c;对分数基本性质的学习有促进作用&#xff0c;分数的基本性质对分数的加法和减法也非常重要&#xff0c;因此可以放在一起学习、复习。【整理与复习】因数与倍…

Linux中在zsh下如何安装autojump

文章目录介绍安装介绍 autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line. Directories must be visited first before they can be jumped to. 关于 autojump 有以下几个…

fork join框架_Java中的Fork / Join框架的简要概述

fork join框架Fork / Join框架是使用并发分治法解决问题的框架。 引入它们是为了补充现有的并发API。 在介绍它们之前&#xff0c;现有的ExecutorService实现是运行异步任务的流行选择&#xff0c;但是当任务同质且独立时&#xff0c;它们会发挥最佳作用。 运行依赖的任务并使用…

3模型大小_Github推荐一个国内牛人开发的超轻量级通用人脸检测模型

Ultra-Light-Fast-Generic-Face-Detector-1MB1MB轻量级通用人脸检测模型作者表示该模型设计是为了边缘计算设备以及低功耗设备&#xff08;如arm&#xff09;设计的实时超轻量级通用人脸检测模型。它可以用于arm等低功耗计算设备&#xff0c;实现实时的通用场景人脸。检测推理同…

macOS如何使用命令启动服务/停止服务/查看服务

文章目录开启服务停止服务查看服务是否启动开启服务 使用命令开启 sshd 服务&#xff1a; $ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist注&#xff1a;成功启动不会有任何输出 停止服务 $ sudo launchctl unload -w /System/Library/LaunchDaemons/s…

如何在用例之间传递值_如何从0搭建自己的自动化测试体系

大家好&#xff0c;我是爱吃面条&#xff0c;今天给大家讲讲如何从0搭建自己的自动化测试体系1. 需求和目标在我开展自动化测试之前&#xff0c;其实该项目以前的测试人员也已经写了很多的接口测试用例&#xff0c;但是大多数用例处于“半瘫痪”状态&#xff0c;在CI上无人维护…

envoy api 网关_为Envoy构建控制平面的指南-特定于域的配置API

envoy api 网关建立您的控制平面交互点和API表面 一旦考虑了哪些组件可能构成控制平面体系结构&#xff08;请参见上一章&#xff09;&#xff0c;您将要确切考虑用户将如何与控制平面进行交互&#xff0c;甚至更重要的是&#xff0c; 用户将是谁&#xff1f; 要回答这个问题&a…

异步非阻塞_细说同步异步、阻塞非阻塞

同步、异步同步、异步分别指的是一种通讯方式&#xff0c;当 cpu 不需要执行线程上下文切换就能完成任务&#xff0c;此时便认为这种通讯方式是同步的&#xff0c;相对的如果存在cpu 上下文切换&#xff0c;这种方式便是异步。这里通过一个去食堂打饭的示例来理解什么是同步、异…

如何将网页部署到maven_如何通过Rultor将Maven工件部署到CloudRepo

如何将网页部署到maven在我以前的文章中 &#xff0c;我描述了如何在Amazon S3中设置私有Maven存储库并通过Rultor进行部署。 如果您熟悉管理Amazon Web Services&#xff08;AWS&#xff09;&#xff0c; S3和AWS Identity and Access Management&#xff08;IAM&#xff09;的…

macOS下如何使用命令启动数据库/停止数据库/重启数据库(MySQL)

文章目录启动数据库手动启动数据库自启动数据库查看数据库服务是否启动重启数据库服务停止数据库服务注意使用 sudo 执行命令会报错&#xff0c;所以不要使用 sudo&#xff1a; sudo mysql.server start . ERROR! The server quit without updating PID file (/usr/local/var/…

table 多行 宽度不一致_layui table 中固定列的行高和table行高不一致

Pipe&lpar;点积叉积的应用POJ1039&rpar;Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9723 Accepted: 2964 Description ...cocos2d-x之CCMotionStreak类&mdash&semi;&mdash&semi;2013-08-25 16在游戏的实现过程中,有时会需要…

java rest框架_比较Java REST文档框架

java rest框架决定在记录REST API时选择哪种Java框架可能很麻烦。 在本博文中&#xff0c;我们将简要比较我们自己使用的REST Web服务的三个文档框架&#xff0c;以及它们如何与Spring框架&#xff08;这是Foreach中最常用的Java框架&#xff09;集成。 这些是RESTful API建模语…

数据库的事务学习

文章目录事务四大特征多事务并发存在的问题事务隔离级别查询数据库的隔离级别设置数据库隔离级别1.事务里面的语句出错时并不会主动回滚&#xff0c;需要用户主动执行回滚指令 2.事务开始后&#xff0c;如果没有主动执行回滚或者提交指令&#xff0c;事务始终在执行中 3.事务执…

注解动态赋值_Java注解是如何玩转的,面试官和我聊了半个小时

作者&#xff1a;wind瑞 来自&#xff1a;JavaQ面试官&#xff1a;自定义的Java注解是如何生效的&#xff1f; 小白&#xff1a;自定义注解后&#xff0c;需要定义这个注解的注解解析及处理器&#xff0c;在这个注解解析及处理器的内部&#xff0c;通过反射使用Class、Method、…

阿里云服务器如何创建快照备份数据

文章目录创建快照快照收费你申请了阿里云服务器&#xff0c;其实就是申请了一个云盘&#xff0c;这个云盘安装了操作系统&#xff0c;你可以远程访问这个系统并使用该系统。我们可以给云盘创建快照&#xff0c;从而达到备份服务器数据的目的。创建快照 快照收费 如果您计划不再…