Java单元测试工具JUnit 5新特性一览

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50662639 Java单元测试工具JUnit 5新特性一览作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/50662639

Java单元测试工具JUnit 5新特性一览

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

JUnit是最流行的开源Java单元测试工具,目前它的稳定版是4.12版。JUnit 4是2005年推出的,它基于Java 5的注释、反射等特性开发,距今已经超过十年了,受目前Java 8以及Lambda表达式等的影响,JUnit团队决定推出JUnit 5版。

目前JUnit 5已经推出了5.0.0 Alpha版,见: https://t.co/Mb12F3WF4A

一、JUnit 5的更新情况

JUnit 5完全使用当前的Java 8重写了所有代码,因此JUnit 5的运行条件是Java 8环境。
JUnit 5允许在断言中使用Lambda表达式,这个特性可以从开源的断言库AssertJ中可以看到。
AssertJ库见: http://joel-costigliola.github.io/assertj/
与JUnit 4不同,JUnit 5不再是单个库,而是模块化结构的集合,整个API分成了:自己的模块、引擎、launcher、针对Gradle和Surefire的集成模块。
JUnit团队还发起了名为Open Test Alliance for the JVM的活动,见: https://github.com/ota4j-team/opentest4j

JUnit 5的测试看上去与JUnit 4相同:同样是创建类,添加测试方法,使用@Test注释。但是,JUnit 5还提供了全新的一套注释集合,而且断言方法从JUnit 4的org.junit.Assert包移到了JUnit 5的org.junit.gen5.api.Assertions包。比如:

import org.junit.gen5.api.Assertions;
import org.junit.gen5.api.Test;
public class Test1 {
  @Test
  public void test()  {
    Assertions.assertEquals(3 * 6, 18);
    Assertions.assertTrue(5 > 4);
  }
}

二、JUnit 5断言

JUnit 5的断言方法与JUnit 4相似,断言类提供了assertTrue、assertEquals、assertNull、assertSame以及相反的断言方法。不同之处在于JUnit 5的断言方法支持Lambda表达式。而且还有一个名为分组断言(Grouped Assertions)的新特性。
分组断言允许执行一组断言,且会一起报告。要记得在JUnit 4中,我们被告诫不要在一个测试中放入多个断言,以避免某些断言没有得到执行。现在,在JUnit 5中使用分组断言就无需再顾虑这个避讳了。
对JUnit 4的另一个改进是断言预期的异常。不再是以前那种把预期的异常类型放入@Test注释,或者是用try-catch包裹代码,JUnit 5使用assertThrows和equalsThrows断言。下面看看断言的例子:

public class Test2 {
  @Test
  public void lambdaExpressions() {
    // lambda expression for condition
    assertTrue(() -> "".isEmpty(), "string should be empty");
    // lambda expression for assertion message
    assertEquals("foo", "foo", () -> "message is lazily evaluated");
  }
  @Test
  public void groupedAssertions() {
    Dimension dim = new Dimension(800, 600);
    assertAll("dimension", 
        () -> assertTrue(dim.getWidth() == 800, "width"),
        () -> assertTrue(dim.getHeight() == 600, "height"));
  }
  @Test
  public void exceptions() {
    // assert exception type
    assertThrows(RuntimeException.class, () -> {
      throw new NullPointerException();
    });
    // assert on the expected exception
    Throwable exception = expectThrows(RuntimeException.class, () -> {
      throw new NullPointerException("should not be null");
    });
    assertEquals("should not be null", exception.getMessage());
  }
}

三、假设、标签和禁止测试

假设、标签和禁止测试是JUnit 4的特性,在JUnit 5中仍然得以保留。不同的是假设中也支持Lambda表达式,假设的思想是如果假设条件没有得到满足,那么跳过测试执行。标签Tags等同于JUnit 4的测试分类的概念,可以对测试类和方法进行分类。JUnit 4禁止测试使用了@Ignore注释,而在JUnit 5中则使用@Disabled注释。

public class Test3 {
  @Test
  @Disabled
  public void disabledTest() {    
    // ...  
  }
  @Test
  @Tag("jenkins")
  public void jenkinsOnly() {
    // ...
  }

  @Test
  public void windowsOnly() {
    Assumptions.assumeTrue(System.getenv("OS").startsWith("Windows"));
    // ...
  }
}

四、扩展模型

JUnit 5提供了一套新的扩展API,取代了以前的@RunWith和@Rule扩展机制。JUnit 4的测试类被限制到仅有一个Runner上,而新的扩展模型则允许一个类或方法keyii注册到多种扩展。

@ExtendWith(MockitoExtension.class)
@ExtendWith(CdiUnitExtension.class)
public class Test4 {
  @Test
  @DisplayName("awesome test")
  void dependencyInjection(TestInfo testInfo) {
    assertEquals("awesome test", testInfo.getDisplayName());
  }
}

JUnit 5内建的扩展还支持方法级的依赖注入。

支持Hamcrest匹配和AssertJ断言库

JUnit 5支持Hamcrest匹配和AssertJ断言库,可以用它们来代替JUnit 5的方法。

public class Test5 {
  @Test
  public void emptyString() {
    // JUnit 5
    org.junit.gen5.api.Assertions.assertTrue("".isEmpty());

    // AssertJ
    org.assertj.core.api.Assertions.assertThat("").isEmpty();

    // Hamcrest
    org.hamcrest.MatcherAssert.assertThat("", isEmptyString());
  }
}

JUnit 5的主页见: https://github.com/junit-team/junit5
有兴趣的朋友可以关注。

目录
相关文章
|
12天前
|
安全 Java API
java安全特性
java安全特性
21 8
|
13天前
|
JavaScript 前端开发 Java
Java 8 新特性详解及应用示例
Java 8 新特性详解及应用示例
|
14天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
20天前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
30 4
|
23天前
|
机器学习/深度学习 人工智能 安全
python和Java的区别以及特性
Python:适合快速开发、易于维护、学习成本低、灵活高效。如果你需要快速上手,写脚本、数据处理、做点机器学习,Python就是你的首选。 Java:适合大型项目、企业级应用,性能要求较高的场景。它类型安全、跨平台能力强,而且有丰富的生态,适合更复杂和规模化的开发。
29 3
|
26天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
52 6
|
1月前
|
安全 Java API
Java 18 概述:新特性一览
Java 18 作为 Java 平台的最新版本,引入了多项令人振奋的新特性和改进,包括模式匹配、记录类型、流库改进、外部函数与内存 API 以及并发处理增强。这些新功能不仅提升了开发者的生产力,还显著增强了 Java 的性能和安全性。本文将详细介绍 Java 18 的主要新特性,并通过代码示例帮助读者更好地理解和应用这些功能。
|
1月前
|
监控 安全 Linux
如何利用Kali Linux进行网站渗透测试:最常用工具详解
如何利用Kali Linux进行网站渗透测试:最常用工具详解
73 6
|
26天前
|
JavaScript 前端开发 Java
通过JUnit5访问Java静态、私有、保护变量和方法
在《通过Gtest访问C++静态、私有、保护变量和方法》一文中介绍了如何通过Gtest访问C++静态、私有、保护变量和方法,本文介绍如何通过Junit5访问Java静态、私有、保护变量和方法。
22 0
|
2月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架