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

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

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

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

  2. idea使用junit测试_在JUnit测试中使用Builder模式

    idea使用junit测试 这并不是要成为技术含量很高的职位. 这篇文章的目的是为您提供一些指导,以使您的JUnit测试生活更加轻松,使您能够在几分钟内编写复杂的测试场景,并获得具有高度可读性的测试. ...

  3. 降维后的高维特征的参数_高维超参数调整简介

    降维后的高维特征的参数 by Thalles Silva 由Thalles Silva 高维超参数调整简介 (An introduction to high-dimensional hyper-par ...

  4. 投影参数_智能投影仪参数如何去看,其实很简单

    我又来给大家安利投影仪了,毕竟用过的都知道有多刺激,但是估计很多人看到参数就头疼了吧?所以话不多说,直接上科普啦 流明亮度 流明怎么算的,家人们就不用详细了解了,只用记住,流明越高画面就越亮!而且我发 ...

  5. python中可选参数_带可选参数的Python函数

    我试图改进Python中的函数.它需要几个参数,其中一些可能会丢失. def some_function (self, a, b, c, d = None, e = None, f = None, g ...

  6. java使用初始化输入参数_使用初始化参数配置java web应用程序

    在编写java web应用程序的时候,我们难免会遇到需要使用参数来初始化应用程序的问题.在这里介绍最简单的三种方式:使用上下文参数进行配置.使用Servlet初始化参数以及使用注释来初始化参数. 这些 ...

  7. javascript编写_如何在JavaScript中使用解构来编写更简洁,功能更强大的代码

    javascript编写 by Ashay Mandwarya ?️?? 由Ashay Mandwarya提供吗? 如何在JavaScript中使用解构来编写更简洁,功能更强大的代码 (How to ...

  8. lstm需要优化的参数_使用PyTorch手写代码从头构建LSTM,更深入的理解其工作原理...

    这是一个造轮子的过程,但是从头构建LSTM能够使我们对体系结构进行更加了解,并将我们的研究带入下一个层次. LSTM单元是递归神经网络深度学习研究领域中最有趣的结构之一:它不仅使模型能够从长序列中学习 ...

  9. 编写junit 测试_使用JUnit和Repeat注​​释编写有效的负载测试

    编写junit 测试 EasyTest最近推出了一组新的注释,可帮助其用户编写有效的测试用例. 进入EasyTest的两个主要注释是: 重复 持续时间 今天,我们将讨论重复标注. 一种新的方法级别注释 ...

最新文章

  1. 《网站运维技术与实践》笔记
  2. Apache2 之虚拟主机设置指南
  3. 你的微信二维码是唯一的吗?【微信二维码的秘密】
  4. 数据结构-顺序栈、链栈
  5. 为什么Python类语法应该不同?
  6. 学成在线网站首页_分享一些好用的网站
  7. CodeForces - 1486C2 Guessing the Greatest (hard version)(二分+交互)
  8. spider-抓取网页内容(Beautiful soup)
  9. TCP/IP详解读书笔记:链路层
  10. Linux之pwd命令
  11. bzoj 3378: [Usaco2004 Open]MooFest 狂欢节(BIT)
  12. IT互联网的一些职位的简称
  13. linux暂停命令 pause_linux操作命令:暂停进程
  14. 3个步骤+1个模型,原来「数据分析」才是「增长黑客」的核心技能!
  15. AE开发之图层渲染20210603
  16. 架构之美【kubernetes、Prometheus、微服务、LVS负载均衡】
  17. osg自定义操作器实现视图缩放
  18. 北大四大“疯人院”到底有多牛?天才、怪才在这儿遍地都是!
  19. ZYNQ之FPGA学习----Vivado软件使用
  20. SS00007.algorithm——|ArithmeticMachine.v07|——|Machine:监督学习算法.v06|

热门文章

  1. 牛客题霸 [容器盛水问题] C++题解/答案
  2. 「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)
  3. YBTOJ洛谷P2387: 魔法森林(LCT)
  4. CF1472(div3):总结
  5. CF1556F-Sports Betting【状压dp,数学期望】
  6. P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】
  7. P5631-最小mex生成树【线段树,并查集】
  8. P2149-[SDOI2009]Elaxia的路线【最短路】
  9. jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】
  10. P5022-旅行【基环树,dfs】