关于JUnit5 你必须知道的(一) JUnit5架构和环境搭建

由于工作中都是使用maven来构建项目,所以下面有关环境搭建都是使用的maven(IDE使用的idea)

凡是开发对于JUnit这个框架一定都不陌生,JUnit 作为一个单元测试框架已经诞生了数十年。而JUnit 5在JUnit 4发布多年后的2017年也终于发布了。

JUnit 5架构体系

作为最新版本的JUnit框架,JUnit 5相比之前版本的JUnit框架有了较大的突破,添加了许多新特性。
之前的JUnit 框架所有的功能都被打包在一个构件(artifact)中。它被提供给开发者、IDE、构建工具、其他测试框架、其他扩展等使用,不同的使用者,依赖的都是一个同样的jar包。

而JUnit 5 最重要的一大优化就是其架构体系,它由三个不同子项目的几个不同模块组成。

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

JUnit Platform 其主要作用是在 JVM 上启动测试框架。它定义了一个抽象的 TestEngine API 来定义运行在平台上的测试框架,同时还支持通过命令行、Gradle 和 Maven 来运行平台。通过 JUnit Platform,其他的自动化测试引擎或开发人员自己定制的引擎都可以接入 Junit 实现对接和执行

JUnit Jupiter 包含了 JUnit 5 最新的编程模型和扩展机制; Jupiter 本身也是一个基于 Junit Platform 的引擎实现。

JUnit Vintage 兼容JUnit3,JUnit4 版本的测试引擎

再来看下JUnit 5的架构图
在这里插入图片描述
我们来进一步看看各个子项目的作用。

第一层 : 开发人员(这里只进行业务开发撰写单元测试) 使用junit-jupiter-api等测试框架api编写单元测试

第二层 : 测试引擎,JUnit 或其他测试框架实现引擎API的框架,jupiter-engine和 vintage-engine分别是junit 4和junit 5 对测试引擎API的实现,其他的测试框架也可以通过实现引擎API从而接入JUnit 平台

第三层: 平台引擎 junit-platform-engine 是上一层各种引擎实现的抽象,即引擎的接口标准。

第四层: 启动器 通过ServiceLoader发现测试引擎的实现并安排其执行。 它为IDE和构建工具提供了API,因此IDE可以与测试执行交互,例如,通过启动单个测试并显示其结果。

JUnit 5的环境搭建

再来说下使用中最需要注意的环境搭建吧

Intellij IDEA 从 2016.2 开始就对 JUnit 5提供了基本的支持。如果你使用的是IDEA 2019及以上的版本,那么就放心使用吧。我使用的就是2019.2.3 完全OK !

前面说过JUnit还支持通过使用命令行、Gradle 和 Maven 来运行平台。如果你的项目是使用maven构建的,那么你就需要使用 Maven Surefire 插件来运行你的JUnit 测试平台。

如果你只是需要在IDE运行你的测试用例,那么你只要使用junit-jupiter对应的pom即可,不需要引入junit-platform等测试引擎相关的依赖。

如果想在maven下运行Junit5的测试用例,那么你就需要junit-jupiter-api,junit-jupiter-engine以及junit-platform-launcher,以及maven surefire插件,如下所示:

 <build>
        <plugins>
            <plugin>
                <!--注意如果使用的surefire plugin是2.22.2以下的版本,那么请也引入junit-platform-surefire-provider-->
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
               <!-- <dependencies>
                    <dependency>
                        <groupId>org.junit</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>1.1.0</version>
                    </dependency>
                </dependencies>-->
            </plugin>

        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.6.1</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <dependencies>
        <!--因为使用了参数化测试,所以我引入了params-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 不需要单独引入junit-platform-engine,junit-jupiter-engine已经帮我们引入了-->
        <dependency>
            <groupId> org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

需要注意的有两点:
1.maven surefire插件的版本
2.使用junit-bom来统一管理Junit5各子项目的版本,其好处就不用我多说了。

如果你想要同时在JUnit 5的平台上使用Junit 4和Junit 3的单元测试,就可以移除junit 低版本的依赖,改为如下pom

        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <scope>test</scope>
        </dependency>
JUnit 5 API 生命周期

JUnit 5提供了很多新特性,相对的也会有大量新的API。在开发过程中大家是不是都遇到过升级完版本之后,发现以前使用的API突然就不支持了。JUnit 5 团队为了解决这个问题,明确各个API的使用范围,对所有的API 设立了生命周期。主要分为以下五种状态

内部 API(internal)
不允许被 JUnit 开发者之外的任何人使用。这部分 API 可能被移除,并且不会事先通知。

已过时(Deprecated)
不应该再被使用的 API,它们可能在下次小版本发布时被移除。

实验阶段(Experimental)
为一些新的、实验阶段的特性所使用的 API,这些新特性可能会或已经被公开使用并接受反馈中。
可以使用,但要谨慎。这些 API 未来可能被提升至 维护中 或 稳定 级别,但也可能不带提前通知就被移除。

维护中(Maintained)
使用该 API 的特性,至少在该大版本的下一个小版本发布时不会发生向后不兼容的改变。如果未来有移除维护中 API 的计划,它会先被打回到 已过时 阶段。

稳定(Stable)
使用该 API 的特性,至少在下个大版本发布之前不会发生向后不兼容的改变。

所有JUnit 对外公开的类都带有一个 @API(status) 注解,其中 status就是上面枚举值中的一个。

参考资料:
「译」JUnit 5 系列:基础入门
Junit5 用户指南

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值