Java单元测试、Junit、断言、单元测试常见注解、单元测试Maven依赖范围、Maven常见问题解决方法

一. 测试

        1. 测试:是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程

        2. 阶段划分:单元测试、集成测试、系统测试、验收测试。

                ① 单元测试:对软件的基本组成单位进行测试,最小测试单位;目的检验软件基本组成单位的正确性,测试人员:开发人员

                ② 集成测试:将已分别通过测试的单元,按设计要求组合成系统或子系统,在进行的测试;目的检验单元之间的协作是否正确;测试人员:开发人员

                ③ 系统测试:对已经集成好的软件进行彻底的测试;目的验证软件系统的正确性、性能是否满足指定的要求;测试人员:测试人员

                ④ 验收测试(交付测试):是针对用户需求、业务流程进行的正式的测试;目的验证软件系统是否满足验收标准;测试人员:客户/需求方

        3. 测试方法:白盒测试、黑盒测试 及 灰盒测试

                ① 白盒测试:清楚软件内部结构、代码逻辑;用于验证代码、逻辑的正确性;

                ② 黑盒测试:不清楚软件内部结构、代码逻辑;用于验证软件的功能、兼容性等;

                ③ 灰盒测试:结合了白盒和黑盒的特点,既关注软件的内部结构又考虑外部功能

二. 单元测试快速入门

        1. 单元测试:就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试

        2. JUnit:最流行的Java测试框架之一,提供了一些功能,方便程序进行单元测试(第三方公司)

        3. main方法测试存在的问题:测试代码与源代码未分开,难维护;一个方法测试失败,影响后面方法;无法自动化测试,得到测试报告;

        4. JUnit单元测试:测试代码与源代码分开,便于维护;可根据需要进行自动化测试;可自动分析测试结果,产出测试报告

三. 使用JUnit

        1. 在pom.xml中,引入Junit的依赖

        2. 在test/Java目录下,创建测试类,并编写对应的测试方法,并在方法上声明@Test注解

        注意:JUnit单元测试类命名规范为:XxxxTest【规范】;Junit单元测试的方法,必须声明为 public void【规定】

        3. 运行单元测试(测试通过:绿色;测试失败:红色)

package org.example;import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;public class UserService {/*** 给定一个身份证号, 计算出该用户的年龄* @param idCard 身份证号*/public Integer getAge(String idCard){if (idCard == null || idCard.length() != 18) {throw new IllegalArgumentException("无效的身份证号码");}String birthday = idCard.substring(6, 14);LocalDate parse = LocalDate.parse(birthday, DateTimeFormatter.ofPattern("yyyyMMdd"));return Period.between(parse, LocalDate.now()).getYears();}/*** 给定一个身份证号, 计算出该用户的性别* @param idCard 身份证号*/public String getGender(String idCard){if (idCard == null || idCard.length() != 18) {throw new IllegalArgumentException("无效的身份证号码");}return Integer.parseInt(idCard.substring(16,17)) % 2 == 1 ? "男" : "女";}}
/*
* 测试类
* */
public class UserServiceTest {@Testpublic void testGetAge(){UserService userService = new UserService();Integer age = userService.getAge("112223199701011234");System.out.println(age);}}

四. 单元测试-断言

        单元测试运行不报错(绿色),并不代表代码没问题,测试通过;

        JUnit提供了一些辅助方法,用来帮助我们确定被测试的方法是否安装预期的效果正常工作,这种方式称为断言

断言方法说明
Assertions.assertEquals(object exp, Object act, String msg)检查两个值是否相等,不相等就报错。
Assertions.assertNotEquals(object unexp, Object act, String msg)检查两个值是否不相等,相等就报错。
Assertions.assertNull(object act, String msg)检查对象是否为null,不为null,就报错。
Assertions.assertNotNull(object act, String msg)检查对象是否不为null,为null,就报错。
Assertions.assertTrue(boolean condition, String msg)检查条件是否为true,不为true,就报错。
Assertions.assertFalse(boolean condition, String msg)检查条件是否为false,不为false,就报错。
Assertions. assertThrows(class expType, Executable exec, String msg)检查两个对象引用是否相等,不相等,就报错

          上述方法形参中的最后一个参数msg,表示错误提示信息,可以不指定(有对应的重载方法)

package org.example;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;/*
* 测试类
* */
public class UserServiceTest {@Testpublic void testGetAge(){UserService userService = new UserService();Integer age = userService.getAge("112223199701011234");System.out.println(age);}@Testpublic void testGetGender(){UserService userService = new UserService();String gender = userService.getGender("112223199701011234");System.out.println(gender);}/** 断言* */@Testpublic void testGenderWithAssert(){UserService userService = new UserService();String gender = userService.getGender("112223199701011234");System.out.println(gender);//断言机制Assertions.assertEquals("女",gender,"性别获取异常");}/** 断言2* */@Testpublic void testGenderWithAssert2(){UserService userService = new UserService();//断言Assertions.assertThrows(NullPointerException.class, ()->{//预期抛出的异常IllegalArgumentExceptionuserService.getGender(null);});}}

五. 单元测试-常见注解

        Junit中还提供了一些注解,增强其功能,常见的注解有:

注解说明备注
@Test测试类中的方法用它修饰才能成为测试方法,才能启动执行单元测试
@ParameterizedTest参数化测试的注解(可以让单个测试运行多次,每次运行时仅参数不同)用了该注解,就不需要@Test注解了
@Valuesource参数化测试的参数来源,赋予测试方法参数与参数化测试注解配合使用
@DisplayName指定测试类、测试方法显示的名称(默认为类名、方法名)
@BeforeEach用来修饰一个实例方法,该方法会在每一个测试方法执行之前执行一次。初始化资源(准备工作)
@AfterEach用来修饰一个实例方法,该方法会在每一个测试方法执行之后执行一次。释放资源(清理工作)
@BeforeAll用来修饰一个静态方法,该方法会在所有测试方法之前只执行一次。初始化资源(准备工作)
@AfterAll用来修饰一个静态方法,该方法会在所有测试方法之后只执行一次。释放资源(清理工作)

package org.example;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;/*
* 测试类
* */
@DisplayName("测试用户信息测试类")
public class UserServiceTest {@BeforeAll //该方法会在所有测试方法之前只执行一次。public static void beforeAll(){System.out.println("Before All");}@AfterAll //该方法会在所有测试方法之后只执行一次。public static void afterAll(){System.out.println("After All");}@BeforeEach //该方法会在每一个测试方法执行之前执行一次。public  void beforeEach(){System.out.println("Before Each");}@AfterEach //该方法会在每一个测试方法执行之后执行一次。public void afterEach(){System.out.println("after All");}@Testpublic void testGetAge(){UserService userService = new UserService();Integer age = userService.getAge("112223199701011234");System.out.println(age);}@Testpublic void testGetGender(){UserService userService = new UserService();String gender = userService.getGender("112223199701011234");System.out.println(gender);}/** 断言* */@Testpublic void testGenderWithAssert(){UserService userService = new UserService();String gender = userService.getGender("112223199701011234");System.out.println(gender);//断言机制Assertions.assertEquals("女",gender,"性别获取异常");}/** 断言2* */@Testpublic void testGenderWithAssert2(){UserService userService = new UserService();//断言Assertions.assertThrows(NullPointerException.class, ()->{//预期抛出的异常IllegalArgumentExceptionuserService.getGender(null);});}/** 参数化测试* */@DisplayName("测试用户性别")@ParameterizedTest@ValueSource(strings = {"112223199701011234", "112223199801011254", "112223199901011274"})public void testGetGender2(String idCards){UserService userService = new UserService();String gender = userService.getGender(idCards);//断言Assertions.assertEquals("男", gender);}}

六.单元测试-企业开发规范

        1. 原则:编写测试方法时,要尽可能的覆盖业务方法中所有可能得情况(尤其是边界值)

package org.example;import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;/*
* 测试类
* */
@DisplayName("测试用户信息测试类2")
public class UserServiceTest2 {private UserService userService;@BeforeEachpublic void setUserService() {userService = new UserService();}/** 测试获取性别 -null* */@Test@DisplayName("获取性别-null值")public void testGender1(){Assertions.assertThrows(IllegalArgumentException.class, () -> {userService.getGender(null);});}/** 测试获取性别 -“ ”* */@Test@DisplayName("获取性别-空字符串")public void testGender2(){Assertions.assertThrows(IllegalArgumentException.class, () -> {userService.getGender("");});}/** 测试获取性别 -字符长度不够18位* */@Test@DisplayName("获取性别-字符长度不够18位")public void testGender3(){Assertions.assertThrows(IllegalArgumentException.class, () -> {userService.getGender("123654");});}/** 测试获取性别 -字符长度超过18位* */@Test@DisplayName("获取性别-字符长度超过18位")public void testGender4(){Assertions.assertThrows(IllegalArgumentException.class, () -> {userService.getGender("12345678901234567893");});}/** 测试获取性别 -正常男* */@Test@DisplayName("获取性别-正常男")public void testGender5(){String gender = userService.getGender("130001199712211234");Assertions.assertEquals("男", gender);}/** 测试获取性别 -正常女* */@Test@DisplayName("获取性别-正常女")public void testGender6(){String gender = userService.getGender("130001199712211224");Assertions.assertEquals("女", gender);}}

        2. 测试覆盖率

七. 基于AI自动生成单元测试

        1. 安装插件

        上述方式下载巨慢,建议官网下载后导入

下载安装-通义灵码

 八. 单元测试-Maven依赖范围

        1. 在Maven项目中,test目录存放单元测试的代码,可以在main目录中编写单元测试,但是不规范

        2. 依赖的jar包,默认情况下,可以在任何地方使用,可以通过<scope>...</scope>设置其作用范围

                作用范围:主程序范围有效;(main文件夹范围内)

                                测试程序范围有效;(test文件夹范围内)

                                是否参与打包运行;(pagekage指令范围内)

scope值主程序测试程序打包范例
compile(默认)YYYlog4j
test-Y-JUnit
providedYY-servlet-api
runtime-YYJDBC驱动
         <!--Junit依赖        --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.1</version><scope>test</scope></dependency>

九. Maven常见问题解决方法

然后重新加载Maven

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

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

相关文章

【Notepad】Notepad优化笔记AutoHotkey语法高亮\设置替换默认的notepad程序\设置主题\增加返回上一个编辑地方插件

Npp使用优化笔记 AHK或自定义语法高亮设置替换系统默认的notepad设置主题返回上一次编辑的地方插件使用 AHK或自定义语法高亮 具体参考该论坛 https://www.autohotkey.com/boards/viewtopic.php?t50 设置替换默认的notepad程序 参考文章&#xff1a; https://www.winhelpo…

Mac:Maven 下载+安装+环境配置(详细讲解)

&#x1f4cc; 下载 Maven 下载地址&#xff1a;https://maven.apache.org/download.cgi &#x1f4cc; 无需安装 Apache官网下载 Maven 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目录下新建…

[K!nd4SUS 2025] Crypto

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上&#xff0c;完成5/6&#xff0c;最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀&#xff0c;名词忘了&#xff0c;但意思还是知道。 b a*s e 这里的e是高斯分成&#xff0c;用1000…

学习threejs,构建THREE.ParametricGeometry参数化函数生成几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ParametricGeometry1…

Canal 解析与 Spring Boot 整合实战

一、Canal 简介 1.1 Canal 是什么&#xff1f; Canal 是阿里巴巴开源的一款基于 MySQL 数据库增量日志解析&#xff08;Binlog&#xff09;中间件&#xff0c;它模拟 MySQL 的从机&#xff08;Slave&#xff09;行为&#xff0c;监听 MySQL 主机的二进制日志&#xff08;Binl…

【海螺AI视频】蓝耘智算 | AI视频新浪潮:蓝耘MaaS与海螺AI视频创作体验

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

Prometheus使用

介绍&#xff1a;Prometheus 是一个开源的 监控与告警系统&#xff0c;主要用于采集和存储时间序列数据&#xff08;Time Series Data&#xff09; Prometheus的自定义查询语言PromQL Metric类型 为了能够帮助用户理解和区分这些不同监控指标之间的差异&#xff0c;Prometheu…

Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证

目录 1. fread 从文件中读取数据 1.1 读取次数 每次读取字节数 < 原内容字节数 1.2 读取次数 每次读取字节数 > 原内容字节数 2.fwrite 向文件中写入数据 2.1写入字符串验证 2.2写入结构体验证 3. fprintf 将数据写入到指定文件 4. fscanf 从文件中逐行读取内容…

再学:abi编码 地址类型与底层调用

目录 1.内置全局变量及函数 2.abi 3.地址类型 4.transfer 1.内置全局变量及函数 2.abi data就是abi编码 abi描述&#xff1a;以json格式表明有什么方法 3.地址类型 4.transfer x.transfer:合约转给x call 和 delegatecall 是 Solidity 中用于底层合约调用的函数&#xff0…

解决前端文字超高度有滚动条的情况下padding失效(el-scrollbar)使用

<div class"detailsBlocksContent"><div>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试…

SpringCloud 学习笔记3(OpenFeign)

OpenFeign 微服务之间的通信方式&#xff0c;通常有两种&#xff1a;RPC 和 HTTP。 简言之&#xff0c;RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中&#xff0c;默认是使用 HTTP 来进行微服务的通信&#xff0c;最常用的实现形式有两种&#xff1a; RestTem…

c中<string.h>

常见错误与最佳实践 缓冲区溢出&#xff1a; strcpy 和 strcat 不检查目标缓冲区大小&#xff0c;需手动确保空间足够。替代方案&#xff1a;使用 strncpy 和 strncat&#xff0c;或动态分配内存&#xff08;如 malloc&#xff09;。 未终止的字符串&#xff1a; 确保字符串以…

C++动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…

TypeScript + Vue:类风格组件如何引领前端新潮流?

&#x1f680; TypeScript Vue&#xff1a;用类风格组件打造“假货比对”神器&#xff01;&#x1f31f; 2025 年&#xff0c;前端开发早已进入“类型安全 模块化”的黄金时代。TypeScript (TS) 的类风格组件正在席卷 Vue 社区&#xff0c;为开发者带来更优雅、更强大的编码体…

Odoo 18 中的列表(list) 、表单(Form)、数据透视表、图表视图、看板视图、活动视图、日历视图等综合应用实例

Odoo 18 中的 视图应用实例 在 Odoo 中&#xff0c;视图是用户界面中表示业务对象的重要组成部分。无论您是扩展现有功能还是创建全新的功能&#xff0c;业务对象都至关重要。这些对象通过不同类型的视图向用户展示&#xff0c;而 Odoo 会根据 XML 描述动态生成这些视图。 列…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

Golang开发

Golang 文章目录 Golang预备技术一、算法与数据结构第1章&#xff1a;基础算法第2章&#xff1a;数据结构第3章&#xff1a;搜索与图论第4章&#xff1a;数论第5章&#xff1a;动态规划第6章&#xff1a;贪心第7章&#xff1a;算法竞赛入门 二、Linux操作系统与Shell编程三、计…

AI +低代码平台实现个性化用户体验设计

目录 一、引言 二、低代码平台与用户体验现状 &#xff08;一&#xff09;低代码平台的普及与应用 &#xff08;二&#xff09;传统低代码平台用户体验的局限性 三、AI 在个性化用户体验设计中的关键作用 &#xff08;一&#xff09;用户行为分析与洞察 &#xff08;二&a…

synchronized与 Java内置锁(未写完)

文章目录 一、 synchronized 关键字二、Java对象结构1. 对象头2. 对象体3. 对齐字节4. 对象头中的字段长度5. Mark Word 的结构信息6. 使用 JOL 工具查看对象的布局 三、Java 内置锁机制演进过程1. 无锁状态2. 偏向锁状态3. 轻量级锁状态4. 重量级锁状态 一、 synchronized 关键…

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…