Junit5生态圈建设的心路历程

在某次关于自主可控的技术交流中,当讨论了国产CPU和操作系统的发展近况时,来自某个国内主要的国产CPU设计单位的专家讲到,他们设计的国产CPU目前已经在超级计算机上得到了较大规模的应用,并且已经能够兼容诸多的Linux操作系统。但是对于发展“通用型”CPU的目标来说,最主要的瓶颈还是在于“生态圈”的建设。从最基础的C/C++编译器,到JAVA虚拟机、数据库等配套基础软件的支持的匮乏,极大地限制了国产CPU在各个金融等各个领域的业务拓展。为此,他们也开始组建所谓的自主可控联盟,联合了操作系统、数据库等厂商,为行业客户提供一张套的自主可控替代方案。
这个故事让笔者想起了一则广告词,“大家好,才是真的好”。做一个项目,实现一个目标,往往不是个人或者自己做好了就够了,需要前后左右各个方面的协同。中间有一环掉链子了,或者支持力度不够了,可能就会影响整个事情的交付结果。
对于自动化测试来说,Junit5的推出已经有好几年了。那么目前整个测试生态圈对Junit5的支持如何呢? 有什么在制约或者妨碍用户从Junit4升级甚至从别的自动化测试框架迁移到Junit5呢?
由此,笔者将在本文中Junit5推出之后,整个测试生态圈的支持情况做一个盘点。
首先,Junit5 不再是一个单一的jar包,而是由三部分组成。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
其中
JUnit平台,其主要作用是在JVM上启动测试框架。它定义了一个抽象的TestEngineAPI来定义运行在平台上的测试框架,同时还支持通过命令行、Gradle和Maven来运行平台。
JUnit Jupiter,包含了JUnit5最新的编程模型和扩展机制。
JUnit Vintage,允许在平台上运行JUnit3和JUnit4的测试用例。
JUnit5对Java运行环境的最低要求是Java8,同时也兼容测试旧版本JDK编译出来的代码。

构建工具的支持

我们首先来看下构建工具的支持情况。

Maven - 姗姗来迟的官方支持

JUnit5在2017年9月10日(教师节)正式发布了其5.0.0GA版本

image.png

通过这篇文章,我们可以了解到,直到2018年10月24日Maven 3.6.0发布,Maven才正式原生支持Junit5。在这个版本中,Maven团队一并发布了 Maven Surefire Plugin 2.22.0 和Maven Failsafe plugin 2.22.0,进而解决了对Junit5的支持问题。
在此之前,为了能在Maven中运行Junit5的测试用例,需要为 Maven Surefire plugin额外提供一个Junit5团队提供的Junit Provider。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
</plugin>

如果将Maven升级到3.6.0及以上版本,那么unit-jupiter-engine这个依赖就不需要了。而这中间差了有快一年的时间。考虑到其实早在2016年Junit5就已经发布了5.0 M1这样一个可用版本,并提供了上述workaround,Maven对于Junit5的支持其实要落后了整整2年。

image.png

当然这样的支持也不是一番风顺的。在Junit5的缺陷清单上,出现过1579号缺陷,并被认为是maven-surefire#193所导致的。
image.png

Gradle-类似的故事

翻看了Gradle的发布历史后,发现Gradle团队在4.6版本的Release Notes中兴奋地宣布了对Junit5的支持。

image.png

这个时间,大概比Maven团队早了有半年,支持力度略微好一点。从Gradle团队热情洋溢的介绍和致谢词中我们也能感受到,为了能让Gradle尽早原生支持Junit5, 后者的团队应该是付出了很多的努力的。

IDE 编码工具的支持--巴铁一般的友谊

再来看一下IDE的支持情况。相对于构建工具来说,IDE的支持要更为提前一些,甚至都做到了同步发布。

IntelliJ IDEA

IntelliJ IDEA 在其2016.2
版本中提供了对Junit 5的支持,时间是在2006年的7月份,几乎是和Junit5 M1版本同一时间。当然作为第一个版本,也是有不少问题的。因此紧跟着Junit5 GA 的发布,在2017年11其2017.3版本中专门进行了优化,还提供了Junit4向Junit5用例的一键迁移功能。

image.png

Eclipse

Eclipse 在 Oxygen.1a (4.7.1a), 也几乎是在Junit5 GA 的同时进行发布,在其官方的发布说明中,Junit5甚至还排在对Java9支持的前面。

image.png

<iframe width="560" height="315" src="https://www.youtube.com/embed/wI3VC1lhbK8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

其余好友

Spring

对于Spring家族来说,之前是通过@RunWith的注解来执行Junit用例的。在Junit5中,不再支持@RunWith的注解了,因此为了能将用例迁移到Junit5,Spring团队利用了@ExtendWith的注解。
迁移前的用例是这样的:

@RunWith(SpringJUnit4ClassRunner.class)
public class GreetingsSpringTest {
    // ...
}

迁移到Junit5的用例是这样的

@ExtendWith(SpringExtension.class)
public class GreetingsSpringTest {
    // ...
}

其中的SpringExtension类是由Spring5中的 Spring TestContext Framework所提供的。具体的需求可以参见 https://jira.spring.io/browse/SPR-13575。而Spring5 GA的时间则在2017年9月28日,在Junit5 GA的同月,也基本上是同步了。

SpringBoot

在SpringBoot中,这一切就更简单了。

@SpringBootTest
public class GreetingsSpringBootTest {
    // ...
}

还是原来的味道,只是需要在pom.xml中修改下配方。

        <!-- exclude junit 4 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- junit 5 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>

这里有一个大家默认不说破的事实,时至今日spring-boot-starter-test的默认Junit框架版本还是Junit4。

Mockito

再来看一下Mock工具对Junit5的支持情况。以Mockito为例,在Junit5推出的初期,Junit团队甚至利用JUnitExtension机制,同样地为Mockito提供了扩展的样例,可以让Junit5用户拥有基本的Mockito功能。
https://github.com/junit-team/junit5-samples/blob/r5.0.0/junit5-mockito-extension/src/main/java/com/example/mockito/MockitoExtension.java
与此同时,就在Mockito2发布的前夕(和Junit5 M1差不多前后),收到了关于对JUnit5支持的需求。
Introduce MockitoExtension for JUnit Jupiter (a.k.a. JUnit 5) #445
https://github.com/mockito/mockito/issues/445
根据Github上各方的留言来看,这个需求直到2018年3月份才在Mockito 3.0和2.x发布。随着Junit5自身的GA和特性的增加,Mockito团队也在不断地为MockitoExtension增加新的功能。

简单总结下

我们以2个IDE、2个构建工具以及1个Mock工具为例,通过回顾这5个和Junit这个测试框架最为密切的工具支持Junit5的心路历程,我们可以总结出以下几点
1)GA只是开始。
2)提早发布M版本(预览版)供上下游配套开发,争取时间,能同步发布。
3)在配套方尚未就绪之前,最好能提供临时解决方案,如JUnit团队为Maven/Gradle提供了插件,为Mockito则提供了扩展的样例。
4)最直接的办法,是出人出代码,帮助配套方尽快完成开发测试。
(参见Gradle团队那封热情洋溢的release notes)


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容