大多数人都知道单元测试的重要性和好处,以及为什么要在进行的项目中使用它们。 而且,大多数人不喜欢在他们从事的项目中编写单元测试。 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参数在更短的时间内编写更好的单元测试相关推荐

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

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

  2. 单元测试 断言值为null_如何通过使用值断言编写更强大的单元测试

    单元测试 断言值为null by Edd Yerburgh 埃德·耶堡(Edd Yerburgh) 如何通过使用值断言编写更强大的单元测试 (How to write more powerful un ...

  3. 如何在六个月或更短的时间内成为DevOps工程师(一)

    [编者的话]本系列文章适用于想向DevOps模型转型的开发人员,或者是受过传统培训,想要了解整个关于DevOps的内容的运维人员,如果不属于以上两者,只是想在职业上寻找变化却不知从何开始的话,也请继续 ...

  4. [译] 如何在六个月或更短的时间内成为 DevOps 工程师,第一部分 :基础

    原文地址:How To Become a DevOps Engineer In Six Months or Less 原文作者:Igor Kantor 译文出自:掘金翻译计划 本文永久链接:githu ...

  5. 将近一半的用户希望能够在两秒内或者更短的时间内打开网站

    据Akamai 及 Gomez.com调查,将近一半的用户希望能够在两秒内或者更短的时间内打开网站,如果页面未能在三秒内完成载入他们就会放弃浏览.79%的网购访客会因为网站太慢而不会回头购物,44%会 ...

  6. 如何在有限的时间内编写完整有效的测试用例?

    在软件测试工作中,有一种直接拿到软件就测试的做法,它已经被大家认为是无效的软件测试,那么怎么分配时间来完成软件测试用例的编写,并且还要在有限的时间里?欢迎大家进行讨论与交流! 分析这个问题,我想先从两 ...

  7. 如何编写更高层次嵌入式C代码?

    如何编写更高层次嵌入式C代码? 1. 简介 2. C语言特性 2.1处处都是陷阱 2.1.1 无心之过 2.1.2 数组下标 2.1.3 容易被忽略的break关键字 2.1.4 意想不到的八进制 2 ...

  8. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok

    lombok 简化代码 我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它. 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能 ...

  9. 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费

    对编写的代码进行单元测试 几年前,我是为我的数据访问代码编写单元测试的那些开发人员之一. 我正在孤立地测试所有内容,我对自己感到非常满意. 老实说,我认为自己做得很好. 哦,男孩,我错了! 这篇博客文 ...

最新文章

  1. 【numpy学习笔记】矩阵操作
  2. Scrum 项目 7.0
  3. java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
  4. c语言中 文件的字符串输入函数是6,【C语言】文件操作及输入输出格式(文件常用的库函数)...
  5. C# -- HttpWebRequest 和 HttpWebResponse 的使用
  6. 游戏笔记本计算机购买,2021大学生买电脑,容易犯的七种错误!游戏本和轻薄本买哪个?...
  7. ajax概述原理,ajax基本原理
  8. Android 生成分享长图并且添加全图水印
  9. 【深度优先搜索】计蒜客:最大蛋糕(最大连通块)
  10. 美通企业日报 | 阿里、腾讯占领公有云市场半壁江山;2018年雅思考生350万人次创新高...
  11. iec104点号_IEC104规约报文说明(104报文解释的较好的文本)
  12. 安卓如何隐藏root
  13. 深度强化学习(二)强化学习算法的分类
  14. 假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母
  15. qq邮箱日历同步服务器,科技教程:qq邮箱客户端怎么使用exchange服务同步日历?...
  16. 23考研——2月份计划
  17. 安利一个梅林380机型可用的插件
  18. QT读写Sqlite数据库的三种方式
  19. php+点击图片跳转网页,怎么在图片上加超链接 点击图片跳转到指定网页
  20. 深夜里学妹竟然问我会不会C?我直接把这篇文章甩她脸上(C Primer Plus 第六版基础整合)

热门文章

  1. 2021牛客暑期多校训练营4 G-Product(组合意义+容斥原理)
  2. ARC107——D - Number of Multisets
  3. 【LCT】城市旅行(luogu 4842/金牌导航 LCT-3)
  4. [XSY] 传统游戏(DP、容斥)
  5. CF732F Tourist Reform(dfs树、边双连通图、tarjan)
  6. Java命令学习系列(二)——Jstack
  7. 为了金秋那沉甸甸的麦穗,我绝不辜负春天
  8. java实现加密电话号码,有具体的加密流程注释
  9. java design按钮_DesignJava 设计模式,讲述 的各种 方便在项目中进行 框架结构 Develop 238万源代码下载- www.pudn.com...
  10. 多边形上点的顺序排序_一种寻找多边形视觉中心的新算法