Java基础单元测试

article/2025/9/11 1:32:12

本篇博文目录:

      • 1.单元测试
        • (1) 测试Java方法(原生)
      • 2. JUnit 5
        • (1) JUnit 5简单使用的例子
        • (2) JUnit5常用注解
        • (3) JUnit5常用注解的使用
        • (4).JUnit5内置断言

1.单元测试

单元测试就是针对最小的功能单元编写测试代码。Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。

(1) 测试Java方法(原生)

例子:

下面的代码就是在静态方法Factorial 中根据传入的n值计算n阶乘的值:

public class Factorial {public static long fact(long n) {long r = 1;for (long i = 1; i <= n; i++) {r = r * i;}return r;}
}

要测试这个方法,一个很自然的想法是编写一个main()方法,然后运行一些测试代码:

public class Test {public static void main(String[] args) {if (fact(10) == 3628800) {System.out.println("pass");} else {System.out.println("fail");}}
}

运行效果:

在这里插入图片描述

不过,使用main()方法测试有很多缺点:

  1. 是只能有一个main()方法,不能把测试代码分离,
  2. 是没有打印出测试结果和期望结果,例如,expected: 3628800, but actual: 123456,
  3. 是很难编写一组通用的测试代码。

因此,我们需要一种测试框架,帮助我们编写测试。

2. JUnit 5

JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛,Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。

(1) JUnit 5简单使用的例子

Junit5的操作非常简单,具体操作如下:

导入Junit5的依赖

如果是Sring Boot项目的话就无需导入了,因为SpringBoot中的test依赖中有Junit5的依赖

Maven中导入以下依赖:

	    <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.5.2</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-runner</artifactId><version>1.5.2</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.6.2</version></dependency>

上面的依赖说明:

  • junit-jupiter-engine:Junit的核心测试引擎
  • junit-platform-runner: 用于在JUnit 4环境中的JUnit平台上执行测试和测试套件的运行器。
  • junit-jupiter-params:编写参数化测试所需要的依赖包

备注:更多依赖的解释可以通过这篇博文了解到:Junit5系列-什么是Junit5?

一键生成测试类以及对应方法的测试代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击OK后就会在相应的test目录下生成对应的测试类和测试方法:
在这里插入图片描述
在这里插入图片描述
在face中编写测试代码即可:

在这里插入图片描述

运行测试方法,可以直接点击测试方法旁的绿色按钮,点击Run fact()

在这里插入图片描述

或者点击类旁的绿色箭头,点击Run JunitTest…

在这里插入图片描述

备注:运行方式1是运行对应方法的测试代码,运行方式2是运行类里的所有测试方法!

在运行的几种方式中有一种方式可以查看当前代码的覆盖率( 这种方式有助于我们更优的进行测试 ):
在这里插入图片描述

运行后就可以查看相应的覆盖率情况:

在这里插入图片描述

(2) JUnit5常用注解

详细的注解你可以通过官方了解,https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

注解解释
@Test表示方法是测试方法
@ParameterizedTest表示方法是参数化测试
@RepeatedTest表示方法可重复执行
@DisplayName为测试类或者测试方法设置展示名称
@BeforeEach表示在每个单元测试之前执行
@AfterEach表示在每个单元测试之后执行
@BeforeAll表示在所有单元测试之前执行
@AfterAll表示在所有单元测试之后执行
@Tag表示单元测试类别,类似于JUnit4中的@Categories
@Disabled表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith为测试类或测试方法提供扩展类引用

(3) JUnit5常用注解的使用

例子:

import org.junit.jupiter.api.*;@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JunitTestTest {@BeforeAllpublic void initDB() {System.out.println("正在创建数据库");}@BeforeEachpublic void initData() {System.out.println("正在初始化Test表数据");}@Test@DisplayName("第一次测试")public void firstTest() {System.out.println("第一个测试案例!");}@Test@DisplayName("第二次测试")public void secondTest() {System.out.println("第二个测试案例!");}@AfterEachpublic void destoryData() {System.out.println("正在销毁Test表数据");}@AfterAllpublic void destroyDB() {System.out.println("正在销毁数据库");}
}

运行类测试:

在这里插入图片描述

注解说明:

  • @BeforeAll 表示在所有单元测试之前执行,只执行一次,不会受测试用例数量的影响
  • @AfterAll 表示在所有单元测试之后执行,只执行一次,不会受测试用例数量的影响
  • @BeforeEach 表示在每个单元测试之前执行,会受测试用例数量的影响
  • @AfterEach 表示在每个单元测试之后执行,会受测试用例数量的影响
  • @DisplayName 为测试类或者测试方法设置展示名称

备注:使用以上注解需要使用 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 注解。

通过 @ParameterizedTest参数化测试可以实现一次性执行多次不同参数的测试用例:

    @ParameterizedTest@ValueSource(strings = {"ONE","TWO","THREE"})public void ParameterizedTest(String str) {if (str.equals("ONE")){System.out.println("ONE");}else if (str.equals("TWO") ){System.out.println("TWO");}else if (str.equals("THREE")){System.out.println("THREE");}}

运行效果:

在这里插入图片描述

如果测试方法加上@Disabled注解表示该注解不不执行,如下:

在这里插入图片描述
再次运行( 确实没有运行 ):

在这里插入图片描述

上面采用的是定好的参数,也可以使用动态参数,如下:

参数化使用@ParameterizedTest注解,动态传参使用@MethodSource(“getStr”)注解指向一个静态的getStr()方法,就可以实现动态传参了。

在这里插入图片描述
运行效果:

在这里插入图片描述

通过@RepeatedTest注解可重复执行多次当前测试用例,如下:

在这里插入图片描述
对于该注解的其他参数,你可以通过这篇博文了解到:JUnit5 @RepeatedTest注解示例

(4).JUnit5内置断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。JUnit 5 内置的断言可以分成如下几个类别:检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告;

简单断言

用来对单个值进行简单的验证。如:

断言方法解释
assertEquals判断两个对象或两个原始类型是否相等
assertNotEquals判断两个对象或两个原始类型是否不相等
assertSame判断两个对象引用是否指向同一个对象
assertNotSame判断两个对象引用是否指向不同的对象
assertTrue判断给定的布尔值是否为 true
assertFalse判断给定的布尔值是否为 false
assertNull判断给定的对象引用是否为 null
assertNotNull判断给定的对象引用是否不为 null
assertThrows判定调用某方法是否触发该异常

练习代码如下:

在这里插入图片描述

运行效果:

在这里插入图片描述

测试代码:

在这里插入图片描述

运行效果:

如果测试条件不满足就会打印出异常信息

在这里插入图片描述

测试异常Assertions.assertThrows:

assertThrows的第一个参数为预期异常,第二个为当执行testClass.getUser(null);触发

在这里插入图片描述

运行效果:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/rmL9G5sm.shtml

相关文章

如何进行Java 单元测试

一、概述 Java 单元测试是指对软件中的最小可测试单元进行测试&#xff0c;以保证代码的质量和正确性&#xff0c;并且可以加速开发过程。本文将全面详细地介绍 Java 单元测试相关知识点&#xff0c;包括单元测试的定义、优点和流程、JUnit 测试框架、Mockito 框架、持续集成、…

Java之单元测试(JUnit单元测试框架)

一、概述 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法&#xff0c;所以单元测试就是针对Java方法的测试&#xff0c;进而检查方法的正确性。常规测试有什么问题&#xff1f; 只有一个main方法&#xff0c;如果一个方法的测试失败了…

(60)Java基础 --单元测试

目录 一、测试的概念 二、使用Junit4.x进行单元环境 1、环境搭建 2、使用步骤 3、常见注解 三、规范的Junit测试方式 四、断言 1、为什么要使用断言 2、什么是断言(猜测) 3、常用API 一、测试的概念 先认识到测试的重要性&#xff1a;优秀的软件不是开发出来的,而是…

微信小程序消息推送(订阅消息原模板消息)开发流程

注&#xff1a;模板消息没了。 正常开发肯定需要前后端配合&#xff0c;此处都在小程序里写了 参考文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html 订阅消息是个很好的功能&#xff0c;但是现在被不良商家…

小程序之模版消息通知

手把手教你开发微信小程序之模版消息通知 一、模板消息功能概述 模板推送位置&#xff1a;服务通知 模板消息效果展示图&#xff1a; 进入小程序通知&#xff1a; 二、开发前的配置准备 1、验证token是否有效 <?php/*** 验证*/public function valid(){$echoStr $_GET…

java 微信小程序-发送模板消息

开发前准备工作 登录微信公众平台-小程序后台&#xff0c;在模板消息里面设置需要发送的模板&#xff0c;拿到模板id。 地址&#xff1a; https://mp.weixin.qq.com 找到微信官方文档-小程序开发-下发小程序和公众号统一的服务消息接口。 地址&#xff1a; https://developers…

【微信小程序】模板消息推送(测试成功)。

note&#xff1a; 这几天想做微信小程序消息推送的功能&#xff0c;然后在网上找了好多教程&#xff0c;都没解决问题&#xff0c;官方文档写的教程由不够详细&#xff0c;所以走了好多弯路。 现在问题解决了&#xff0c;记录一下。 我在网上找的好多教程都不详细&#xff0c;虽…

微信小程序模板订阅消息推送

尚未接触这块之前&#xff0c;以为是比较麻烦的&#xff0c;经研究并实现后&#xff0c;大致可以分为三个阶段&#xff1a; 申请模板&#xff08;明确推送卡片的格式及内容&#xff09;前端订阅&#xff08;打开可推送开关&#xff0c;允许推送&#xff09;后端推送&#xff0…

微信小程序——发送模板消息

步骤一&#xff1a;获取模板ID 1、通过模版消息管理接口获取模版ID&#xff08;详见模版消息管理&#xff09; 2、在微信公众平台手动配置获取模版ID 登录 https://mp.weixin.qq.com 获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通…

微信小程序的模板消息与小程序订阅消息

小程序订阅消息功能介绍消息能力是小程序能力中的重要组成&#xff0c;我们为开发者提供了订阅消息能力&#xff0c;以便实现服务的闭环和更优的体验。 订阅消息推送位置&#xff1a;服务通知订阅消息下发条件&#xff1a;用户自主订阅订阅消息卡片跳转能力&#xff1a;点击查…

《微信小程序——发送模板消息》详细步骤

第一步&#xff1a;获取access_token 第一步详情&#xff1a;因为access_token在微信公众号还是小程序&#xff0c;在一个月之内都有获取次数的限制&#xff0c;并且一个access_token只有2小时的有效期&#xff1b;所以每当我们获取一次access_token,就要反复利用&#xff1b;…

微信小程序给公众号发送模板消息

参考文献&#xff1a;小程序如何向公众号推送消息_fbbqt的博客-CSDN博客_小程序给公众号发信息小程序如何向公众号推送消息https://blog.csdn.net/fbbqt/article/details/122167097 前置条件&#xff1a; 微信公众号:AppId和APPSecret(必须认证) 微信小程序:AppId和APPSecret…

微信小程序模板消息实现(PHP+小程序)

参考官方文档和部分资料&#xff0c;总结小程序模板消息推送以及相关注意事项&#xff0c;楼主踩过的坑&#xff0c;特来与大家分享。 一、开发准备&#xff1a; 1. 在微信公众平台 - 小程序的模板中心申请消息模板 二、实现原理&#xff1a; 文档示例&#xff1a;小程序 接…

微信小程序订阅模板消息

1.登录管理员后台&#xff0c;订阅消息&#xff0c;选择模板或者申请模板 2. 开发管理&#xff0c;开发设置&#xff0c;开启消息推送&#xff0c;并验证服务器 3. 开发获取获取模板列表接口&#xff0c;和 测试消息发送接口 4. 前端根据接口配置授权弹窗页&#xff0c;获取用…

微信小程序|如何设置模板消息提醒

管理员如何设置模板消息提醒&#xff0c;管理员如何查看。回复用户咨询信息 使用管理员模板消息提醒&#xff0c;首先配置模板消息 第一步&#xff0c;设置模板消息&#xff0c;配送员通过微信模板消息接收配送信息&#xff0c;需要在平台——微信公众号——模板消息设置&#…

小程序之模板消息

使用模板消息 获取模板 id 登录https://mp.weixin.qq.com获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通过后可使用&#xff0c;详见模板审核说明 页面的 <form/> 组件&#xff0c;属性report-submit为true时&#xff0c;可…

微信小程序模板消息的两种实现方式

最近在做微信小程序&#xff0c;为了让用户能更加方便的获取到小程序内部的通知&#xff0c;便想着用模板消息来解决此类问题。首先介绍一下两种方法 第一种是传统的按照微信开发文档来实现模板消息的获取&#xff0c;首先要明确的是你要有一个第三方的服务器&#xff0c;因为…

微信小程序实例:创建下发模板消息实例

鉴于目前网络上都还找不到小程序下发模板消息的相关资源&#xff0c;在多次阅读了官方文档今天终于把小程序的模版消息给测通了&#xff0c;接下来介绍在不使用服务器的情况下&#xff0c;前端开发人员在本地怎么测试模板消息的发送。 1、在微信公众平台-小程序的模板中心先申请…

小程序配置模板消息

1.登录微信公众号平台&#xff0c;需要有权限的工作人员进行扫码登录。 2.登录进去点击订阅消息。 3.点击添加按钮&#xff0c;可以在搜索框进行搜索想要的模板类型&#xff0c;然后点击选用即可。 4.选择提醒模板消息的参数&#xff0c;需要跟客户沟通需要什么参数就配什么参…

小程序 发送模板消息的功能实现

☹. 背景 - 小程序开发的过程中&#xff0c;绝大多数会满足微信支付 - 那么&#xff0c;作为友好交互的体现&#xff0c;自然就会考虑到支付后的消息通知咯 - 所以&#xff0c;我的小程序项目也要求完成这个效果&#xff0c;so.分享一下自己的实现步骤&#xff0c;以方便道友们…