Junit5使用教程(3)
第三部分:JUnit 5 进阶
3. 动态测试
一、动态测试是什么?
动态测试(Dynamic Test)允许在运行时生成测试用例,而不是在编译时通过 @Test
静态定义。它通过 @TestFactory
注解标记的方法动态生成一组测试用例,适用于需要灵活生成测试场景的场景。
核心特点:
- 运行时生成测试:测试用例在运行时动态创建。
- 灵活性强:可根据外部数据、条件或复杂逻辑生成测试。
- 独立执行:每个动态测试作为独立用例运行,失败不影响其他用例。
二、动态测试 vs 静态测试
特性 | 静态测试(@Test ) | 动态测试(@TestFactory ) |
---|---|---|
定义时机 | 编译时固定 | 运行时动态生成 |
用例数量 | 固定 | 可动态变化 |
生命周期 | 支持 @BeforeEach /@AfterEach | 不触发 @BeforeEach /@AfterEach |
适用场景 | 简单、固定的测试逻辑 | 复杂数据驱动、条件组合测试 |
三、动态测试的核心组件
-
@TestFactory
标记一个方法为动态测试工厂,该方法返回DynamicTest
的集合(如Stream
、Collection
或Iterable
)。 -
DynamicTest
表示单个动态测试用例,包含:- 名称:测试的显示名称。
- 可执行体:测试逻辑(Lambda 或方法引用)。
四、使用场景
1. 数据驱动测试
从外部数据源(如 CSV、数据库)读取数据,动态生成测试用例。
2. 组合测试
生成多个参数组合的测试用例,覆盖不同输入组合。
3. 条件性测试
根据运行时环境或条件动态决定是否生成测试用例。
4. 动态错误处理
例如遍历一组操作,每个操作作为独立测试用例,即使部分失败也不影响其他用例。
五、使用示例
示例 1:基本动态测试
import org.junit.jupiter.api.*;import java.util.stream.Stream;class DynamicTestDemo {@TestFactoryStream<DynamicTest> dynamicTestsBasic() {return Stream.of(DynamicTest.dynamicTest("动态测试 1", () -> {Assertions.assertEquals(4, 2 + 2);}),DynamicTest.dynamicTest("动态测试 2", () -> {Assertions.assertTrue("Hello".startsWith("H"));}));}
}
示例 2:基于外部数据的动态测试(CSV 文件)
假设 test-data.csv
内容:
2,3,5
5,5,10
动态测试代码:
import org.junit.jupiter.api.*;
import java.nio.file.*;
import java.util.stream.*;class CsvDynamicTest {@TestFactoryStream<DynamicTest> dynamicTestsFromCsv() throws Exception {return Files.lines(Paths.get("src/test/resources/test-data.csv")).map(line -> line.split(",")).map(columns -> DynamicTest.dynamicTest("测试加法: " + columns[0] + "+" + columns[1],() -> {int a = Integer.parseInt(columns[0]);int b = Integer.parseInt(columns[1]);int expected = Integer.parseInt(columns[2]);Assertions.assertEquals(expected, a + b);}));}
}
示例 3:组合参数测试
生成多个参数的组合测试:
@TestFactory
Stream<DynamicTest> dynamicTestsWithParameters() {List<Integer> aList = List.of(1, 2, 3);List<Integer> bList = List.of(4, 5, 6);return aList.stream().flatMap(a -> bList.stream().map(b -> new int[]{a, b})).map(pair -> DynamicTest.dynamicTest("测试 " + pair[0] + " + " + pair[1],() -> Assertions.assertEquals(pair[0] + pair[1], pair[0] + pair[1])));
}
示例 4:条件性动态测试
根据条件决定是否生成测试:
@TestFactory
Stream<DynamicTest> conditionalDynamicTests() {boolean isProduction = checkEnvironment();Stream<DynamicTest> baseTests = Stream.of(DynamicTest.dynamicTest("基础测试", () -> Assertions.assertTrue(true)));if (isProduction) {Stream<DynamicTest> prodTests = Stream.of(DynamicTest.dynamicTest("生产环境测试", () -> Assertions.assertFalse(false)));return Stream.concat(baseTests, prodTests);}return baseTests;
}private boolean checkEnvironment() {return "prod".equals(System.getProperty("env"));
}
六、动态测试的注意事项
- 生命周期方法不触发
动态测试不会执行@BeforeEach
或@AfterEach
,需手动管理资源。 - 返回值类型
@TestFactory
方法必须返回Stream
、Collection
或Iterable
类型的DynamicTest
。 - 命名清晰
动态测试的名称应明确描述测试内容,便于失败时快速定位。
七、动态测试 vs 参数化测试
特性 | 动态测试 | 参数化测试(@ParameterizedTest ) |
---|---|---|
灵活性 | 高(可自由生成用例) | 中(依赖预定义的参数源) |
生命周期 | 无 @BeforeEach /@AfterEach | 支持生命周期方法 |
适用场景 | 复杂逻辑生成用例 | 固定参数组合测试 |
八、总结
动态测试在以下场景中尤为强大:
- 需要从外部数据源动态生成测试。
- 测试用例数量或参数组合在编译时未知。
- 需要根据条件动态决定测试逻辑。
通过结合 @TestFactory
和 DynamicTest
,可以极大提升测试的灵活性和覆盖率。建议在复杂数据驱动或条件组合测试时优先选择动态测试!
4. 重复测试
一、重复测试是什么?
重复测试通过 @RepeatedTest
注解标记一个测试方法,使其重复执行多次,每次执行被视为独立的测试用例。它适用于验证代码的稳定性、随机性行为或性能基准测试。
核心特点:
- 多次独立执行:每次重复作为独立测试,失败不影响其他执行。
- 动态显示名称:支持自定义测试名称,包含当前重复次数。
- 生命周期支持:每次重复均触发
@BeforeEach
和@AfterEach
方法。
二、核心注解与参数
注解/参数 | 说明 |
---|---|
@RepeatedTest(n) | 标记方法为重复测试,n 指定重复次数。 |
RepetitionInfo | 注入参数,提供当前重复次数(currentRepetition )和总次数(totalRepetitions )。 |
name 属性 | 自定义测试名称,支持占位符 {currentRepetition} 和 {totalRepetitions} 。 |
三、使用场景
- 稳定性验证
确保代码在多次执行中不出现偶发错误。 - 随机数据测试
测试随机生成的数据是否符合预期分布。 - 性能基准测试
重复执行以计算平均耗时(需结合时间测量工具)。 - 边界条件压力测试
多次验证边界条件下的代码行为。
四、基础示例
示例 1:简单重复测试
import org.junit.jupiter.api.*;class RepeatedTestDemo {@RepeatedTest(3)void basicRepeatedTest() {Assertions.assertTrue(Math.random() >= 0);}
}
执行结果:
√ basicRepeatedTest() - 重复 1/3
√ basicRepeatedTest() - 重复 2/3
√ basicRepeatedTest() - 重复 3/3
示例 2:自定义显示名称
@RepeatedTest(value = 3,name = "第 {currentRepetition} 次测试,共 {totalRepetitions} 次"
)
void customNameRepeatedTest() {Assertions.assertNotEquals(0, System.currentTimeMillis());
}
执行结果:
√ 第 1 次测试,共 3 次
√ 第 2 次测试,共 3 次
√ 第 3 次测试,共 3 次
五、访问重复上下文
通过 RepetitionInfo
参数获取当前重复信息:
@RepeatedTest(5)
void testWithRepetitionInfo(RepetitionInfo info) {int current = info.getCurrentRepetition();int total = info.getTotalRepetitions();System.out.printf("执行 %d/%d%n", current, total);Assertions.assertTrue(current <= total);
}
六、结合生命周期方法
每次重复均会触发 @BeforeEach
和 @AfterEach
方法:
@BeforeEach
void setup() {System.out.println("初始化资源...");
}@AfterEach
void cleanup() {System.out.println("清理资源...");
}@RepeatedTest(2)
void testWithLifecycle() {System.out.println("执行测试逻辑");
}
执行结果:
初始化资源...
执行测试逻辑
清理资源...
初始化资源...
执行测试逻辑
清理资源...
七、高级应用场景
场景 1:随机性测试
验证随机数生成在多次执行中不越界:
@RepeatedTest(100)
void testRandomNumberInRange() {double random = Math.random();Assertions.assertTrue(random >= 0 && random < 1);
}
场景 2:性能基准测试(伪代码)
重复执行以测量平均耗时:
@RepeatedTest(100)
void measurePerformance() {long start = System.nanoTime();// 执行被测逻辑long duration = System.nanoTime() - start;Assertions.assertTrue(duration < 1_000_000, "执行时间超过 1ms");
}
八、注意事项
- 独立性
每次重复是独立的测试用例,共享类实例但测试方法状态独立。 - 生命周期方法
@BeforeAll
和@AfterAll
在整个测试类生命周期中仅执行一次。 - 性能开销
避免无意义的大量重复,尤其是涉及 I/O 或复杂计算的测试。
九、重复测试 vs 参数化测试
特性 | 重复测试(@RepeatedTest ) | 参数化测试(@ParameterizedTest ) |
---|---|---|
目的 | 相同逻辑多次执行 | 不同参数多次执行相同逻辑 |
输入变化 | 无(相同输入重复执行) | 每次执行使用不同输入参数 |
适用场景 | 稳定性、随机性、性能测试 | 多数据组合验证 |
十、总结
何时使用重复测试:
- 验证代码在多次执行中的稳定性。
- 测试依赖随机数或时间戳的逻辑。
- 需要重复执行以捕获偶发性问题。
通过合理配置重复次数和结合 RepetitionInfo
,重复测试能有效提升测试覆盖率和可靠性。对于需要不同输入参数的场景,应优先选择参数化测试。
相关文章:
Junit5使用教程(3)
第三部分:JUnit 5 进阶 3. 动态测试 一、动态测试是什么? 动态测试(Dynamic Test)允许在运行时生成测试用例,而不是在编译时通过 Test 静态定义。它通过 TestFactory 注解标记的方法动态生成一组测试用例࿰…...
WPS中解除工作表密码保护(忘记密码)
1.下载vba插件 项目首页 - WPS中如何启用宏附wps.vba.exe下载说明分享:WPS中如何启用宏:附wps.vba.exe下载说明本文将详细介绍如何在WPS中启用宏功能,并提供wps.vba.exe文件的下载说明 - GitCode 并按照步骤安装 2.wps中点击搜索,输入开发…...
通向AGI之路:人工通用智能的技术演进与人类未来
文章目录 引言:当机器开始思考一、AGI的本质定义与技术演进1.1 从专用到通用:智能形态的范式转移1.2 AGI发展路线图二、突破AGI的五大技术路径2.1 神经符号整合(Neuro-Symbolic AI)2.2 世界模型架构(World Models)2.3 具身认知理论(Embodied Cognition)三、AGI安全:价…...
kamailio-osp模块
该文档详细讲解了如何在Kamailio中配置和使用OSP模块(Open Settlement Protocol Module),以实现基于ETSI标准的安全多边对等互联(Secure Multi-Lateral Peering)。以下是核心内容的总结: 1. 模块功能 OSP模…...
【Linux网络编程】:URL(encode),HTTP协议,telnet工具
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://mp.csdn…...
SpringMVC SpringMVC响应 一、数据处理及跳转
1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name"p…...
C++SLT(三)——list
目录 一、list的介绍二、list的使用list的定义方式 三、list的插入和删除push_back和pop_backpush_front和pop_frontinserterase 四、list的迭代器使用五、list的元素获取六、list的大小控制七、list的操作函数sort和reversemergeremoveremove_ifuniqueassignswap 一、list的介…...
基于Coze平台实现抖音链接提取文案转小红书文案的智能体开发全流程解析
文章目录 引言:跨平台内容运营的AI解法实例最终效果1. 平台特性对比与转化需求分析1.1 用户画像与内容风格对比1.2 文案转化核心需求2. Coze平台技术架构解析2.1 Coze核心能力矩阵2.2 关键技术组件选型3. 智能体工作流设计3.1 完整处理流程3.2 关键节点说明4. 核心模块实现详解…...
32. 最长有效括号
动态规划 dp[i]表示以i下标为结尾的最长有效括号的长度,取dp[i]中的最大值即可。 i从1开始判断,只有s[i])才需要判断: 如果s[i-1](,那么dp[i]dp[i-2]2,注意判断i-2的范围否则,如果dp[i-1]>0࿰…...
Linux常见问题解决方法--2
如何反爬 后台对访问进行统计,如果单个 IP 访问超过阈值,予以封锁 后台对访问进行统计,如果单个 session 访问超过阈值,予以封锁 后台对访问进行统计,如果单个 userAgent 访问超过阈值,予以封锁 以上的组…...
STM32H7和F7 主要区别
STM32H7和F7系列是STMicroelectronics推出的高性能ARM Cortex-M微控制器系列,二者在性能、外设和用途上有显著区别。以下是它们的主要区别: 1. 内核与性能 STM32H7: 内核:Cortex-M7(单核或双核,部分型号带…...
软件测试丨PyTorch 图像目标检测
随着人工智能和机器学习的飞速发展,图像目标检测技术在各个领域扮演着越来越重要的角色。无论是在安防监控、自动驾驶车辆,还是在医疗影像分析和智能家居中,图像目标检测都发挥着不可或缺的作用。今天,我们将深入探讨其中一种热门…...
利用TensorFlow.js实现浏览器端机器学习:一个全面指南
引言 随着深度学习技术的不断发展,机器学习已从传统的服务器端运算逐渐转向了前端技术。TensorFlow.js 是 Google 推出的一个用于在浏览器中进行机器学习的开源库,它允许开发者在浏览器中直接运行机器学习模型,而无需依赖后端服务器。Tensor…...
全流程安装DeepSeek开源模型
目录 安装Ollama选择大模型安装大模型对话备注 安装Ollama 安装DeepSeek首先需要安装一个Ollama,这个软件相当于运行DeepSeek模型的底层,没有这个底层就没办法跑DeepSeek AI模型。 下载地址: https://ollama.com/点击下载windows版本&…...
VulnHub | Prime - 1
https://vulnhub.com/entry/prime-1,358/https://vulnhub.com/entry/prime-1,358/ 0x01:靶场简介 Prime 1 是 VulHub 中的一台用于 OSCP 考试练习的靶机。通过本靶机,我们可以系统的了解的渗透测试的全流程。本靶机的通关目标如下: Get The…...
实验十 Servlet(一)
实验十 Servlet(一) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 1、参考课堂例子,客户端通过login.jsp发出登录请求,请求提交到loginServlet处理。如果用户名和密码相同则视为登录成功,…...
寒假刷题Day22
一、2570. 合并两个二维数组 - 求和法 class Solution { public:vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {int i 0, j 0, n1 nums1.size(), n2 nums2.size();int tmp 0;…...
KES数据库实践指南:探索KES数据库的事务隔离级别
引言 前两篇文章我们详细讲解了如何安装KES金仓数据库,并提供了快速查询和搭建基于coze平台的智能体的解决方案。今天,我们的焦点将放在并发控制机制和事务隔离级别上。 本文将通过一系列实验操作,深入探讨KES数据库中的并发控制机制和事务…...
基于STM32的智能加湿器设计(新版本)
目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《12、基于…...
Electricity Market Optimization 探索系列(三)
本文参考链接link 电网容量规划是一个寻求最优发电容量的过程,找到的最优发电容量能够可靠地满足未来电网的需求 发电机的容量和发电成本呈正相关关系,一台发电机的发电量不能超过其额定发电容量,结合我之前的博客所说的内容,可…...
JAVA进阶之线程
为神马有线程?这玩意儿在干嘛??? 回答这个问题,就先要知道一点点计算机的工作方式。 总所周知,计算机有五部分:输入输出、计算器、存储器、控制器。而在计算机内,CPU、内存、I/O之…...
浙江安吉成新照明电器有限公司分布式光伏发电项目--安科瑞Acrel-1000DP分布式光伏监控系统
安科瑞 崔丽洁 项目背景 随着可再生能源的发展,分布式光伏发电成为重要的能源利用方式。浙江安吉成新照明电器有限公司 3234.465kWp 分布式光伏发电项目应运而生。该公司是螺旋节能灯毛管专业生产企业,于 2007 年 6 月成立,具备全自动生产线、…...
pytorch实现主成分分析 (PCA):用于数据降维和特征提取
人工智能例子汇总:AI常见的算法和例子-CSDN博客 使用 PyTorch 实现主成分分析(PCA)可以通过以下步骤进行: 标准化数据:首先,需要对数据进行标准化处理,确保每个特征的均值为 0,方差…...
2025_2_4 C语言中关于free函数及悬空指针,链表的一级指针和二级指指针
1.free函数 free函数所接受的参数只能是动态分配出来的内存,,否者free的行为是未定义的同一片内存空间不能被free两次 free过后的内存可能会引发悬空指针的问题 2.悬空指针 悬空指针的问题主要是free过后的内存空间,原先指向这片空间的指…...
pytorch逻辑回归实现垃圾邮件检测
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import torch.nn as nn import torch.optim as optim from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split …...
一次线程数超限导致的hive写入hbase作业失败分析
1.集群配置 操作系统:SuSe操作系统 集群节点:100台相同配置的服务器 单台:核心112Core,内存396G 2.问题现象 现象1:跑单个入库任务报错,批量提交任务后出现OOM异常 执行12个hivesql,将数据写入hbase.hbase入库有近一半的任务报错。 每次报错的任务不是同一个,hivesql…...
JAVA安全—反射机制攻击链类对象成员变量方法构造方法
前言 还是JAVA安全,哎,真的讲不完,太多啦。 今天主要是讲一下JAVA中的反射机制,因为反序列化的利用基本都是要用到这个反射机制,还有一些攻击链条的构造,也会用到,所以就讲一下。 什么是反射…...
Java集合面试总结(题目来源JavaGuide)
问题1:说说 List,Set,Map 三者的区别? 在 Java 中,List、Set 和 Map 是最常用的集合框架(Collection Framework)接口,它们的主要区别如下: 1. List(列表) 特点…...
【区块链】深入理解椭圆曲线密码学(ECC)
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…...
接口游标分页
由于数据库本身的的限制(以MySQL为例),以 page_num,page_size 为代表的偏移分页方式不可避免的会遇到深分页问题。 不过用户若要找符合条件的少量数据,通过翻页则十分低效,且大多用户也不会往后翻很多页,故对于C端筛选数据场景,限制分页数量增加筛选条件才是标准解决方…...
大数据数仓实战项目(离线数仓+实时数仓)2
目录 1.课程目标和课程内容介绍 2.数仓维度建模设计 3.数仓为什么要分层 4.数仓分层思想和作用 5.数仓中表的种类和同步策略 6.数仓中表字段介绍以及表关系梳理 订单表itcast_orders 订单明细表 itcast_order_goods 商品信息表 itcast_goods 店铺表 itcast_shops 商…...
C++输入输出(上)
cin和cout cin是C中提供的标准输入流对象,一般针对的是键盘,也就是从键盘上输入的字符流,使用 cin来进行数据的提取,cin一般是和 >> (流提取运算符) 配合使用的。 cin的功能和scanf是类似的 cout是C中提供的标准输出流对象,一般针对的是控制台的窗口,也就是将数据以字符…...
SpringBoot 连接Elasticsearch带账号密码认证 ES连接 加密连接
依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>配置文件 es:ip: 172.23.4.130port: 9200user: elasticpassword: qwertyuiop读取配置文件…...
选择排序
选择排序的基本思想: 每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待 排序的数据元素排完。 直接选择排序 1. 在元素集合 array[i]--array[n-1] 中选择关键码最⼤(⼩)的数据…...
Linux——进程概念
目录 一、系统调用和库函数概念二、基本概念三、描述进程-PCB3.1 task_struct-PCB的一种3.2 task_ struct内容分类 四、组织进程五、查看进程六、通过系统调用获取进程标示符七、通过系统调用创建进程- fork初始7.1 fork函数创建子进程7.2 fork 之后通常要用 if 进行分流 八、进…...
强化学习笔记(5)——PPO
PPO视频课程来源 首先理解采样期望的转换 变量x在p(x)分布下,函数f(x)的期望 等于f(x)乘以对应出现概率p(x)的累加 经过转换后变成 x在q(x)分布下,f(x)*p(x)/q(x) 的期望。 起因是:求最大化回报的期望,所以对ceta求梯度 具体举例…...
Java设计模式:行为型模式→状态模式
Java 状态模式详解 1. 定义 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中,实现对象行为的动态改变。该模式的核心思想是分离不同状态…...
postgresql的用户、数据库和表
在 PostgreSQL 中,用户、数据库和表是关系型数据库系统的基本组成部分。理解这些概念对数据库管理和操作至关重要。下面是对这些概念的详细解释: 1. 用户(User) 在 PostgreSQL 中,用户(也称为 角色&#…...
什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...
Maven(Ⅱ):依赖范围,依赖传递,依赖阻断,可选依赖
1. Maven 依赖范围 概念 依赖范围(Dependency Scope)用于控制依赖在不同构建阶段的可见性和可用性。Maven 定义了几种不同的依赖范围,每种范围都有其特定的使用场景。 常见依赖范围及用途 compile:默认的依赖范围,…...
个人c项目 java项目解释
1. 测试环境与方法 中文: 本地测试环境:可以在一台配置中等的电脑上构建一个测试环境,利用现成的大词库数据(例如英文词典或自定义数据集)来构建 Trie。使用 C 语言的编译器(例如 gcc)编译项目&…...
51单片机看门狗系统
在 STC89C52 单片机中,看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定,但是它在头文件中并未给出,因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…...
爬虫基础(五)爬虫基本原理
目录 一、爬虫是什么 二、爬虫过程 (1)获取网页 (2)提取信息 (3)保存数据 三、爬虫可爬的数据 四、爬虫问题 一、爬虫是什么 互联网,后面有个网字,我们可以把它看成一张蜘蛛网…...
Android 使用ExpandableListView时,需要注意哪些细节
1. 布局属性设置 尺寸属性 宽度和高度:要合理设置 android:layout_width 和 android:layout_height 属性。如果设置为 match_parent,它会填满父容器;设置为 wrap_content,则会根据内容自动调整大小。例如,若想让 Exp…...
人工智能赋能企业系统架构设计:以ERP与CRM系统为例
一、引言 1.1 研究背景与意义 在数字化时代,信息技术飞速发展,人工智能(Artificial Intelligence, AI)作为一项具有变革性的技术,正深刻地影响着各个领域。近年来,AI 在技术上取得了显著突破,…...
使用HttpClient和HttpRequest发送HTTP请求
项目中经常会用到向第三方系统发送请求来传递数据或者获得信息,一般用的比较多的为HttpClient 和 HttpRequest,这里简要总结一下 HttpClient 和 HttpRequest 的用法 一、HttpClient 1. 发送get请求 public static String get(String url, Map<Stri…...
深度解析:网站快速收录与服务器性能的关系
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/37.html 网站快速收录与服务器性能之间存在着密切的关系。服务器作为网站运行的基础设施,其性能直接影响到搜索引擎对网站的抓取效率和收录速度。以下是对这一关系的深度解析&am…...
Android记事本App设计开发项目实战教程2025最新版Android Studio
平时上课录了个视频,从新建工程到打包Apk,从头做到尾,没有遗漏任何实现细节,欢迎学过Android基础的同学参加,如果你做过其他终端软件开发,也可以学习,快速上手Android基础开发。 Android记事本课…...
DeepSeek-R1大模型学习笔记
DeepSeek-R1模型架构设计 DeepSeek-R1基于DeepSeek-V3 base模型,提出了一系列训练策略,包括基于纯强化学习的训练(DeepSeek-R1-Zero)、基于多阶段的训练和冷启动(DeepSeek-R1)、知识蒸馏等。下面的思维导图…...
Unity游戏(Assault空对地打击)开发(4) 碰撞体和刚体的添加
前言 飞机和世界的大小关系不太对,我稍微缩小了一下飞机。 详细步骤 选中所有地形对象,如果没有圈起的部分,点击Add Component搜索添加。 接着选中Player对象,添加这两个组件,最好(仅对于本项目开发&#x…...