Java学习第十六部分——JUnit框架

目录

一.概述

二.作用

三.版本

四.优势

五.局限性

六.发展方向

七.核心组件

1 测试用例

2.断言(Assertions)

3.测试生命周期

4.测试运行器

八.简单示例

九.JUnit 4 与 JUnit 5 的区别

十.idea项目实战

1.在idea中创建Java项目,注意选择“Maven”

2.将“pom.xml”文件内容替换成下面内容

3.重新加载Maven项目,直到不再报错​

4.按下图创建对应项目和Java类文件

5.两个Java类文件代码内容如下,替换即可

6.运行测试类,结果如下​编辑

7.代码解释如下


一.概述

       JUnit 是一个用于 Java 语言的单元测试框架,它在软件开发中被广泛用于编写和运行可重复的测试代码。

二.作用

       JUnit 主要用于单元测试,即对程序中的最小可测试部分(通常是方法)进行测试。它有如下作用:
- **验证代码的正确性**:通过编写测试用例,确保代码的功能符合预期。
- **提高代码质量**:通过测试发现潜在的错误和漏洞。
- **支持敏捷开发**:在持续集成和持续交付(CI/CD)中,JUnit 测试可以快速反馈代码问题,帮助团队快速迭代。
- **降低维护成本**:当代码修改后,通过运行测试用例可以快速发现是否引入了新的问题。

三.版本

       JUnit 有多个版本,目前最常用的是 JUnit 4 和 JUnit 5:
- **JUnit 4**:广泛使用注解(如`@Test`、`@Before`、`@After`等),是 Java 开发中常用的版本。
- **JUnit 5**:是 JUnit 的最新版本,引入了新的注解和扩展机制,提供了更好的模块化支持和更灵活的测试生命周期管理。

四.优势

- **简单易用**:提供了丰富的注解和断言方法,易于上手。
- **集成性强**:与大多数 Java IDE 和构建工具(如 Maven、Gradle)无缝集成。
- **可扩展性**:支持自定义扩展,可以满足复杂的测试需求。

五.局限性

- **仅支持单元测试**:对于集成测试和端到端测试,需要结合其他工具(如 TestNG 或 Selenium)。
- **学习曲线**:虽然简单,但对于初学者来说,理解测试生命周期和断言机制可能需要一些时间。

六.发展方向

       JUnit 5 是目前的主要发展方向,它将继续优化测试生命周期管理、扩展机制和模块化支持。同时,JUnit 也在不断与其他测试工具和框架(如 Mockito、Spring Test)进行更紧密的集成。并且, JUnit 是 Java 开发中不可或缺的工具之一,通过合理使用 JUnit,可以显著提高代码质量和开发效率。

七.核心组件


1.测试用例

       测试用例是 JUnit 的基本单元,通常是一个 Java 类,继承自`TestCase`(JUnit 3)或使用注解(JUnit 4 和 JUnit 5)。

public class CalculatorTest {
    @Test
    public void testAdd() {
        Calculator calc = new Calculator();
        assertEquals(5, calc.add(2, 3));
    }
}

2.断言(Assertions)

       断言用于验证测试结果是否符合预期。JUnit 提供了多种断言方法:
- `assertEquals(expected, actual)`:验证实际值是否等于预期值。
- `assertTrue(condition)`:验证条件是否为真。
- `assertNotNull(object)`:验证对象是否不为`null`。
- `assertThrows`(JUnit 5):验证是否抛出了预期的异常。

3.测试生命周期

       JUnit 提供了测试生命周期的注解,用于在测试前后执行特定的代码:
- **JUnit 4**
  - `@Before`:在每个测试方法之前执行。
  - `@After`:在每个测试方法之后执行。
  - `@BeforeClass`:在所有测试方法之前执行一次。
  - `@AfterClass`:在所有测试方法之后执行一次。
- **JUnit 5**
  - `@BeforeEach`:在每个测试方法之前执行。
  - `@AfterEach`:在每个测试方法之后执行。
  - `@BeforeAll`:在所有测试方法之前执行一次。
  - `@AfterAll`:在所有测试方法之后执行一次。

4.测试运行器

       JUnit 使用测试运行器来执行测试用例。常用的运行器包括:
- `JUnitCore`:用于命令行运行测试。
- IDE 内置的测试运行器(如 IntelliJ IDEA 或 Eclipse):方便开发者在开发环境中直接运行测试。

八.简单示例


 JUnit 4 示例:

import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {
    private Calculator calc;

    @Before
    public void setUp() {
        calc = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calc.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(1, calc.subtract(3, 2));
    }
}

JUnit 5 示例:

import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class CalculatorTest {
    private Calculator calc;

    @BeforeEach
    public void setUp() {
        calc = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calc.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(1, calc.subtract(3, 2));
    }
}
 

九.JUnit 4 与 JUnit 5 的区别

- **注解变化**:JUnit 5 引入了新的注解(如`@DisplayName`、`@Nested`等),提供了更灵活的测试组织方式。
- **扩展机制**:JUnit 5 提供了更强大的扩展机制,支持自定义扩展。
- **模块化支持**:JUnit 5 更好地支持 Java 9 的模块化特性。
- **异常处理**:JUnit 5 提供了更简洁的异常测试方法(如`assertThrows`)。

十.idea项目实战

1.在idea中创建Java项目,注意选择“Maven”

2.将“pom.xml”文件内容替换成下面内容

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>simple-junit-project</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- JUnit 5 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.2</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M7</version></plugin></plugins></build>
</project>

3.重新加载Maven项目,直到不再报错

4.按下图创建对应项目和Java类文件

5.两个Java类文件代码内容如下,替换即可

​
package com.example;public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}​
package com.example;import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;class CalculatorTest {private Calculator calculator;@BeforeEachvoid setUp() {calculator = new Calculator();}@Testvoid testAdd() {assertEquals(5, calculator.add(2, 3), "2 + 3 should equal 5");}@Testvoid testSubtract() {assertEquals(1, calculator.subtract(3, 2), "3 - 2 should equal 1");}
}

6.运行测试类,结果如下

7.代码解释如下

对于pom.xml

  • <modelVersion>:定义了 POM 文件的版本,通常是 4.0.0

  • <groupId>:定义了项目的唯一标识,通常是反向域名形式,例如 com.example

  • <artifactId>:定义了项目的名称,例如 simple-junit-project

  • <version>:定义了项目的版本号,例如 1.0-SNAPSHOT

  • <properties>:定义了一些常用的属性,例如 Java 编译版本和字符编码。

  • <dependencies>:定义了项目依赖的库。这里我们添加了 JUnit 5 的依赖,用于编写和运行单元测试。

    • junit-jupiter-api:JUnit 5 的核心 API,用于编写测试用例。

    • junit-jupiter-engine:JUnit 5 的测试引擎,用于运行测试用例。

  • <build>:定义了项目的构建配置。

    • maven-surefire-plugin:用于运行测试的 Maven 插件。

对于Calculator 类

  • add 方法:接收两个整数参数 ab,返回它们的和。

  • subtract 方法:接收两个整数参数 ab,返回它们的差。

对于CalculatorTest 类

  • @BeforeEach 注解setUp 方法会在每个测试方法运行之前被调用。这里用于初始化 Calculator 对象。

  • @Test 注解:标记这是一个测试方法。

  • testAdd 方法

    • 调用 calculator.add(2, 3),计算结果。

    • 使用 assertEquals 断言方法,验证计算结果是否等于预期值 5

    • 第三个参数是断言失败时的错误信息。

  • testSubtract 方法

    • 调用 calculator.subtract(3, 2),计算结果。

    • 使用 assertEquals 断言方法,验证计算结果是否等于预期值 1

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

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

相关文章

[吾爱原创] 千千每日计划

[吾爱原创] 千千每日计划 链接&#xff1a;https://pan.xunlei.com/s/VOYuE8p-KIV-NJr2_0d1Ak9YA1?pwdbqez# 介绍&#xff1a;千千系列的最后一款软件,一款每日计划的一款软件&#xff0c;并且支持时间段修改和打卡和导入导出等功能。 功能&#xff1a; 1.设置每天的计划 2…

docker命令(二)

目录 docker命令 1.inspect命令&#xff08;查看镜像信息&#xff09; 2.tag命令&#xff08;为镜像起别名&#xff09; 3.--help命令&#xff08;查看命令的使用帮组&#xff09; docker 命令 --help docker --help 4.run命令 1.格式 2.启动tomcat镜像 3. docker 不能被外部访…

Dockerfile实现java容器构建及项目重启(公网和内网)

公网情况0.Dockerfile关键字关键字作用一句话出现位置FROM指定基础镜像&#xff08;任何 Dockerfile 必须且首行&#xff09;全局RUN在镜像构建阶段执行命令&#xff08;常用来安装软件&#xff09;构建期COPY把宿主机文件/目录复制进镜像构建期ADD类似 COPY&#xff0c;但额外…

SpringCloud与Dubbo深度对比:架构、性能与生态全解析

引言在微服务架构盛行的今天&#xff0c;服务治理框架的选择成为企业技术栈决策的关键环节。Spring Cloud和Dubbo作为Java生态中最具代表性的两大微服务框架&#xff0c;各自拥有独特的优势和适用场景。本文将从架构设计、服务治理、性能表现、生态系统等多个维度进行深度对比&…

简历书写---自我评价怎么写

前言 今天一对一辅导了很多同学做简历&#xff0c;看到很多同学简历上都有一栏&#xff1a;自我评价 那我们就要思考一下&#xff0c;我们搞技术的&#xff0c;一份技术简历&#xff0c;自我评价上怎么写&#xff0c;才能算一个加分点呢&#xff1f; 观点分享 首先&#xff0c;…

嵌入式Linux学习 - 数据库开发

目录 一. 在终端的使用 1. 下载 2. 操作 3. 相关函数 1.增 2. 删 3. 改 4. 查 5. 补充函数 二. 在软件的使用 1. 下载 2. 操作 三. 在编程的使用 1. 下载 2. 相关函数 1. 打开 2. 读写执行sql语句 3. 关闭 一. 在终端的使用 1. 下载 sudo apt-get install …

产品运营必备的职场通用能力有哪些?如何一步步提升?

在流量红利消退的存量竞争时代&#xff0c;产品运营岗位正经历价值重构。单纯的活动策划与用户维护已无法满足发展需求&#xff0c;数据驱动的精细化运营成为行业分水岭。面对这场变革&#xff0c;复合能力建设与前瞻工具掌握是运营人突破天花板的密钥。推荐考取CDA数据分析师&…

ESPTimer vs GPTimer:ESP32 定时器系统深度解析

第十五章和第十六章分别学习了​​ESPTimer​​ 和 ​​GPTimer​​ &#xff0c;那这两种定时器有什么区别&#xff0c;如何使用呢&#xff0c;下面探讨下。1. 两种定时器对比介绍1.1 两种定时器设计在 ESP32 开发中&#xff0c;​​ESPTimer​​ 和 ​​GPTimer​​ 是两种完…

【70页PPT】WMS助力企业数字化转型(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91806268 资料解读&#xff1a;【70页PPT】WMS助力企业数字化转型 详细资料请看本解读文章的最后内容。仓储管理在企业运营中占据关键地位&a…

[光学原理与应用-337]:ZEMAX - 自带的用于学习的样例设计

ZEMAX&#xff08;OpticStudio&#xff09;内置了大量样例设计文件&#xff0c;这些文件覆盖了从基础光学原理到复杂系统设计的全场景&#xff0c;是学习光学设计、掌握软件操作、理解像差理论的绝佳资源。以下是ZEMAX自带样例设计的详细分类、使用方法及学习价值分析&#xff…

下一波红利:用 #AI编程 闯入小游戏赛道,#看广告变现 模式正在崛起!

文章标题(可选,均包含核心关键词) 【主推标题】 #AI编程制作小游戏 的终极 #变现 指南:如何通过 #看广告变现 轻松赚钱 【疑问式标题】 #AI制作小游戏 真的能赚钱吗?揭秘 #AI编程赚钱 的四大核心路径与广告变现策略 【趋势型标题】 下一波红利:用 #AI编程 闯入小游戏赛道…

【git】add后不想commit怎么实现pull

本地有改动已 git add 到暂存区(stage)&#xff0c;但是还没 commit&#xff0c;同时远端有 28 个新提交需要拉取。 直接 git pull 会冲突或被拒绝&#xff0c;因为你本地有 staged 修改。 处理步骤有几种方案&#xff0c;我给你推荐最稳妥的几种&#xff1a;✅ 方法 1&#xf…

Unable to establish SSL connection. curl静态编译

博主有个老RHEL系统&#xff0c;内核2.6.18&#xff1b;ssl不管用了&#xff0c;最简单的wget也不行&#xff0c;下面编个静态编译的新版 curl 用用&#xff08;不影响yum源&#xff0c;不然的话系统自带的旧版 OpenSSL 受影响得得不偿失&#xff09;&#xff0c;来最优化解决下…

Redis-08 SpringBoot集成Redis常见问题

SpringBoot集成Redis的教程网上很多&#xff0c;总体来说就是三个步骤&#xff1a;添加依赖、修改配置文件、自定义Redis配置类&#xff08;自定义序列化器&#xff09;&#xff0c;具体步骤可自行搜索&#xff0c;本文主要解惑集成中的常见疑问。 1&#xff0c;选择什么依赖&…

数据结构:选择排序 (Selection Sort)

目录 从学生排队开始 算法的初始状态和核心操作 代码的逐步完善 第一阶段&#xff1a;定义函数框架和外层循环 第二阶段&#xff1a;实现“寻找最小元素”的逻辑&#xff08;内层循环&#xff09; 第三阶段&#xff1a;完成“交换”操作 复杂度与特性分析 时间复杂度 (…

Django Admin 管理工具

一、简介Django Admin 是 Django 框架最受欢迎和强大的特性之一。它是一个自动生成的管理后台&#xff0c;允许开发者无需或仅需编写少量代码&#xff0c;就能对网站的数据模型&#xff08;数据库中的表&#xff09;进行直观的增、删、改、查&#xff08;CRUD&#xff09;操作。…

园区智慧水电管理系统:让能源管理从“成本黑洞”变“利润引擎”

园区智慧水电管理系统&#xff0c;是一套专为产业园区、科技园、企业总部等大型空间设计的集智能计量、远程管控、自动计费、能耗分析于一体的数字化能源解决方案。它用技术手段解决水电管理中的“抄表难、收费乱、浪费多、数据缺”四大顽疾&#xff0c;真正实现降本、提效、控…

DeepSeek应用技巧-通过MCP打造数据分析助手

本文章将通过MCP服务来打造一个数据分析助手&#xff0c;可以直接读取本地的excel或csv的文件&#xff0c;然后生成可视化的报告并保存在本地&#xff0c;十分有应用和实践的价值&#xff0c;话不多说&#xff0c;我们开始手把手搭建。一、知识应用&#xff08;1&#xff09;Fu…

React Hooks 完全指南:从基础到高级的实战技巧

概述 React Hooks 是 React 16.8 引入的新特性&#xff0c;允许在函数组件中使用状态和其他 React 特性。根据数据的使用场景和更新机制&#xff0c;可以将 Hooks 分为三大类&#xff1a; 1. 保存只读数据 useMemo 用途&#xff1a; 缓存计算结果&#xff0c;避免重复计算 …

PCIe 6.0 vs 5.0:带宽翻倍背后的技术革命

PCIe 6.0 vs 5.0&#xff1a;带宽翻倍背后的技术革命在数据中心、AI计算和高速存储需求爆炸式增长的今天&#xff0c;传统接口带宽已成为系统性能提升的瓶颈。PCIe 6.0的推出正是为了解决这一挑战&#xff0c;它通过革命性的技术创新&#xff0c;在保持向后兼容的同时实现了带宽…