当前位置: 首页 > news >正文

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit

文章目录

  • 【Spring Boot】034-Spring Boot 整合 JUnit
  • 一、单元测试
    • 1、什么是单元
    • 2、什么是单元测试
    • 3、为什么要单元测试
  • 二、JUnit
    • 1、概述
      • 简介
      • 特点
    • 2、JUnit4
      • 概述
      • 基本用法
    • 3、JUnit5
      • 概述
      • 组成
    • 4、JUnit5 与 JUnit4 的常用注解对比
  • 三、Spring Boot 整合 JUnit
    • 1、Spring Boot 项目创建
    • 2、引入依赖
    • 3、外部库
    • 4、编写测试类
    • 5、运行结果截图
    • 6、`@SpringBootTest` 本身支持依赖注入
      • 编写组件
      • 依赖注入
    • 7、手动指定主启动类
      • 概述
      • 子包下可正常运行
      • 包外提示异常
      • 结构截图
      • 解决方案:显式声明主启动类的位置
  • 四、JUnit的断言机制
    • 1、概述
    • 2、基本使用
    • 3、组合条件断言
    • 4、异常抛出断言
    • 5、执行超时断言
    • 6、强制失败
  • 五、前置条件检查机制
    • 1、概述
    • 2、代码演示
    • 3、运行结果截图
  • 六、嵌套测试
    • 1、概述
    • 2、代码演示
    • 3、运行结果截图
    • 4、注意点
  • 七、带入参的单元测试
    • 1、概述
    • 2、参数化测试
    • 3、基本类型
      • 概述
      • 代码演示
      • 测试结果截图
    • 4、方法数据流返回
      • 概述
      • 代码演示
      • 测试结果截图

一、单元测试

1、什么是单元

单元:最终能分解的尽可能小的、独立的、可执行的元素。

对于 Java 程序:单元 = 类的方法。

2、什么是单元测试

对程序中的一个个单元进行测试,看看是否能够正常使用、是否存在问题等。

3、为什么要单元测试

通过最小测试范围确定出一个功能单元是否正常可用,通过单元测试的编写和执行,可以在尽可能早期筛查、发现出一些问题。

二、JUnit

1、概述

简介

JUnit 是针对 Java 语言的一个经典单元测试框架,它在测试驱动方面具有重大意义。JUnit 促进了“先测试后编码”的理论,它强调测试数据与程序代码的配合关系,使得开发者在程序开发中形成“编码一点,测试一点”的过程,这种编码习惯可以提高程序的正确性和稳定性,进而提高开发者的产出效率,减少后期排查错误的时间和精力。

特点

  • 开放的资源框架,用于编写和运行测试;
  • 提供注释来识别测试方法;
  • 提供断言来测试预期结果;
  • 提供测试运行来运行测试;
  • 允许编写代码更快,并能提高质量;
  • 测试代码编写优雅简洁,花费时间较少;
  • 测试代码可以自动运行并且检查自身结果并提供即时反馈,没有必要人工梳理测试结果的报告;
  • 测试代码可以被组织为测试套件,包含测试用例,甚至其他的测试套件;

2、JUnit4

概述

早期使用的 JUnit 版本为 4.x ,这个版本对 jdk 的最低限制是 jdk 1.5 ,整个 JUnit 4 的代码被整合到一个 jar 包中,使用时直接导入即可,主流的 IDE 都有对 JUnit 的原生支持。

基本用法

编写一个类 + 声明一个无参无返回值方法 + 加上@Test注解

使用 JUnit 4 的方式比较简单,只需要编写一个类,并声明一个无入参、无返回值的方法,并标注 @Test 注解即可被 IDE 识别且运行。

public class DemoTest {@Testpublic void test() {System.out.println("DemoTest test run ......");}
}

3、JUnit5

概述

一个单独 jar 包 => 一组 jar 包组合而成 + 支持用户定制!

2017 年 9 月,JUnit 5.0.0 正式发布,它最低支持的 Java 版本是 Java 8 ,而且它的构建不再由一个独立的 jar 包构成,而是以一组 jar 包共同组合而成。抛弃历史包袱,通过支持扩展(Extension),JUnit 5 给用户提供了定制特殊的测试需求与方式。

组成

总的来说,JUnit 5 由 3 个模块构成,分别是 JUnit Platform 、JUnit Jupiter 、JUnit Vintage 。

  • JUnit Platform :基于 JVM 上启动测试框架的基础,不仅支持 JUnit 的测试引擎,也可以兼容其他的测试引擎;
  • JUnit Jupiter :JUnit 5 的核心,提供 JUnit 5 的新的编程模型,内部包含一个测试引擎,该测试引擎会基于 JUnit Platform 运行;
  • JUnit Vintage :兼容 JUnit 4 、JUnit 3 支持的测试引擎。

使用 JUnit 5 的方式跟 JUnit 4 并无太大区别,同样是编写测试类,并声明方法,标注 @Test 注解即可,不再编写示例代码解释。

4、JUnit5 与 JUnit4 的常用注解对比

JUnit 5 相较于 JUnit 4 比较大的改动是注解的使用。下表展示了 JUnit 5 跟 JUnit 4 常用注解的对比。

注解意义JUnit 5JUnit 4
标注一个测试方法(无区别)@Test@Test
在每个测试方法前执行@BeforeEach@Before
在每个测试方法后执行@AfterEach@After
在当前类中的所有测试方法之前执行@BeforeAll@BeforeClass
在当前类中的所有测试方法之后执行@AfterAll@AfterClass
禁用测试方法/类@Disabled@Ignore
标记和过滤@Tag@Category
声明测试工厂进行动态测试(新增)@TestFactory/
嵌套测试(新增)@Nested/
注册自定义扩展(新增)@ExtendWith/

三、Spring Boot 整合 JUnit

1、Spring Boot 项目创建

image-20231113134810578

2、引入依赖

项目创建完成后已经自动引入了!spring-boot-starter-test

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zibo</groupId><artifactId>study-junit</artifactId><version>0.0.1-SNAPSHOT</version><name>study-junit</name><description>study-junit</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 创建项目后,自动引入了该依赖! --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image></configuration></plugin></plugins></build></project>

3、外部库

image-20231113135348801

4、编写测试类

package com.zibo.studyjunit;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class StudyJunitApplicationTests {@Testvoid contextLoads() {System.out.println("Hello World!");}}

5、运行结果截图

image-20231113135706434

6、@SpringBootTest 本身支持依赖注入

编写组件

package com.zibo.studyjunit.component;import org.springframework.stereotype.Component;@Component
public class HelloComponent {public String sayHello() {return "Hello World!";}}

依赖注入

package com.zibo.studyjunit;import com.zibo.studyjunit.component.HelloComponent;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class StudyJunitApplicationTests {@Autowiredprivate HelloComponent helloComponent;@Testvoid contextLoads() {helloComponent.sayHello();}}

7、手动指定主启动类

概述

我们编写 SpringBoot 测试类时,不可能把全部的测试类都放到与 SpringBoot 主启动类同包下,当测试类一多,整个 test 目录会非常混乱。为了方便寻找与管理,我们还是需要将单元测试类也分包管理。但是请各位注意,当 SpringBoot 测试类被放到其他包的时候,运行 SpringBoot 测试类是有区别的。

子包下可正常运行

package com.zibo.studyjunit.demo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Demo1Test {@Testvoid test1() {System.out.println("test1");}}

包外提示异常

package demo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Demo2Test {@Testvoid test2() {System.out.println("test2");}}

结构截图

image-20231113141817929

解决方案:显式声明主启动类的位置

代码

package demo;import com.zibo.studyjunit.StudyJunitApplication;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest(classes = StudyJunitApplication.class)
class Demo2Test {@Testvoid test2() {System.out.println("test2");}}

运行结果截图

image-20231113142023402

四、JUnit的断言机制

1、概述

下面讲解 JUnit 5 中的经典使用方式:断言。在 JUnit 4 中我们使用 Assert 类进行断言,而到了 JUnit 5 中使用的类是 Assertions ,类名变了,使用方式却大差不差,下面通过几个简单示例讲解 JUnit 5 的断言使用。

2、基本使用

Assertions 提供的最简单的断言方法,包含比对两个值是否相等两个对象是否是同一个对象是否为 null ,以及全场景通用的判断表达式的值为 true / false 。下面是一个简单的使用示例。

    @Testvoid testSimple() {// 一、两个值是否相等// 最简单的断言,断言计算值与预期值是否相等int num = 3 + 5;Assertions.assertEquals(num, 8);double result = 10.0 / 3;// 断言计算值是否在浮点数的指定范围内上下浮动Assertions.assertEquals(result, 3, 0.5);// 如果浮动空间不够,则会断言失败// 断言失败!// Assertions.assertEquals(result, 3, 0.2);// 传入message可以自定义错误提示信息// 断言失败!// Assertions.assertEquals(result, 3, 0.2, "计算数值偏差较大!");// 二、两个对象是否是同一个// 断言两个对象是否是同一个Object o1 = new Object();Object o2 = o1;Object o3 = new Object();Assertions.assertSame(o1, o2);// 断言失败!// Assertions.assertSame(o1, o3);// 断言两个数组的元素是否完全相同String[] arr1 = {"aa", "bb"};String[] arr2 = {"aa", "bb"};String[] arr3 = {"bb", "aa"};Assertions.assertArrayEquals(arr1, arr2);// 断言失败!// Assertions.assertArrayEquals(arr1, arr3);// 三、对象是否为 null// 断言对象是否为 nullObject o4 = null;Object o5 = new Object();Assertions.assertNull(o4);// 断言失败!// Assertions.assertNull(o5);// 四、判断表达式的值为 true / false// 断言表达式的值为 trueint a = 10;int b = 20;Assertions.assertTrue(a < b);// 断言表达式的值为 falseAssertions.assertFalse(a > b);}

3、组合条件断言

组合条件断言,实际上是要在一条断言中组合多个断言,要求这些断言同时、全部通过,则外部的组合断言才能通过。这种设计有点类似于父子断言。

    @Testvoid testCombination() {// 组合条件断言,只有当所有断言都成功时,才会断言成功int a = 10;int b = 20;int c = 30;// 断言 a < b 并且 b < cAssertions.assertAll("组合断言",() -> Assertions.assertTrue(a < b),() -> Assertions.assertTrue(b < c));}

4、异常抛出断言

异常抛出的断言,指的是被测试的内容最终运行时必定会抛出一个异常,如果没有抛出异常则断言失败

    @Testvoid testException() {// 断言抛出指定类型的异常Assertions.assertThrows(ArithmeticException.class, () -> {int i = 10 / 0;});}

5、执行超时断言

执行超时断言是,针对的是被测试代码的执行速度。

    @Testvoid testTimeout() {// 断言在指定时间内完成// 断言失败!org.opentest4j.AssertionFailedError: execution timed out after 100 msAssertions.assertTimeoutPreemptively(java.time.Duration.ofMillis(100), () -> {Thread.sleep(200);});}

6、强制失败

类似于最原始的抛出异常的方式,(当满足某些条件时)直接断言失败!

    @Testvoid testFail() {if (java.time.ZonedDateTime.now().getHour() > 12) {Assertions.fail();}}

五、前置条件检查机制

1、概述

前置条件的检查机制,同样应用在断言的场景中,它指的是:如果一个单元测试的前置条件不满足,则当前的测试会被跳过,后续的测试不会执行。使用前置条件检查机制,可以避免一些无谓的测试逻辑执行,从而提高单元测试的执行效率。

前置条件的检查使用的 API 是 Assumptions

2、代码演示

    @Testvoid testAssumptions() {// 假设条件为 true 时,才会执行后面的断言int num = 3 + 5;Assumptions.assumeTrue(num < 10);System.out.println("断言成功!");// 假设条件为 false 时,不会执行后面的断言Assumptions.assumeTrue(num > 10);// 断言失败!下面的代码不会执行System.out.println("断言失败!");}

3、运行结果截图

image-20231113145356361

六、嵌套测试

1、概述

嵌套测试是 JUnit 5 的一个高级特性,它支持我们在编写单元测试类时,以内部类的方式组织一些有关联的测试逻辑。有关嵌套测试的演示代码,在 JUnit 5 的官方文档中提供了一个非常全面的示例。

2、代码演示

package com.zibo.studyjunit.demo;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;import java.util.EmptyStackException;
import java.util.Stack;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class TestingAStackDemo {Stack<Object> stack;// 测试用例:使用new关键字实例化堆栈@Testvoid isInstantiatedWithNew() {new Stack<>();}@Nestedclass WhenNew {@BeforeEachvoid createNewStack() {// 在每个测试方法之前创建一个新的堆栈实例stack = new Stack<>();}// 测试用例:堆栈在刚创建时是否为空@Test@DisplayName("is empty")void isEmpty() {assertTrue(stack.isEmpty());}// 测试用例:在空栈上执行pop操作是否抛出EmptyStackException异常@Test@DisplayName("throws EmptyStackException when popped")void throwsExceptionWhenPopped() {assertThrows(EmptyStackException.class, () -> stack.pop());}@Nested@DisplayName("after pushing an element")class AfterPushing {String anElement = "an element";@BeforeEachvoid pushAnElement() {// 在堆栈中推入一个元素stack.push(anElement);}// 测试用例:在推入元素后,堆栈是否不再为空@Test@DisplayName("it is no longer empty")void isNotEmpty() {assertFalse(stack.isEmpty());}// 测试用例:在推入元素后,执行pop操作是否返回推入的元素并使堆栈为空@Test@DisplayName("returns the element when popped and is empty")void returnElementWhenPopped() {assertEquals(anElement, stack.pop());assertTrue(stack.isEmpty());}}}}

3、运行结果截图

image-20231113150426000

4、注意点

官方提供的测试代码都是可以执行通过的,从这段测试代码中需要各位了解的几个关键特性:

  • 单元测试类可以通过编写内部类,并标注 @Nested 注解,表明内部类也是一个单元测试类
  • 内部的单元测试类可以直接使用外部的成员属性,且可以利用外部定义的 @BeforeEach@BeforeAll@AfterEach@AfterAll 等前后置逻辑注解标注的方法;
  • 外部的单元测试无法利用内部类定义的前后置逻辑注解。

七、带入参的单元测试

1、概述

JUnit 5 中的一个重要特性是支持单元测试方法的参数依赖注入,这也打破了我们已有的认知。通常我们编写的测试方法是不能有方法入参的,但是 JUnit 5 允许我们在编写单元测试方法中予以声明方法入参。默认情况下 JUnit 5 支持以下几个参数类型的依赖注入:

  • TestInfo :内部组装了当前单元测试所属的 Class 、Method ,以及对应的展示名(DisplayName)等;
  • RepetitionInfo :如果一个方法被标注了 @RepeatedTest ,或者该方法是一个 @BeforeEach / @AfterEach 方法,则可以拿到 RepetitionInfo 的信息,可以通过 RepetitionInfo 获取到当前重复信息以及相应的@RepeatedTest的重复总数;
  • TestReporter :注入 TestReporter 后可以获得数据发布能力,可以向测试结果中注册一些特殊的数据,这些数据可以被 TestExecutionListener 获取到。

2、参数化测试

参数化测试是 JUnit 5 中提高单元测试效率的重要手段,它通过给单元测试方法传入特定的参数,可以使得 JUnit 在执行单元测试时逐个参数来检验和测试,这样做的好处是更加规整和高效地执行单元测试

参数化测试支持我们使用如下的方式赋予参数:

  • 基本类型:8 种基本数据类型 + String + Class
  • 枚举类型:自定义的枚举;
  • CSV 文件:可传入一个 CSV 格式的表格文件,使用表格文件中的数据作为入参;
  • 方法的数据返回:可以通过一个方法返回需要测试入参的数据(流的形式返回)。

3、基本类型

概述

在使用参数化测试时,标注的注解不再是 @Test ,取而代之的是 @ParameterizedTest ;另外还需要声明需要传入的数据,对于简单的基本类型而言,使用 @ValueSource 注解即可指定。

代码演示

package com.zibo.studyjunit.demo;import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ParameterizedTestDemo {@ParameterizedTest@ValueSource(strings = {"aa", "bb", "cc"})void testSimpleParameterized(String value) {System.out.println(value);Assertions.assertTrue(value.length() < 3);}}

测试结果截图

image-20231113151330211

4、方法数据流返回

概述

参数化测试最吸引人的点是可以引用一个方法来实现测试数据的参数化,既然可以在一个方法中构造单元测试的入参数据,那么完全可以从数据库 / 缓存等任意位置加载数据,并构造为流的形式返回。以此法编写的参数化测试具有极大的灵活度和自由度。

代码演示

    @ParameterizedTest@MethodSource("dataProvider")// @MethodSource("getInteger")void testDataStreamParameterized(Integer value) {System.out.println(value);Assertions.assertTrue(value < 10);}private static Stream<Integer> dataProvider() {return Stream.of(1, 2, 3, 4, 5);}// 不能用这种方式,会报错// 返回值必须是Stream<T>或者Stream<Arguments>// private static Integer getInteger() {//     return 1;// }private static Stream<Arguments> getInteger() {return Stream.of(Arguments.of(1), Arguments.of(2), Arguments.of(3));}

测试结果截图

image-20231113152855091

相关文章:

【Spring Boot】034-Spring Boot 整合 JUnit

【Spring Boot】034-Spring Boot 整合 JUnit 文章目录 【Spring Boot】034-Spring Boot 整合 JUnit一、单元测试1、什么是单元2、什么是单元测试3、为什么要单元测试 二、JUnit1、概述简介特点 2、JUnit4概述基本用法 3、JUnit5概述组成 4、JUnit5 与 JUnit4 的常用注解对比 三…...

基于安卓android微信小程序的师生答疑交流平app

项目介绍 本课题研究的是基于HBuilder X系统平台的师生答疑交流APP&#xff0c;开发这款师生答疑交流APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了师生答疑交流APP的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用、界面的布局和异常…...

开发一个接口,需要考虑什么

开发一个对外接口&#xff0c;一般会考虑以下因素&#xff1a; 用户需求&#xff1a;首先要考虑用户的需求&#xff0c;了解他们希望通过接口实现什么样的功能&#xff0c;以及他们期望接口具备怎样的特性和性能。 可扩展性&#xff1a;接口需要具备良好的可扩展性&#xff0c…...

【owt】owt-p2p的vs工程构建

owt的p2p代码构建一个静态库 Build started... 1>------ Build started: Project: owtTalkP2P, Configuration: Debug Win32 ------ 1>p2ppeerconnectionchannel.cc 1>g:\webrtc_m98_yjf\src\media\base\codec.h : warning C4819: The file contains a character that…...

uniapp系列

MQTT&#xff1a; 1、报错&#xff1a;TypeError: WebSocket is not a constructor 背景&#xff1a;最近使用MQTT协议传递消息&#xff0c;集成在uniapp上&#xff0c;出现此问题 解决&#xff1a;app端需要用"wx://"&#xff08;安全协议用"wxs://"&a…...

AWS实战(一)-创建S3 存储桶

1&#xff09;登录AWS账号&#xff0c;选择服务—>存储—>S3。 2&#xff09;查看存储桶列表 3&#xff09;点击"创建存储桶"创建bucket。 4&#xff09;设置跨域 点击编辑&#xff0c;修改跨域设置即可。...

Java实现简单的俄罗斯方块游戏

一、创建新项目 1.首先新建一个项目&#xff0c;并命名为俄罗斯方块。 2.其次新建一个类&#xff0c;命名为Main&#xff0c;或其他的。 二、运行代码 代码如下&#xff1a; package 俄罗斯方块;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Gr…...

深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…...

人工智能 :一种现代的方法 第七章 逻辑智能体

文章目录 前言人工智能 &#xff1a;一种现代的方法 第七章 逻辑智能体7.1 基于知识的智能体7.2 Wumpus世界7.4 命题逻辑7.5 命题逻辑定理证明7.5.1推导和证明7.5.2 归结原理7.5.3 horn子句和限定子句7.5.4 前向链接和后向链接 7.6 有效命题逻辑模型求解7.6.1完备的回溯算法7.6…...

从座舱到行泊一体,亿咖通科技做对了什么?

行泊一体赛道又迎来了一个重磅玩家。 据了解&#xff0c;亿咖通科技旗下基于两颗华山二号A1000芯片打造的亿咖通天穹Pro行泊一体智能驾驶计算平台&#xff0c;目前已经正式在领克08上面实现规模化量产交付。 亿咖通天穹Pro智能驾驶计算平台 值得一提的是&#xff0c;该行泊一…...

BMC Helix解决方案落地亚马逊云科技中国区域,同时上线Marketplace

自主数字企业软件解决方案领域的全球领导者BMC今天宣布&#xff0c;由AI赋能的BMC Helix数字化服务管理平台&#xff08;ITSM&#xff09;正式部署于由西云数据运营的亚马逊云科技中国&#xff08;宁夏&#xff09;区域&#xff0c;实现SaaS服务和容器化部署双模态&#xff0c;…...

第14章 多线程二 (线程调度)

目录 内容说明 章节内容 1、多线程的调度 2、多线程调度——设置优先级...

Spring Cloud GateWay简介

什么是网关 网关是一种充当转换重任的计算机系统或设备&#xff0c;使用在不同的通信协议、数据格式或语言&#xff0c;甚至网关是一种充当转换重任的计算机系统或设备&#xff0c;使用在不同的通信协议、数据格式或语言&#xff0c;甚至体系结构完全不同的两种系统之间进行数…...

耿明雨出席柬方70周年招待会晚宴

11月9日&#xff0c;庆祝柬埔寨独立和建军70周年欢迎晚宴上&#xff0c;全国政协副主席沈跃跃盛邀出席&#xff0c;此次招待会是由柬埔寨王国驻华大使馆主办&#xff0c;在北京励骏酒店圆满召开&#xff0c;晚宴现场&#xff1b;凯西索达大使致辞、中国外交部部长助理徐飞洪等领…...

退役记 + 秋招总结,占坑

感觉需要写点什么东西来记录一下自己的秋招&#xff0c;以及还有一篇退役记没有写。 思考了一下&#xff0c;感觉发在空间并没有很合适&#xff0c;还是写个博客好了。 最近有点颓&#xff0c;就先买个坑在这里&#xff0c;省的彻底咕掉。 如果今年年底还没写出来的话&#xff…...

网络类型及数据链路层的协议

网络类型 --- 根据数据链路层使用的协议来进行划分的。 MA网络 --- 多点接入网络 BMA --- 广播型多点接入网络---以太网协议 NBMA --- 非广播型多点接入网络 以太网协议 --- 需要使用mac地址对不同的主机设备进行区分和标识 --- 以太网之所以需要使用mac地址进行数据寻址&…...

ROC 曲线:健康背景下的应用和解释

一、介绍 在医疗保健领域&#xff0c;做出明智的决策对于改善患者治疗结果、有效分配资源和设计有效的诊断测试至关重要。受试者工作特征 (ROC) 曲线是一个强大的工具&#xff0c;在评估诊断测试的性能、区分健康个体和患病个体以及优化医疗保健干预方面发挥着至关重要的作用。…...

SpringBoot + Disruptor 实现特快高并发处理,使用Disruptor高速实现队列

1 前言 工作中遇到项目使用Disruptor做消息队列&#xff0c;对&#xff01;你没看错&#xff0c;不是Kafka也不是rabbitmq。Disruptor有个最大的优点就是快&#xff0c;还有一点它是开源的哦&#xff0c;下面做个简单的记录。 2 Disruptor介绍 Disruptor 是英国外汇交易公司…...

git push origin HEAD:refs/for/master

git push <远程主机名> <本地分支名> : <远程分支名> 例如 git push origin master&#xff1a;refs/for/master 是将本地的master分支推送到远程主机origin上的对应master分支 origin 是远程主机名&#xff0c; 第一个master是本地分支名&#xff0c; 第二…...

S25FL256S介绍及FPGA实现思路

本文介绍 S25FL256S 这款 FLASH 芯片&#xff0c;并进行 FPGA 读写控制的实现&#xff08;编程思路及注意事项&#xff09;。 文章目录 S25FL-S 介绍管脚功能说明SPI 时钟模式SDRDDR 工作模式FLASH存储阵列&#xff08;地址空间映射&#xff09;常用寄存器及相关指令Status Reg…...

淘宝客APP源码/社交电商自营商城源码/前端基于Uniapp开发

淘宝客APP源码&#xff0c;前端基于Uniapp开发的社交电商自营商城源码。Thinkphp的后台&#xff0c;不是很标准&#xff0c;感兴趣的可以自行研究。 商城功能 1、首页基础装修&#xff1b;2、丰富选品库&#xff1b;3、淘口令解析&#xff1b;4、支持京东&#xff1b;5、支持…...

Oracle 服务器日常巡检

文章目录 1、数据库基本状况检查2、数据库相关资源使用情况检查3、检查Oracle数据库性能4、数据库服务器CPU、MEM、I/O性能5、数据库服务器安全检查 Oracle数据库的日常巡检内容包括&#xff1a; &#xff08;1&#xff09;Oracle数据库基本状况检查&#xff1b; &#xff08…...

【轨道机器人】实现Windows与下位机串口通信(未完成)

方案一&#xff1a;QT&#xff0c;编写类似串口调试助手的APP&#xff0c;连接上硬件&#xff0c;qt有个好像是串口缓存函数&#xff0c;可以防止占用CPU。&#xff08;缺点qt估计要时间学&#xff09; 方案二&#xff1a;利用vscode、C&#xff0c;编写一个可执行exe文件&…...

无人机内存卡数据恢复

1.插入内存卡 2.选择对应的品牌 3.点击恢复 建议&#xff1a;发现数据打不开或者丢失情况&#xff0c;建议及时断电&#xff0c;以免影响数据的正常恢复&#xff01; #无人机##数据恢复##储存卡#...

基于SSM的校园二手物品交易市场设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

Android14 Beta 5

Beta 5&#xff0c;这是 Android 14 Beta 计划中的最后一次计划更新。这是确保您的应用程序已准备就绪并在非 Beta 用户开始获取 Android 14 之前提供反馈的最后机会。为了使您能够在跨多种外形尺寸的设备上测试您的应用程序&#xff0c;Beta 5 适用于 Pixel Tablet 和 Pixel F…...

力扣labuladong——一刷day32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣654. 最大二叉树二、力扣105. 从前序与中序遍历序列构造二叉树三、力扣106. 从中序与后序遍历序列构造二叉树四、力扣889. 根据前序和后序遍历构造二叉…...

Day01_《MySQL索引与性能优化》摘要

一、资料 视频&#xff1a;《尚硅谷MySQL数据库高级&#xff0c;mysql优化&#xff0c;数据库优化》—周阳 其他博主的完整笔记&#xff1a;MySQL 我的笔记&#xff1a;我的笔记只总结了视频p14-p46部分&#xff0c;因为只有这部分是讲解了MySQL的索引与explain语句分析优化…...

BMS系统项目

1、通过电压监测是否冲满&#xff0c;通过电压可以监测是否放完电 电池得参数 单体过压&#xff08;充满电&#xff09; 过压恢复&#xff08;百分之90多&#xff09; 欠压保护&#xff08;百分之几得电&#xff0c;快关机了&#xff09; 欠压恢复&#xff08;就是欠压之上…...

sql server 多行数据合并一行显示

在 SQL Server 中&#xff0c;可以使用 STUFF 和 FOR XML PATH 进行多行合并成一行。例如&#xff0c;假设有一个表名为 orders &#xff0c;其中包含订单号和产品名称&#xff1a; order_idproduct_name1Product A1Product B2Product C2Product D 以下查询将在 order_id 列上…...