JUnit 4 vs. JUnit 5

news2024/12/26 19:26:52

背景介绍

JUnit是一个开源的单元测试框架,专为Java编程语言设计。它提供了一种简单的机制,使得开发者可以在编写代码时快速创建和运行测试,从而验证程序的逻辑和功能是否按预期工作。JUnit最初是由Erich Gamma和Kent Beck于1997年创建的,最早目的在于支持测试驱动开发(TDD),并为程序测试提供一个标准化的框架。

JUnit的发展历程与Java语言的演进密切相关。随着Java应用的普及,尤其是在企业级应用和大型软件开发项目中,测试的重要性逐渐被认识到。JUnit因其简洁的使用方式和对测试人员友好的设计,使得测试成为了Java开发过程中不可或缺的一部分。
JUnit 4和JUnit 5是推动Java测试开发的两个重要版本。JUnit 4 自2006年发布以来,成为Java开发者的事实标准,因其简单易用和广泛支持而被广泛采用。JUnit 5于2017年推出,旨在改进并增强JUnit的功能,引入了模块化设计、更多注解和灵活性。

JUnit 4:以其稳定性和成熟的生态系统著称,广泛应用于大量现有项目中。
JUnit 5:引入了新的特性,如标签(@Tag)、动态测试、条件测试以及与现代Java特性的更好集成,增强了测试的表达能力与可扩展性。

优缺点

JUnit 4优缺点:成熟、易于使用、社区支持广泛,但在新功能方面缺乏灵活性。
JUnit 5优缺点:具有强大的新特性,如条件测试和动态测试,然而对于新的开发者来说,学习曲线会更陡峭。

对比

在JUnit 5中,许多注解都有所变化和改进,以增强可读性、灵活性和功能。以下是JUnit 4和JUnit 5之间一些重要注解变化的对比:

重要注解变化对比

JUnit 4JUnit 5说明
@Before@BeforeEach@Before在每个测试方法执行之前运行,JUnit 5使用@BeforeEach替代,语义更清晰。
@After@AfterEach@After在每个测试方法执行之后运行,JUnit 5用@AfterEach替代,提升可读性。
@BeforeClass@BeforeAll@BeforeClass在所有测试方法之前执行一次,JUnit 5使用@BeforeAll替代,需为静态方法。
@AfterClass@AfterAll@AfterClass在所有测试方法之后执行一次,JUnit 5使用@AfterAll替代,需为静态方法。
@Test@Test这个注解保持不变,JUnit 5继续使用@Test来标识测试方法。
@Ignore@Disabled@Ignore用于跳过测试,JUnit 5用@Disabled替代,以提供更直观的语义。
@Nested新增的注解,用于在同一测试类中定义嵌套测试类,方便组织相关的测试用例。
@DisplayName新增注解,允许为测试类和方法定义自定义名称,以提升报告的可读性。
@Tag新增注解,允许为测试分组,便于选择性执行特定标签的测试。
@ParameterizedTest取代JUnit 4的@RunWith(Parameterized.class),提供更简洁的参数化测试支持。
@TestInstance新增注解,用于配置测试实例的生命周期,可选择PER_CLASSPER_METHOD,改变了测试实例的管理方式。

详细描述

  1. @Before vs. @BeforeEach

    • JUnit 4: @Before用于每个测试方法之前执行,但该名称没有明确说明其作用是“每个”(Each)。标记为@Before的方法将在每个测试运行之前被调用,通常用于设置测试环境或初始化测试所需的对象。
    • JUnit 5: @BeforeEach清楚地指出这是针对每个测试方法的处理,提升了可读性。
  2. @After vs. @AfterEach

    • JUnit 4: 与@Before的命名类似,略显模糊。@After标记的方法会在每个测试方法之后调用,通常用于清理资源或重置状态。
    • JUnit 5: @AfterEach同样提高了可读性,明确表示其用途。
  3. @BeforeClass vs. @BeforeAll

    • JUnit 4: @BeforeClass在所有测试之前只执行一次,且该方法必须是静态的。标记为 @BeforeClass的方法在该测试类中的所有测试之前执行一次,适合用于昂贵的初始化过程,如数据库连接。
    • JUnit 5: @BeforeAll与之相同,但提高了语义清晰度,同时要求该方法依旧是静态的。
  4. @AfterClass vs. @AfterAll

    • JUnit 4: @AfterClass在所有测试之后执行一次。@AfterClass标记的方法在所有测试执行完后执行,适合用于资源的清理。
    • JUnit 5: @AfterAll具有相同功能,语义更加明确。
  5. @Ignore vs. @Disabled

    • JUnit 4: @Ignore令人难以理解其目的。此注解用于暂时跳过特定的测试,方便在需要时不执行该测试。
    • JUnit 5: @Disabled使用户一目了然,表明此测试被禁用。
  6. 新增注解

    • @Nested: 这个新特性允许在测试类内部创建子类,从而组织相关的测试案例,尤其在需要组合多个测试场景时非常有用。
    • @DisplayName: 可以为测试类和测试方法指定更具描述性的名称,提高测试报告的可读性。
    • @Tag: 通过标签系统,开发者可以对测试用例进行分组,并选择性地执行特定组的测试。
    • @ParameterizedTest: 这一注解比JUnit 4的参数化测试方式更加简洁灵活,允许开发者轻松定义参数化测试的方法。
    • @TestInstance: 允许开发者更灵活地管理测试实例的生命周期,支持按类或按方法创建实例,方便在测试中共享状态。

执行案例

JUnit 4 与 JUnit 5 混合着使用会出问题,比如会注解混用。

JUnit 4使用示例:

package cn.com.nxg.test.domain;

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test; 
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.*;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApiTest {
    private Map<Integer, Integer> map = new HashMap<>();
    
    @Test
    public void test_Method1() {
    	Integer value = map.get(1);
       log.info("我开始执行测试用例了,value:{}",value);
    }

	// 在每个测试方法之前执行的代码  
    @Before
    public void test_setUp() {
       map.put(1, 10001);
       log.info("测试方法执行前执行" );
    }
}

JUnit 5

package cn.com.nxg.test.domain;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;  
import org.junit.jupiter.api.Test;  
import org.springframework.boot.test.context.SpringBootTest;

import java.util.*;

@Slf4j
@SpringBootTest
public class ApiTest {
    private Map<Integer, Integer> map = new HashMap<>();
    
    @Test
    public void test_Method1() {
    	Integer value = map.get(1);
       log.info("我开始执行测试用例了,value:{}",value);
    }

	// 在每个测试方法之前执行的代码  
    @BeforeEach  
    public void test_setUp() {
       map.put(1, 10001);
       log.info("测试方法执行前执行" );
    }
}

当你混合使用JUnit 4和JUnit 5中方法时,会报错,如:在JUnit 5中使用JUnit 4注解@Before,而测试方法中使用JUnit 5中的注解@Test,这时,就会出现空指针异常。

回顾

1.使用@Before时是在JUnit 4中,使用@BeforeEach是在JUnit 5中的方法。
2.JUnit 4与JUnit 5对应的方法不能混合使用。
2.JUnit 5对注解的变化不仅提高了代码的可读性和可维护性,也加强了功能性,使得开发者在编写测试时能够更加便利和灵活。

附录

JUnit5 与 JUnit4

JUnit 4迁移到JUnit 5

教你认识Java单元测试框架JUnit,JUnit5和JUnit4区别详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

【机器学习】CatBoost 模型实践:回归与分类的全流程解析

一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS&#xff1a;转载自己的文章也算原创吧。 在机器学习领域&#xff0c;CatBoost 是一款强大的梯度提升框架&#xff0c;特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…

游戏引擎学习第25天

Git: https://gitee.com/mrxiao_com/2d_game 今天的计划 总结和复述&#xff1a; 这段时间的工作已经接近尾声&#xff0c;虽然每次编程的时间只有一个小时&#xff0c;但每一天的进展都带来不少收获。尽管看起来似乎花费了很多时间&#xff0c;实际上这些日积月累的时间并未…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

JavaScript实现tab栏切换

JavaScript实现tab栏切换 代码功能概述 这段代码实现了一个简单的选项卡&#xff08;Tab&#xff09;切换功能。它通过操作 HTML 元素的类名&#xff08;class&#xff09;来控制哪些选项卡&#xff08;Tab&#xff09;和对应的内容板块显示&#xff0c;哪些隐藏。基本思路是先…

【天地图】HTML页面实现车辆轨迹、起始点标记和轨迹打点的完整功能

目录 一、功能演示 二、完整代码 三、参考文档 一、功能演示 运行以后完整的效果如下&#xff1a; 点击开始&#xff0c;小车会沿着轨迹进行移动&#xff0c;点击轨迹点会显示经纬度和时间&#xff1a; 二、完整代码 废话不多说&#xff0c;直接给完整代码&#xff0c;替换…

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口&#xff1f;6.2 个人电脑的网关本质是什么&#xff1f; 0. 概念 自治系统&#xff…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…

Matlab搜索路径添加不上

发现无论是右键文件夹添加到路径&#xff0c;还是在“设置路径”中专门添加&#xff0c;我的路径始终添加不上&#xff0c;导致代码运行始终报错&#xff0c;后来将路径中的“”加号去掉后&#xff0c;就添加成功了&#xff0c;经过测试&#xff0c;路径中含有中文也可以添加成…

自由学习记录(28)

C# 中的流&#xff08;Stream&#xff09; 流&#xff08;Stream&#xff09;是用于读取和写入数据的抽象基类。 流表示从数据源读取或向数据源写入数据的矢量过程。 C# 中的流类是从 System.IO.Stream 基类派生的&#xff0c;提供了多种具体实现&#xff0c;每种实现都针对…

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…

使用playwright自动化测试时,npx playwright test --ui打开图形化界面时报错

使用playwright自动化测试时&#xff0c;npx playwright test --ui打开图形化界面时报错 1、错误描述&#xff1a;2、解决办法3、注意符号的转义 1、错误描述&#xff1a; 在运行playwright的自动化测试项目时&#xff0c;使用npm run test无头模式运行正常&#xff0c;但使用…

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…

用html+jq实现元素的拖动效果——js基础积累

用htmljq实现元素的拖动效果 效果图如下&#xff1a; 将【item10】拖动到【item1】前面 直接上代码&#xff1a; html部分 <ul id"sortableList"><li id"item1" class"w1" draggable"true">Item 1</li><li …

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…

React基础知识三 router路由全指南

现在最新版本是Router6和Router5有比较大的变化&#xff0c;Router5和Router4变化不大&#xff0c;本文以Router6的写法为主&#xff0c;也会对比和Router5的不同。比较全面。 安装路由 npm i react-router-dom基本使用 有两种Router&#xff0c;BrowserRouter和HashRouter&…

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…

打造去中心化交易平台:公链交易所开发全解析

公链交易所&#xff08;Public Blockchain Exchange&#xff09;是指基于公有链&#xff08;如以太坊、波场、币安智能链等&#xff09;建立的去中心化交易平台。与传统的中心化交易所&#xff08;CEX&#xff09;不同&#xff0c;公链交易所基于区块链技术实现资产交换的去中心…