参数化测试 junit_使用JUnit 5进行更清洁的参数化测试

参数化测试 junit

参数化单元测试的总体思路是对不同的数据运行相同的测试方法。 在JUnit 4中创建参数化测试远非完美。 现有体系结构存在许多问题:将参数定义为类字段,并需要使用构造函数来创建它们,参数化和非参数化测试不能混合在一个测试类中,并且内置数据源非常有限。 幸运的是,所有这些都在JUnit 5中得到了改进!

注意:作为JUnit 4参数化测试的替代方法,您可以使用JUnitParams库来解决我提到的许多问题(请在此处查看有关JUnitParams的博客文章: http : //blog.codeleak.pl/2013/12/parametrized-junit- tests-with.html )。

如何开始?

要开始在Junit 5中进行参数化测试,您需要向项目中添加所需的依赖项:向项目添加org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}依赖项以使用参数化测试,参数提供程序和转换器。

SUT –被测系统

我创建的所有示例都在测试FizzBu​​zz类:

public class FizzBuzz {private static final int THREE = 3;private static final int FIVE = 5;public String calculate(int number) {if (isDivisibleBy(number, THREE) && isDivisibleBy(number, FIVE)) {return "FizzBuzz";}if (isDivisibleBy(number, THREE)) {return "Fizz";}if (isDivisibleBy(number, FIVE)) {return "Buzz";}return String.valueOf(number);}private static boolean isDivisibleBy(int dividend, int divisor) {return dividend % divisor == 0;}
}

尽管FizzBu​​zz非常简单,但是它也可以用于演示更高级的单元测试技术,例如实现参数化测试。

我在JUnit 5中的第一个参数化测试

要在JUnit 5中创建参数化测试,请使用@org.junit.jupiter.params.ParameterizedTest (而不是@Test )注释测试方法,并提供参数来源:

@ParameterizedTest(name = "{index} => calculate({0})")
@ValueSource(ints = {1, 2, 4, 7, 11, 13, 14})
public void returnsNumberForNumberNotDivisibleByThreeAndFive(int number, TestInfo testInfo) {assertThat(fizzBuzz.calculate(number)).isEqualTo("" + number);
}

注释具有可选的name属性,用于自定义调用显示名称。 可用的模板变量:{index}->当前调用索引(从1开始),{arguments}->完整的,用逗号分隔的参数列表,{0},{1},…->一个单独的参数。

在此示例中, @org.junit.jupiter.params.provider.ValueSource提供对整数文字值数组的访问。 必须在此批注中提供一种输入类型(字符串,实例,长整型或双精度型)。

我还提供了由org.junit.jupiter.api.extension.ParameterResolver解析的其他参数。 请注意,由参数源解析的方法参数需要在参数列表中排在首位。

更多论点来源

@MethodSource

@ParameterizedTest(name = "{index} => calculate({0})")
@MethodSource(names = {"divisibleByThree", "divisibleByThreeButNotFive"})
void returnFizzForNumberDivisibleByThree(int number) {assertThat(fizzBuzz.calculate(number)).isEqualTo("Fizz");
}

@org.junit.jupiter.params.provider.MethodSource引用返回自变量源的方法(1个或更多)。 在此示例中,有两种方法:

private static Stream<Integer> divisibleByThree() {int[] ints = new int[]{18, 21};return Stream.of(3, 6, 9, 12);
}// The returned array will be converted to a Stream
private static String[] divisibleByThreeButNotFive() {return new String[]{"18", "21"};
}

提供参数的方法必须是静态的,不能包含任何参数,并且必须返回Stream,Iterable,Iterator或数组。 您可能会注意到, divisibleByThreeButNotFive()方法返回一个字符串数组。 由于内置了隐式参数转换器,因此可以很好地工作。 当参数源是CSV时(这在下面有更多说明),这确实很有用。 此外,可以使用自定义参数转换器来转换参数。

要解析多个参数,方法源将返回org.junit.jupiter.params.provider.Arguments实例流( org.junit.jupiter.params.provider.ObjectArrayArguments ):

@ParameterizedTest(name = "{index} => calculate({0}) should return {1}")
@MethodSource(names = {"fizzBuzz"})
void fizzBuzz(int number, String expectedResult) {assertThat(fizzBuzz.calculate(number)).isEqualTo(expectedResult);
}private static Stream<Arguments> fizzBuzz() {return Stream.of(ObjectArrayArguments.create(1, "1"),ObjectArrayArguments.create(2, "2"),ObjectArrayArguments.create(3, "Fizz"),ObjectArrayArguments.create(4, "4"),ObjectArrayArguments.create(5, "Buzz"),ObjectArrayArguments.create(6, "Fizz"),ObjectArrayArguments.create(7, "7"),ObjectArrayArguments.create(8, "8"),ObjectArrayArguments.create(9, "Fizz"),ObjectArrayArguments.create(15, "FizzBuzz"));
}

@CsvFileSource

提供参数源的另一种非常有趣的方法是org.junit.jupiter.params.provider.CsvFileSource ,它从类路径中的多个CSV文件之一中提供参数:

@ParameterizedTest(name = "{index} => calculate({0}) should return {1}")
@CsvFileSource(resources = {"/fizzbuzz/fizzbuzz_1.csv", "/fizzbuzz/fizzbuzz_2.csv"}, delimiter = ';')
void fizzBuzzCsv(int number, String expectedResult) {assertThat(fizzBuzz.calculate(number)).isEqualTo(expectedResult);
}

其他论点

  • @EnumSource提供了使用Enum常量的便捷方法。
  • @CsvSource允许您将参数列表表示为以逗号分隔的值
  • @ArgumentsSource可用于指定自定义,可重用的参数提供程序。

享受JUnit 5中的参数化测试!

资源资源

可以在GitHub上找到本文中介绍的所有示例: https : //github.com/kolorobot/unit-testing-demo

查看官方的JUnit 5文档以了解更多信息: http : //junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

翻译自: https://www.javacodegeeks.com/2017/06/cleaner-parameterized-tests-junit-5.html

参数化测试 junit

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

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

相关文章

python人工智能方向第三方库_Python进阶-第三方库管理和虚拟环境

本文为《爬着学Python》系列第十三篇文章。Python能在这几年火起来&#xff0c;靠的不是网上一大片的爬虫和服务器后端知识的应用(本专题就是这样的&#xff0c;这么说真的好吗&#xff1f;不过我们总得认清事实是吧。)&#xff0c;靠的是Python搭上了大数据和人工智能的风。而…

tomcat应用服务器有哪些,手写一个Tomcat应用服务器

mytomcat项目简介自己实现的简易的TomcatTomca实现说明Tomcat&#xff0c;这只3脚猫&#xff0c;大学的时候就认识了&#xff0c;直到现在工作中&#xff0c;也常会和它打交道。这是一只神奇的猫&#xff0c;我们可以通过实现它来深刻了&#xff1b;了解它的实现原理。考虑自己…

不需要软著的安卓应用市场_哪些安卓应用市场上架应用比较简单啊,不需要软著啊?公司开发的 APP 着急上架...

ENNRIaaa&#xff1a;我看华为、360 、应用宝都需要软著kerb15&#xff1a;酷安&#xff1f;yuluo01&#xff1a;推广到位&#xff0c;网站下载都可以一个很冷门的领域&#xff0c;佛教 Appavalon8&#xff1a;我姐夫&#xff0c;佛教文化爱好者&#xff0c;研究佛教相关资料几…

SublimeText如何让代码的关键字高亮显示

如何设置不同语法的关键字高亮显示 假设你编写java代码&#xff0c;希望代码关键字高亮显示&#xff0c;你可以在菜单栏中选择「查看」-「语法」-「java」&#xff0c;勾选java即可&#xff0c;如下图&#xff1a; 当然&#xff0c;你也可以在页面右下角点击打开语法类型列表…

stringbuffer_StringBuffer的存在的含义

stringbuffer当我处理旧代码并在StringBuffer实例上运行时&#xff0c;通常将它们替换为StringBuilder实例。 尽管可以从此更改中获得性能优势&#xff0c;但我经常在我所知不会对性能产生明显影响的地方进行更改。 我认为&#xff0c;除了可能带来性能收益外&#xff0c;还应出…

python find函数实现原理_非常干货:Python 探针实现原理

△点击上方“Python猫”关注 &#xff0c;回复“1”领取电子书剧照 | 《棋魂》原文&#xff1a;https://segmentfault.com/a/1190000004889212大家好&#xff0c;我是猫哥。关于 Python 中探针的运用&#xff0c;我之前写过一篇《由浅入深&#xff1a;Python 中如何实现自动导入…

服务器系统js文件报错,js服务器文件

js服务器文件 内容精选换一换登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设置的帐…

云盘存储 教学反思_wps轻松办公优秀教学设计范文

wps轻松办公优秀教学设计范文&#xff3b;教学目的与要求&#xff3d;1.学会登录“WPS轻办公”2.学会保存、打开“云文档”3.学会把文档以图片的方式分享到“微博”4.通过观察“WPS轻办公”&#xff0c;了解“WPS轻办公”&#xff0c;初步会用“我的圈子”功能。&#xff3b;教…

Adobe PhotoShop(PS) for Mac 快捷键/PS快捷键

文章目录综合类图层视图工具箱综合类 功能说明快捷键打开文件Command O创建文档Command N存储为Web格式Command Option Shift S自由变换Command T切换到最初状态Option Command Z重做Shift Command Z自定义快捷键Option Command Shift K首选项Command K色阶Comman…

spring启动执行_执行器的Spring启动和安全性事件

spring启动执行Spring Boot Actuator提供了审核功能&#xff0c;用于在启用了Spring Security的Spring Boot应用程序中发布和侦听与安全相关的事件。 默认事件是身份验证成功&#xff0c;身份验证失败和访问被拒绝&#xff0c;但是可以使用自定义事件进行扩展。 确保在项目中启…

系统运维包括哪些内容_智能养老系统包括哪些?养老管理系统内容详解

智慧养老成为养老产业新的发展热点&#xff0c;受到了社会各界的关注。智能养老系统利用先进的IT技术手段&#xff0c;开发面向居家养老、社区养老、机构养老的养老系统平台&#xff0c;提供实时、快捷、高效、物联化、智能化的养老服务&#xff0c;并将医疗服务、运营商、服务…

买了服务器之后如何操作系统,买了服务器之后如何操作系统

买了服务器之后如何操作系统 内容精选换一换如果您需要使用毕昇编译器&#xff0c;则需要先在服务端安装毕昇编译器。毕昇编译器基于开源LLVM开发&#xff0c;并进行了优化和改进&#xff0c;同时将flang作为默认的Fortran语言前端编译器&#xff0c;是针对鲲鹏平台的高性能编译…

敏捷中gwt含义_在GWT中序列化/反序列化Json

敏捷中gwt含义JSON和GWT 最近&#xff0c; GWT用户小组中进行了有趣的讨论 &#xff0c;涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止&#xff0c;在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法&#xff1a; gwt-jack…

图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件。其开发团队也是非常活跃&#xff0c;此软件还在不断的发展和更新中&#xff0c;变得越来越强大。目前已经有164个模块&#xff0c;而每一个模块又有很多命令参数。因为gmt是命令行软件&#xf…

超时空机战服务器配置信息错误,超时空机战熔炉篇FAQ教你如何合理的使用熔炉...

在超时空机战这款游戏中&#xff0c;有一处是叫做熔炉的地方&#xff0c;在其中可以分解物品得到其他的物品&#xff0c;可是怎么才能更好的利用熔炉分解物品达到资源合理利用的地步呢&#xff0c;接下来就和小编一起分析一下吧。1.什么是熔炉&#xff0c;熔炉在哪里可以找到?…

ASCII编码/Unicode编码

码位与字符的对照关系表&#xff08;编码字符集&#xff09; ASCII 码表&#xff0c;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码 Unicode 码表&#xff0c;万国码&#xff0c;几乎全球国家的字符都可以表示&#xff0c;也是用来表示…

tdd 单元测试_何时给定在单元测试和TDD中的重要性

tdd 单元测试最近&#xff0c;我一直在写与自动测试有关的更高级的概念&#xff08;主要与Spock有关&#xff09;。 但是&#xff0c;在进行测试培训时&#xff0c;我清楚地看到&#xff0c;通常对特定工具的知识并不是主要问题。 即使使用Spock&#xff0c;也可以编写肿且难以…

java 设计模式_Java设计模式的常见应用场景

一、Java I/O中的设计模式1、适配器模式适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口&#xff0c;从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。通常被用在一个项目需要引用一些开源框架来一起工作时&#xff0c;这些框架的内部都有一些关于…

abaqus实例_使用Python在ABAQUS中创建XYData数据

这篇的正题是要讲一个愚蠢的小故事&#xff0c;无奈之举&#xff0c;恐成笑柄。但是从PythonAbaqus前后处理的角度讲&#xff0c;还是有点意义的&#xff0c;所以才敢拿出来献丑。三年航天器型号研制工作干下来&#xff0c;积累了不少陋习&#xff0c;但内心还是想努力克服的。…

常量和字面量的区别

字面量 是指由字母&#xff0c;数字等构成的字符串或者数值&#xff0c;它只能作为右值出现&#xff0c;所谓右值是指等号右边的值&#xff0c;如&#xff1a;int a123这里的a为左值&#xff0c;123为右值。 常量 常量和变量都属于变量&#xff0c;只不过常量是赋过值后不能…