总结Junit4,Junit5,Jupiter之间的联系

Junit5

目前Java领域内最为流行的单元测试框架 ------ JUnit

Junit的最新版本JUnit5于2017年发布。

Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage

Junit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。

Junit Jupiter: Junit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit Platform上运行。

Junit Vintage: 由于JUnit已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。

Dependency

Junit4

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

当前dependency会引入junit:4.12和hamcrest-core:1.3的包

Junit vintage engine

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>5.6.2</version>
        <scope>test</scope>
    </dependency>

当前dependency会引入unit:4.13, apiguardian-api:1.1.0, hamcrest-core:1.3, junit-platform-commons:1.6.2,
junit-platform-engine:1.6.2, junit-vintage-engine:5.6.2, opentest4j:1.2.0的包

Jupiter

 <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.6.2</version>
        <scope>test</scope>
    </dependency>

当前dependency会引入apiguardian-api:1.1.0, junit-Jupiter-api:5.6.2, junit-platform-commons:1.6.2, opentest4j:1.2.0的包

Junit4和Junit5的注解区别

Junit5 Junit4 说明
@Test @Test 被注解的方法是一个测试方法。与 JUnit 4 相同。
@BeforeAll @BeforeClass 被注解的(静态)方法将在当前类中的所有 @Test 方法前执行一次。
@BeforeEach @Before 被注解的方法将在当前类中的每个 @Test 方法前执行。
@AfterEach @After 被注解的方法将在当前类中的每个 @Test 方法后执行。
@AfterAll @AfterClass 被注解的(静态)方法将在当前类中的所有 @Test 方法后执行一次。
@Disabled @Ignore 被注解的方法不会执行(将被跳过),但会报告为已执行

Junit4中的@Test是import org.junit.Test;

Jupiter中的@Test是import org.junit.jupiter.api.Test;

断言

在Junit4和Junit5中均有标准断言

断言方法 说明
assertEquals(expected, actual) 如果 expected 不等于 actual ,则断言失败。
assertFalse(booleanExpression) 如果 booleanExpression 不是 false ,则断言失败。
assertNull(actual) 如果 actual 不是 null ,则断言失败。
assertNotNull(actual) 如果 actual 是 null ,则断言失败。
assertTrue(booleanExpression) 如果 booleanExpression 不是 true ,则断言失败。

Junit4中任何断言失败,测试就会在该位置失败,意味着不会执行任何其他断言。例如StudentTest中的should_test_every_test。

    @Test
    public void should_test_every_test() {
        //given when
        int expected = 6;
        int actual = 10 - 4;
        Object nullValue = null;

        //then
        assertEquals(expected, actual);
        assertFalse(true);
        assertNull(nullValue);
        assertTrue(false);
    }

如果希望所有 断言都会执行,即使一个或多个断言失败也是如此,该怎么做呢?

可以使用Jupiter中提供的aseertAll方法

    @Test
    @DisplayName("test assertAll")
    void should_test_every_test() {
        //given when
        int expected = 4;
        int actual = 2 + 2;
        Object nullValue = null;

        //then
        assertAll(
                "Assert All of these",
                () -> assertEquals(expected, actual),
                () -> assertFalse(nullValue == null),
                () -> assertNull(nullValue),
                () -> assertNotNull("Hello Word!"),
                () -> assertTrue(nullValue != null));
    }

@DisplayName

可以在类和方法中添加@DisplayName注释。这个名称在生成报告时使用,这使得描述测试的目的和追踪失败更容易

运行单元测试后,点击如下位置则可生成html报告

Student生成的单元测试报告为Test Results - StudentTest.html

StudentJupiterTest生成的单元测试报告为Test Results - StudentJupiterTest.html

校验异常

Junit4提供了@Test(expected = Exception.class)的方式来校验异常,但这种方式的缺点是,当两个不同的业务抛出相同的业务异常,
而仅仅message不同时则无法精准的校验。

    @Test(expected = BusinessException.class)
    public void should_throw_business_exception_when_student_name_length_more_than_10() {
        //given when
        StudentCommand.builder()
                      .name(RandomStringUtils.randomAlphanumeric(11))
                      .build();
    }

    @Test(expected = BusinessException.class)
    public void should_throw_business_exception_when_student_description_length_more_than_20() {
        //given when
        StudentCommand.builder()
                .name(RandomStringUtils.randomAlphanumeric(9))
                .description(RandomStringUtils.randomAlphanumeric(21))
                .build();
    }

当然也可以通过捕获异常的方式,再判断message,但这种方式不太优雅。

    @Test
    public void should_validate_message_when_student_name_length_more_than_10() {
        //given when
        try {
            StudentCommand.builder()
                          .name(RandomStringUtils.randomAlphanumeric(11))
                          .build();
        } catch (BusinessException e) {
            assertEquals(e.getMessage(), "The length of student name exceed 10 chars.");
        }
    }

Jupiter提供了新的校验方式,Assertions.assertThrows,在Junit的4.13的版本中,Asserts.assertThrows也提供了类似的功能

    @Test
    @DisplayName("It tests the length of student name should less than 10 chars")
    void should_throw_business_exception_when_student_name_length_more_than_10() {
        //given when
        BusinessException businessException = Assertions.assertThrows(BusinessException.class, this::buildStudentName);

        //then
        assertEquals(businessException.getMessage(), "The length of student name exceed 10 chars.");
    }

    private void buildStudentName() {
        StudentCommand.builder()
                .name(RandomStringUtils.randomAlphanumeric(11))
                .build();
    }

    @Test
    @DisplayName("It tests the length of student description should less than 20 chars")
    void should_throw_business_exception_when_student_description_length_more_than_20() {
        //given when
        BusinessException businessException = Assertions.assertThrows(BusinessException.class, this::buildStudentDescription);

        //then
        assertEquals(businessException.getMessage(), "The length of student name exceed 20 chars.");
    }

    private void buildStudentDescription() {
        StudentCommand.builder()
                .description(RandomStringUtils.randomAlphanumeric(21))
                .build();
    }

到此这篇关于总结Junit4,Junit5,Jupiter之间的联系的文章就介绍到这了,更多相关Junit4,Junit5,Jupiter之间的联系内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • junit4教程junit4.5官方下载

    官方下载地址http://sourceforge.net/project/showfiles.php?group_id=15278&package_id=12472JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写. 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据.元数据是什么?元数据就是描述数据的数据.也就是说,这个东西在Java里面可以用来和public.static等关键字一样来修饰类名.方法名.变

  • Spring+Junit4进行接口测试实例代码

    本文研究的主要是Spring+Junit4进行接口测试的一个相关实例,具体实现代码如下. 1.配置pom.xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.2.RELEASE</version> </dependency> <depende

  • 浅谈junit4单元测试高级用法

    Junit单元测试框架是Java程序开发必备的测试利器,现在最常用的就是Junit4了,在Junit4中所有的测试用例都使用了注解的形式,这比Junit3更加灵活与方便.之前在公司的关于单元测试的培训课程中,讲师仅仅讲述了Junit4的基本的与生命周期相关的注解的使用,主要包括@BeforeClass.@Before.@Test.@After.@AfterClass这些注解,这些在应付普通简单的单元测试已经足够,然而有很多更加复杂且也会经常遇到的测试需求依靠这些生命周期注解并不能完成!因此这篇分

  • JUnit4 Hamcrest匹配器常用方法总结

    一.Hamcrest是什么? Hamcrest is a library of matchers, which can be combined in to create flexible expressions of intent in tests. Hamcrest 是一个为了测试为目的,且能组合成灵活表达式的匹配器类库. 二.Hamcrest jar包 hamcrest-core.jar -- This is the core API to be used by third-party fr

  • IDEA手动添加junit4时出现的问题与解决方法

    当我写@Test注解时,一直报错 后来百度是缺少junit4的包 手动添加junit4包 具体查看是在左上角 file–>project structure 点击进来以后选择modules,再点击当前的项目JDBC,就可以看到当前模块的一些依赖库,此时是没有导入junit4的. 此时点击右边加号,点击2.library,再点击Java,选择IDEA安装目录,在lib文件夹中找到junit-4.12 然后应用,此时@Test注解不再报错,但是运行时出现错误 查询官网: 查官网: JUnit now

  • 总结Junit4,Junit5,Jupiter之间的联系

    Junit5 目前Java领域内最为流行的单元测试框架 ------ JUnit Junit的最新版本JUnit5于2017年发布. Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage Junit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入. Junit Jupiter: Junit Jupiter提供了JUnit5的新的编程模型,是JUn

  • Springboot集成JUnit5优雅进行单元测试的示例

    为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余. JUnit5易扩展,包容性强,可以接入其他的测试引擎. 功能更强大提供了新的断言机制.参数化测试.重复性测试等新功能. ps:开发人员为什么还要测试,单测写这么规范有必要吗?其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有

  • JUnit5相关内容简介

    著名的Java单元测试框架Junit 4已经出来很长时间了,当时我发现JUnit 5已经处于测试版,就准备写文章来介绍JUnit 5.不过因为还是测试版,所以有些地方还不太完善,我也有点懒没有好好写.这几天突然想起这事了,在到官网上查看,发现就在9月10日,JUnit 5的正式版终于出来了!那么我就正好把文章重新好好写写,为大家介绍这个最新的JUnit框架. 框架结构 和JUnit 4相比,JUnit 5的结构非常清晰,为自定义插件.IDE测试执行等扩展功能做了很好的支持.这一点从项目结构就可以

  • 详解IDEA JUnit5测试套件运行错误的问题

    1.问题 在Idea 2017.3中,建立JUnit5的测试用例Test Case,同时建立JUnit4的测试套件,运行测试套件时提示出错"java.lang.Exception: No runnable methods". 2.分析 Java进行单元测试时,一般会建立多个测试用例Test Case,或者多个测试类(每个测试类包括多个测试用例),但如果需要同时运行这些测试用例,一般在JUnit4中会采用测试套件,通过运行测试套件,在套件中一次运行多个测试用例类. 参考解答: 能够使用J

  • 快速上手Java单元测试框架JUnit5

    为什么学JUnit5 Java技术栈的单元测试框架有两个:JUnit和TestNG,有种说法是TestNG比JUnit更强大,学TestNG就够了,但是当我打开GitHub看到star的时候,犹豫了: JUnit TestNG 相差了足足有3K之多.带着这个困惑,我在网上查阅了一番资料,原来JUnit5相较于JUnit4有了重大升级,已经包含了TestNG的所有功能.为了坚定我学JUnit的想法,我咨询了身边做Java开发的朋友,开发写UT都是用的JUnit.这两个理由足以让我开始对JUnit5

  • spring boot org.junit.jupiter.api不存在的解决

    目录 org.junit.jupiter.api不存在 解决方案 新建Springboot项目默认test包下的测试类报错缺少org.junit.jupiter.api 报错如下 原因分析 解决方案 org.junit.jupiter.api不存在 解决方案 spring boot2.2之后和之前的测试类编写方法不一致 修改为: // A code block import org.junit.Test;import org.junit.runner.RunWith; import org.sp

  • SpringBoot+JUnit5+MockMvc+Mockito单元测试的实现

    目录 版本 项目结构 EchoServiceImpl EchoControllerNoMockitoTest EchoControllerMockTest 今天聊聊如何在 SpringBoot 中集成 Junit5.MockMvc.Mocktio.Junit5 是在 Java 栈中应用最广的测试框架,Junit4 一度霸榜. 升级到 Junit5 之后,除了增加 Java8 的很多特性,做了很多功能增强,在结构上做了优化调整,拆分了很多不同的模块,可以按需引入,比如: JUnit Platfor

  • 如何在Maven项目中运行JUnit5测试用例实现

    本文演示了如何如何编写JUnit 5测试用例,在Maven项目中运行JUnit 5测试用例. 编写JUnit 5测试用例 如果你是Java开发者,那么对于JUnit应该就不陌生.JUnit是Java单元测试的基础工具. JUnit目前最新的版本是JUnit 5.x,但广大的Java开发者估计还停留在JUnit 4.x,因此有必要演示下如何编写JUnit 5测试用例. 引入JUnit 5依赖 相比较JUnit 4而言,JUnit 5一个比较大的改变是JUnit 5拥有与JUnit 4不同的全新的A

  • JUnit5常用注解的使用

    目录 20个注解 元注解和组合注解 小结 参考资料: 注解(Annotations)是JUnit的标志性技术,本文就来对它的20个注解,以及元注解和组合注解进行学习. 20个注解 在org.junit.jupiter.api包中定义了这些注解,它们分别是: @Test 测试方法,可以直接运行. @ParameterizedTest 参数化测试,比如: @ParameterizedTest @ValueSource(strings = { "racecar", "radar&q

  • 详解JUnit5参数化测试的几种方式

    目录 依赖 简单示例 七种方式 参数类型转换 隐式转换 显式转换 参数聚合 自定义显示名字 小结 参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量.用户参数.CSV文件.函数助手,那么JUnit5有哪些参数化测试的方式呢? 依赖 JUnit5需要添加junit-jupiter-params依赖才能使用参数化: <dependency> <groupId>org.junit.jupiter</groupId> <artifact

随机推荐