JUnit 5 –下一代JUnit的初步了解

2月初, JUnit 5(又名JUnit Lambda)团队发布了一个alpha版本。 由于JUnit 4是我工具箱中使用最频繁的项目之一,因此我认为值得一看下一个主要版本。

我试用了最新版本,并记下了我在这里发现值得注意的更改。

安装JUnit 5

不用说,一个名为JUnit Lambda的项目需要Java 1.8或更高版本。 如果给出了,那么包括库就很简单了。 可从Sonatype的快照存储库( https://oss.sonatype.org/content/repositories/snapshots/org/junit/ )获取当前Alpha发布通道的最新版本。

可以使用Maven和Gradle消耗工件。 如果您希望手动维护依赖性,那么还有一个可用的zip发行版 ,其中包含编译和运行JUnit 5的所有内容。

在开发时,仅依赖org.junit:junit5-api模块就足够了。

请注意,在指定快照存储库时,应将其配置为从不缓存工件,以便始终使用最新版本。

从JUnit 4减轻负担

据我所知,新版本是对库的完全重写,对旧版本没有任何依赖性。 因此,您可以享受传统的免费测试(至少一段时间;-)。

但是,当然有一条迁移路径可以使两个版本共存,并使您能够在使用JUnit 5编写新测试的同时维护现有的测试代码库。

相同但不同

但是,让我们最后来看一下JUnit 5测试的样子。 乍一看,变化不大。 一个简单的测试课程…

class FirstTests {@Testvoid firstTest() {fail();}
}

…与JUnit 4测试几乎没有区别。

但是,您发现细微的差别了吗? 是的,测试不再需要公开,但是如果您愿意,当然可以。

尽管注释仍用于标识设置和拆除测试环境的方法,但其名称已更改。 @BeforeClass/AfterClass现在是@BeforeAll/AfterAll@Before/After现在是@BeforeEach/AfterEach

使用@Disabled批注仍然可以忽略测试。

@Test与@Test

如您所见,测试仍然使用@Test注释标记。 但是要小心,如果您碰巧在类路径上也有JUnit 4。 JUnit 5带来了自己的@Test批注,因此请确保导入正确的org.junit.gen5.api.Test 。 否则,JUnit 5测试运行程序将找不到您的测试。

需要注意的另一件事是新的@Test注释不提供其他服务。 如果你曾经使用timeoutexpected不时,你将需要更换他们的JUnit 5。

使用JUnit 5运行测试

难怪还没有IDE支持可以运行JUnit 5测试。 因此,我使用ConsoleRunner来执行实验。 以这种方式运行测试还需要三个模块:

  • org.junit:junit5-engine
  • org.junit:junit-launcher
  • org.junit:junit-console

我选择的IDE是Eclipse,为了从那里使用ConsoleRunner运行测试,我不得不手动扩展启动配置的Classpath 。 仅在添加包含已编译测试的test-classes输出文件夹之后,它们才会被拾取。 但是,这种怪异也可能是由于我对Maven的了解不足,或者是由于Eclipse Maven集成中的特殊性。

JUnit 5团队还提供了基本的插件来执行Maven和Gradle构建中的测试。 如果您想尝试一下,请参阅“ 构建支持”一章。

断言

乍一看,断言没有太大变化,只是断言现在位于org.junit.gen5.api.Assertions类中。

但是仔细观察发现, assertThat()已消失,并且不幸的是,它依赖于Hamcrest。 这些方法实际上复制了MatcherAssert提供的API,并将以前的JUnit版本绑定到Hamcrest库。 这种依赖性有时会导致类解析冲突。 特别是与其他库一起使用时,更糟糕的是,它们会自己包含Hamcrest的副本。

另一个更改是新的assertAll()方法,该方法用于对断言进行分组。 例如

assertAll( "names", () -> {assertEquals( "John", person.getFirstName() );assertEquals( "Doe", person.getLastName() );
} );

将报告一个MultipleFailuresError其中包含组中所有失败的断言。

然后,测试执行者有责任以适当的方式显示此故障。 但是,当前的ConsoleRunner实现尚未考虑分组故障,仅报告第一个故障:

Finished:    testNames [junit5:com...GroupAssertionsTest#testNames()]=> Exception: names (1 failure)expected: <John> but was: <Mary>

我的第一个未经过滤的想法是,如果需要对断言进行分组,则可能是将代码分成多个测试的标志。 但是我还没有真正使用分组的断言,并且在某些地方也完全可以使用它们。

测试异常

测试异常已经统一。 要更换expectedExpectedException现在有一个expectThrows断言评估lambda表达式,并验证它抛出指定类型的异常。

例如,

@Test
void testException() {Foo foo = new Foo();Throwable exception = expectThrows( IllegalStateException.class, foo::bar );assertEquals( "some message", exception.getMessage() );
}

…如果调用foo::bar()没有抛出IllegalStateException将失败。 否则,将返回抛出的异常,并且可以对其进行进一步验证。 如果抛出的异常assertThrows() ,则还有一个assertThrows()方法返回void。

再见亚军,规则和ClassRule

JUnit 5不再知道运行器,规则或类规则。 这些部分竞争的概念已由单个一致的扩展模型代替。

可以通过@ExtendWith注释测试类或测试方法来声明性地使用扩展。 例如,希望使用模拟实例初始化某些字段的测试可以使用Mockito扩展,如下所示:

@ExtendWith(MockitoExtension.class)
class MockedTest {@MockPerson person;// ...}

如果您对这个主题感兴趣,请继续关注有关扩展以及如何将现有规则迁移到我计划编写的自定义扩展的单独文章。

测试方法参数

在JUnit 5中,现在允许方法具有参数。 这允许在方法级别注入依赖项。

为了提供参数,所谓的解析器是必需的,它是实现MethodParameterResolver的扩展。 与所有其他扩展一样,要将解析器用于给定的方法或类,则需要使用@ExtendWith进行声明。 还有两个不需要明确声明的内置解析器。 它们提供类型为TestInfoTestReporter参数。

例如:

class MethodParametersTest {@Test// implicitly uses TestInfoParameterResolver to provide testInfovoid testWithBuiltIntParameterResolver( TestInfo testInfo ) {// ...}@Test@ExtendWith( CustomEnvironmentParameterResolver.class )// explicit resolver declared, could also be placed at class levelvoid testWithCustomParameterResolver( CustomEnvironment environment ) {// ...}
}

如果在运行时找不到匹配的参数解析器,则引擎将通过相应的消息使测试失败。

该文档指出,有计划提供其他扩展,其中还包括一个用于动态测试注册的扩展。 有了这个扩展,就有可能进行参数化测试。 考虑到测试方法已经接受了参数,参数化测试似乎也可以在方法级别上使用。

向后兼容

为了缩小差距,直到IDE本地支持JUnit 5为止,有一个JUnit 4 Runner能够执行为JUnit 5编写的测试。使用@RunWith(JUnit5.class)批注来运行测试类和测试套件。

通过该运行器,可以并排运行JUnit 4和5测试类。 在单个测试中混合使用新旧概念当然是超出范围的,例如,将@Rule@ExtendWith等共存。

Mockito和AssertJ等测试实用程序将继续使用新版本,而无需进行更改。 他们通过引发一个异常来与JUnit交互,即使在JUnit 5中,该异常仍然被认为是测试失败:)

JVM开放测试联盟

JUnit Lambda团队还为JVM建立了开放测试联盟 ,其目标是建立一个标准,以促进测试框架,断言库,模拟库,构建工具和IDE之间的交互。

主要目标是提供一个库,该库定义测试框架(例如JUnit,TestNG,Spock等)要使用的一组通用异常,以及断言库。 构建工具和IDE也将受益,因为它们可以依赖相同的类型集,而与测试框架无关。

可以以org.opentest4j库的形式获得实现草案,您可以猜到它是JUnit 5使用的。

外表

我的印象是建立了新版本的基本概念。 诸如@Test,设置和拆卸注释之类的东西,单个扩展模型的概念可能仍将保持其当前形状。

但是许多细节似乎尚未解决,API可能会发生变化,我认为这在开发周期的现阶段是可以理解的。 API的每个部分都标有@API注释 ,以指示其稳定性。

如果这篇文章引起了您的兴趣,并且您可能希望浏览文档以获取更多信息,那么还有很多值得探索的地方,例如:

  • 用于过滤测试执行的标签
  • 嵌套测试以对测试进行分组并表达测试组之间的关系
  • 可扩展的思路进行测试验证规则 (如@Test@BeforeEach不应该在同样的方法进行)
  • 在运行时动态注册测试
  • 注释有助于并行运行测试

第一个里程碑计划于2016年第一季度末发布。 此处提供了此发行版要解决的暂定项目列表。

翻译自: https://www.javacodegeeks.com/2016/02/junit-5-first-look-next-generation-junit.html

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

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

相关文章

Geany——Python配置

Geany是一个很不错的编辑器&#xff0c;操作很简单&#xff0c;这里记录一下Geany的入手设置&#xff08;在下是一个Python程序猿&#xff0c;就以Python为例&#xff09;&#xff1a; 1&#xff1a;新建&#xff1a;选择 下拉菜单中的 main.py &#xff0c;然后就能生成Pyth…

linux权限drwx,linux权限基础知识详解

祥哥今天整理一下Linux系统中的权限到底是什么&#xff1f;什么是775&#xff1f;什么又是777&#xff1f;664又代表了什么&#xff1f;1.查看权限可以使用ls -l命令ls -l我们以root文件夹为例来说明&#xff1a;drwx------.2 root rootd:这个代表是目录&#xff0c;也就是文件…

cargo maven_用于集成测试的Maven Cargo插件

cargo maven在项目生命周期中&#xff0c;非常普遍的需求是设置集成测试。 幸运的是&#xff0c;Maven在默认构建生命周期的以下阶段&#xff08;来自Maven 文档 &#xff09;具有对这一确切方案的内置支持&#xff1a; 集成前测试 &#xff1a; 执行集成测试之前所需的操作。…

linux菜单系统,Linux修改grub菜单

1. 保留上一次 grub 菜单选项1.1 问题每次开机时&#xff0c;大部分 Linux 发行版的 grub 菜单都是定位在首选项位置(即当前系统选项位置)。这就导致如果我们电脑安装了多个系统&#xff0c;那么每次开机进入其他系统都要重新选择 grub 菜单选项。而我们一般都是一段时间固定使…

zookeeper zoo.cfg配置文件

一、zookeeper的配置文件 zoo.cfg 配置文件是我们安装zookeeper的时候复制 重命名出来的文件命令&#xff1a; cp zoo_smaple.cfg zoo.cfgzkServer.sh 获取执行进入zookeeper 查看配置文件cd /myapp/zookeeper/conf执行命令 查看配置文件信息命令&#xff1a;vim zoo.cfg这是…

与Spring和Maven签订合约优先SOAP服务

1.简介 在本教程中&#xff0c;我们将学习使用JAX-WS&#xff0c;Spring和Maven实施合同优先的SOAP服务应用程序。 这是使用合同优先还是代码优先方法的更多设计决定。 在开发基于SOAP的Web服务应用程序时使用应用合同优先的方法最显着的好处是&#xff0c;可以在对合同进行必…

linux 下c内存管理,linux内存管理之malloc

对于内核的内存管理&#xff0c;像kmalloc&#xff0c;vmalloc&#xff0c;kmap&#xff0c;ioremap等比较熟悉。而对用户层的管理机制不是很熟悉&#xff0c;下面就从malloc的实现入手.( 这里不探讨linux系统调用的实现机制. ) ,参考了《深入理解计算机系统》和一些网上的资料…

jqGrid 常用方法

方法名参数返回值说明addJSONDatadatanone使用传来的data数据填充表格。使用方法&#xff1a; var mygrid jQuery(”#”grid_id)[0]; var myjsongrid eval(”(”jsonresponse.responseText”)”); mygrid.addJSONData(myjsongrid); myjsongrid null; jsonresponse null;addR…

新生必会的linux命令,jstat命令详解

导读Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”&#xff0c;它位于java的bin目录下&#xff0c;主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控&#xff0c;包括了对Heap size和垃圾回收状况的监控…

基于jsf的项目_JSF基于事件的交流:新派方法

基于jsf的项目在上一篇文章中 &#xff0c;我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它们的缺点&#xff0c;我想展示基于事件的通信的更有效方法。 我们将从Google Guava EventBus开始&#xff0c;最后以CDI &#xff08;Java EE平台的上…

linux 天文软件,新闻|开源新闻速递:天文软件 Stellarium 0.15.0 发布

今日关注Stellarium 0.15.0 发布。这是一款全世界最棒的免费、开源、跨平台的天文软件应用&#xff0c;用户可以通过该软件来观看实时的星星、行星还有星云。最新版本进行了非常多的功能完善&#xff0c;修复了若干bug&#xff0c;新增了许多新特性。比如更新了AstroCalc工具&a…

linux javaweb环境单价,linux(centos)下Java Web环境开发

一、安装jdk百度搜索jdk&#xff0c;进入http://www.oracle.com/technetwork/java/javase/downloads/index.html找到自己需要版本的jdk的Linux压缩包&#xff1b;复制出这个压缩包的下载地址(尽量先点击下载&#xff0c;然后在下载的界面复制出资源的链接)在服务器的合适位置创…

带有Java Util日志记录的Java 8延迟调用

在博客文章“在Log4j2中更好地执行非日志记录器调用”中 &#xff0c;我介绍了可以在Log4j 2中使用的方法&#xff0c;这些方法可以减少或避免在基于指定日志级别实际上根本未记录的日志语句中调用方法。 作为讨论的一部分&#xff0c;我介绍了Log4j 2对使用lambda表达式的基于…

python对象分类

1 python对象分类 所有的Python对象都拥有三个特性&#xff1a;身份&#xff0c;类型和值 身份&#xff1a; 每一个对象都有一个唯一的身份标识自己。任何对象的身份可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址类型&#xff1a; 对象的类型决定了对象可以…

怎样用u盘linux安装ntp协议,电脑中怎么配置NTP服务

NTP服务器是用来使计算机时间同步化的一种协议&#xff0c;可提供高精准度的时间校正&#xff0c;而且能通过加密确认来防止恶毒的协议攻击。下面让学习啦小编为大家介绍如何在电脑中配置NTP服务来实现局域网内设备的时间同步。电脑中怎么配置NTP服务1、先关闭Windows系统自带的…

SetGID 权限

一、SetGID针对文件的作用 1、只有可执行的二进制程序才能设置SGID权限 2、命令执行者要对该程序拥有 x &#xff08;执行&#xff09;权限 3、命令执行在执行程序的时候&#xff0c;组身份升级为该程序的属组 4、SetGID权限同样只在该程序执行过程中有效&#xff0c;也就是说组…

nosql的数据服务_使用NoSQL实现实体服务–第2部分:合同优先

nosql的数据服务现在该开始使用NoSQL项目对SOA实体服务进行编码了&#xff0c;并且正如我所承诺的&#xff0c;我将从Web服务的合同开始。 看一下本系列的第1部分 。 这种从Web服务合同定义开始的技术是面向服务的体系结构实现的“合同优先”方法的核心&#xff0c;并具有许多技…

weblogic双机热备部署linux,WebLogic应用在集群环境下的一些基本知识【转载】

4.2.1 基本概念1&#xff0e;硬件的cluster和WebLogic的cluster不是一回事&#xff0c;硬件做的是冷备份&#xff0c;对用户的session&#xff0c;用户请求的负载均衡等的处理是做不到 的&#xff0c;而且一般硬件的双机热备也不是时时的备份&#xff0c;而是间隔一段时间再将主…

vmware中centos6.4突然无法进入图形界面解决方法

今天遇到vmvare中centos6.4进度条走完了仍然没有进入图形界面&#xff0c;在网上找到了解决方法记录如下&#xff1a; 1. 按CtrlAltF5并输入root账号密码进入命令界面 2. vim /etc/inittab 打开/etc/inittab文件&#xff0c;并将文件最后id:5改为id:3&#xff0c;即将运行等级…

教程:正确的SLF4J日志记录用法以及如何检查它

SLF4J是一个非常流行的日志记录外观&#xff0c;但是&#xff0c;就像我们使用的所有库一样&#xff0c;我们有可能以错误的方式或至少以非最佳方式使用它。 在本教程中&#xff0c;我们将列出常见的日志记录错误以及如何使用FindBugs检测到它们。 我们还将在相关时提及PMD和S…