Java基础学习总结(101)——Junit5抢鲜看

来源:互联网 发布:南宁智尚网络骗局 编辑:程序博客网 时间:2024/05/24 04:56

JUnit 4的发布背1. Java 8支持景现状

Mr.JUnit 4.0 发布于2006年2月,来看看当时社区的反映:

Great!This is the best message I seen recently.

Me too. I think JUnit is one of most successful OpenSource Projects. Thank you Mr.JUnit.

如今11年过去了,Junit伴随着很多Java程序员的成长,11年间陆续发布了13个小版本,最后版本落版于4.12。JUnit 憋大招

Junit 4.12

2013年底的一份调查统计了GitHub 3万个工程,显示JUnit在Java工程中占比30.7%:

JUnit 憋大招

Junit 

这11年间Mr.JUnit建立自己的生态圈,TDD曾风靡一时,如令JUnit更是一统江湖。

在当时发布之时,也受到诸多天时的制约:

  • Java 5发布1年多,很多公司还在使用JDK1.4。

  • Spring 初出茅庐,还没有拿到Jolt和JAX大奖。

  • Maven 方面仅仅是2.0Beta阶段。

JUnit 4也一直没有很好的解决扩展问题,它所提供扩展就是'将就'出来的!。Runner和Rules是扩展JUnit的主要手段,前者虽然强大,但是粒度太粗,扩展者需要从零实现全测试周期的支持,并且一个单元测试类只能绑定一个Runner,无法同时使用多个Runner。Rules虽然解决了粒度的问题,但扩展能力非常有限,只能作用于测试周期的特定阶段。

而如令,新技术、新的编程理念日新月异:

  • Java 8 (2014年3月)发布已经整整过去3年。

  • Spring 已经进入Boot & Cloud时代。

  • Maven 都3.5了。

相对于其它的递进速度,从2015年10月开始的JUnit 5大版本节奏还是稍稍缓了点,目前JUnit 5.0.0-M4发布于4月2号,JUnit 5最终版本估计在第三季度发布。


JUnit 5 的定位

JUnit 5作为JUnit的下一代测试框架,其目标是为JVM上的开发人员创建一个与时俱进的测试框架。聚焦于Java 8,并且支持多种不同的测试风格。打开JUnit 5 的文档,你会发现有一个显著的字眼:JUnit as a Platform,这意味着什么?一种JVM上面的测试平台,通过引入JUnit Platform,JUnit 5不但可以运行老板本的JUnit测试,甚至还可以运行其它的测试框架,这儿祭出其架构视图:

JUnit 憋大招

从上图可以看完,完整的JUnit 5平台自顶向下共分为四层:

  • 面向Developer的API层,比如各种测试注解。

  • 特定于某一单元测试框架的测试引擎。

  • 通用的测度平台引擎。

  • 面向开发工具/构建工具执行入口。

上面两层体现的是JUnit as a Tool,还属于JUnit原本的范畴,而下面两层体现的就是JUnit as a Platform。

JUnit 5也应此释放了憋了快10年的大招,此招一出,谁与争锋?


JUnit 5 特性尝鲜

  1. Java 8支持

    说到Java 8 就不得不说Lambda,那么JUnit Lambda 如何?

JUnit 憋大招

Junit Lambda

对于assertLambda测试失败时描述:

JUnit 憋大招

Test Failures

使用Lambda进行联合检查,并获得了所有的值。并不像Junit4中一旦失败,你只能从测试报告中获取失败的第一个值,而永远也不会知道其它值。同时对测试用例断言的编写方式更是更上一楼层。一种更好的组织方式。

还有应该你已经注意到了:没有public!

2. Nested(嵌套)测试

常常对于用例的管理,需要根据其特性进行分组管理,JUnit 5提出的@Nested,正是适合此场景。

JUnit 憋大招

Junit Nested

是的,你将看到如下的执行结果:

JUnit 憋大招

可以将某一特性的测试分组归类,你问在Nested中能不能进行更深一级的嵌套?答案是肯定!一切如你期望的那样,这也正是我们期望的结果。

JUnit 憋大招

正如你所见的:@DisplayName,给用例起个好点的名字,一个名字影响的可是一生!

3. Extention(扩展)性更强

JUnit 4只扩展的局限性前面已经提到,JUnit 5已经在这方面做了很大的改动,借用JUnit Lambda中的一句话:“好的扩展方式优于已经实现的特性”。

所有的JUnit注解可以被当做元注解去使用,Jupiter Engine可以很好的识别并处理。

JUnit 憋大招

Annotation

如果只是这样,那么仅仅也只是简化了书写或者冠以别名,当然了不可能,还有更强大的@ExtendWith,它涉及到测试周期的各个阶段,比如激活条件,参数解析,回调函数,异常处理等。通过实现特定接口,配合@ExtendWith注解,你很容易就可以重新定义一个单元测试的执行流程。

配合ExtendWith的请参考:MockitoExtension和SpringExtension。

还有很多变动等着你去探索,不妨去GitHub或JUnit 5 User Guide 溜一圈。

重要的事情说三边!Mr.JUnit 5憋的大招将在今年第三季度发布!

Are you Ready ?

1 0
原创粉丝点击