服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 总结Junit4,Junit5,Jupiter之间的联系

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

2021-09-17 10:21yanggfann Java教程

Jupiter和Junit5之间有什么联系?Jupiter提供了哪些新的测试方法?如何用IDEA和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

?
1
2
3
4
5
6
<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

?
1
2
3
4
5
6
<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

?
1
2
3
4
5
6
<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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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不同时则无法精准的校验。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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,但这种方式不太优雅。

?
1
2
3
4
5
6
7
8
9
10
11
@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也提供了类似的功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@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之间的联系内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45876795/article/details/111059031

延伸 · 阅读

精彩推荐
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16