自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 抽奖系统 Web 端测试用例报告

本文为抽奖系统Web端测试用例报告,覆盖9个页面及登录、奖品管理、活动创建、抽奖、导出等核心功能。测试涵盖功能、性能、兼容性、界面、易用性与安全六大维度,共161条用例。重点验证业务链路正确性、状态一致性、并发幂等性与安全性,尤其关注抽奖流程的事务回滚、异步消息处理与中奖记录可追溯性。性能指标以建议基线为准,强调端到端验证与缺陷闭环管理,确保系统在真实场景下稳定、公平、可信。

2026-10-30 18:01:25 135

原创 五子棋 Web 端测试用例报告

本文介绍一个基于Selenium的五子棋WebUI自动化测试方案,采用前后端分离架构,通过统一的Utils基类实现浏览器驱动管理、显式等待与智能截图。测试覆盖登录、注册、游戏大厅及双人对局四大场景,运用等价类划分设计正向与异常用例。关键创新在于双浏览器实例模拟双玩家匹配,确保对局逻辑有效性,结合自动截图与时间戳命名提升问题定位效率,实现高效、可维护的Web测试体系。

2026-10-30 12:01:03 184

原创 [项目] --- 基于 Spring Boot + Redis的多设计模式抽奖系统

本文实现了一个可运营的在线抽奖平台,通过SpringBoot+MyBatis+MySQL+Redis+RabbitMQ等技术栈,解决活动、奖品、人员三方状态联动的核心难题。项目采用模板方法与策略模式实现状态流转,结合事务、消息队列与缓存设计保障一致性与高并发性能,支持异步通知与现场抽奖,代码结构清晰,兼具可扩展性与生产可用性。

2026-10-26 10:20:55 603

原创 软件测试开发 ---- 关于BUG

Bug是软件与需求规格说明不一致或未满足用户合理预期的功能缺陷。其级别分为崩溃、严重、一般、次要,用于评估问题影响程度并指导开发优先级。当与开发产生争执时,应先自查描述是否清晰,站在用户角度分析问题,依据实际影响合理定级,并通过友好沟通或召开bug评审会解决分歧,确保问题有效推进。

2026-10-29 00:36:17 244

原创 软件测试开发 ---- 常见开发模型

软件生命周期包括需求分析、计划、设计、开发、测试与维护。瀑布模型适用于需求固定的小项目,强调阶段划分,但反馈滞后;螺旋模型适合高风险大型项目,通过迭代与风险分析降低不确定性;增量与迭代模型支持灵活调整,降低风险;敏捷模型则聚焦快速响应变化,通过短周期迭代实现持续交付,提升适应性与效率。

2026-10-28 01:05:50 136

原创 认识测试开发

软件测试是验证产品特性是否满足用户需求的全过程,贯穿开发全周期。测试类似选购衣物:外观、试穿、材质与价格均需检验。软件测试工程师侧重质量保障,而测试开发工程师则聚焦于开发自动化、性能测试等工具以提升效率。优秀测试人员需具备沟通、学习、开发及写作能力,掌握自动化技术,设计高效测试用例,并具备强烈责任感,全程把控产品质量。

2026-10-23 12:00:42 102

原创 [项目] --- 基于websocket的网页五子棋(可多用户)

本文介绍了基于WebSocket的网页五子棋项目开发全过程。项目采用Java+SpringBoot技术栈,利用WebSocket实现低延迟消息推送,替代高开销的HTTP轮询。通过数据库管理用户信息与天梯积分,设计按分数分层的匹配算法,结合线程安全队列实现公平匹配。对战模块支持实时落子同步,前端通过WebSocket接收并渲染棋局。最终完成部署,实现多用户在线对战功能。

2026-10-19 14:15:07 252

原创 理解Cookie / Session

本文介绍了Web开发中Cookie和Session的作用及区别。HTTP协议本身是无状态的,Cookie和Session用于解决服务器识别用户身份的问题。Cookie是客户端存储机制,保存不敏感信息(如用户偏好),容量较小;Session是服务器端存储机制,保存敏感信息(如购物车数据),安全性更高。两者通过sessionId关联:服务器生成sessionId通过Cookie发给客户端,客户端后续请求携带该Cookie以验证身份。Cookie适合存储长期非敏感信息,Session则用于重要用户数据。

2026-10-13 16:01:32 148

原创 谈谈HTTP

本文介绍了HTTP协议的核心内容,包括其应用场景、请求响应结构、URL组成、常见方法(GET/POST)及其区别。重点讲解了HTTP头部字段如Host、Content-Type、Cookie等的含义与作用,以及状态码分类(2xx成功、3xx重定向、4xx客户端错误、5xx服务器错误)。通过Fiddle抓包工具可直观观察HTTP通信过程。文章还涉及URL编码、查询字符串等细节,帮助开发者深入理解Web开发中的HTTP协议实现原理。

2026-10-08 09:54:39 269

原创 HTML浅浅入门

本文简要介绍了HTML基础标签的使用方法,主要包括:1)标题标签h1-h6的层级关系;2)段落标签p和换行标签br的区别;3)图片标签img的属性设置;4)超链接a标签的跳转功能;5)表格标签table的结构和属性;6)表单标签input的多种类型(文本、密码、单选、多选等)以及select下拉框和textarea文本域的使用。通过具体代码示例展示了各标签的基本语法和实际应用场景,为初学者提供了HTML入门的实用指南。

2026-10-05 16:04:19 237

原创 TCP十大核心机制详解

本文深入解析TCP协议的十大核心机制,包括确认应答、超时重传、连接管理、滑动窗口、流量控制等关键技术。TCP通过序列号和确认序列号确保可靠传输,采用滑动窗口提高效率,同时利用流量控制和拥塞控制动态调整传输速率。文章还详细讲解了TCP报文首部格式,包括端口号、序列号、控制标志等字段的作用,并探讨了异常情况下的处理机制,如心跳包检测和超时重传。这些机制共同保证了TCP协议的有连接、可靠传输、面向字节流和全双工特性,使其成为网络通信中的重要协议。

2026-09-27 15:06:07 242

原创 TCP连接管理:三次握手与四次挥手

摘要:本文讲解了TCP连接管理的核心机制,包括建立连接的三次握手和断开连接的四次挥手。三次握手通过交换SYN和ACK报文来验证通信链路、双方收发能力及协商参数,为可靠传输奠定基础。四次挥手过程中ACK和FIN能否合并取决于代码逻辑间隔。文章还介绍了TCP关键状态:LISTEN(服务器就绪)、ESTABLISHED(连接建立)、CLOSE_WAIT(等待关闭)和TIME_WAIT(确保ACK到达)。服务器大量TIME_WAIT状态表明存在频繁主动断开连接的情况。

2026-09-22 21:13:10 218

原创 UDP和TCP中的网络编程

本文介绍了传输层的两种协议UDP和TCP的特点及Java网络编程实现。UDP是无连接、不可靠传输的协议,面向数据报;TCP是有连接、可靠传输的协议,面向字节流。文章详细演示了如何使用Java实现UDP和TCP的回显服务器/客户端以及翻译字典服务器/客户端,包括服务器接收请求、处理响应、返回结果的完整流程。重点分析了TCP编程中缓冲区刷新、资源释放和多线程处理等注意事项。通过具体代码示例,展示了两种协议在网络编程中的实际应用和差异。

2026-09-09 21:56:54 279

原创 网络基础知识

本文介绍了网络通信的基本概念和TCP/IP五层模型。网络本质是机器间的通信,涉及局域网、广域网、路由器、交换机等设备。TCP/IP模型包含应用层(应用程序交互)、传输层(端到端通信)、网络层(路由选择)、数据链路层(相邻节点传输)和物理层(硬件传输)。以微信发送消息为例,详细说明了数据从应用层到物理层的封装过程,以及接收方的反向解析(分用)过程。文中还解释了通信五元组(协议类型、源/目的IP和端口)的概念,并对比了路由器和交换机处理数据的层级差异。

2026-06-14 21:07:01 153

原创 文件IO操作详解

本文介绍了文件IO操作的基本概念和Java中的实现方法。主要内容包括:1)路径类型(绝对路径和相对路径);2)文件分类(文本文件和二进制文件);3)文件系统操作(创建、删除、重命名等File类方法);4)文件内容操作(字节流和字符流的读写)。详细讲解了InputStream/OutputStream和Reader/Writer的使用方法,并提供了文件搜索和文件复制的实际应用示例。文章还介绍了try-with-resources语法简化资源管理,以及如何通过缓冲提高IO效率。

2026-03-16 17:07:01 383

原创 多线程(九)【锁策略】

本文系统介绍了多线程中的各种锁策略,包括乐观锁与悲观锁、重量级锁与轻量级锁、自旋锁与挂起等待锁等基本概念,并通过生动例子进行解释。重点分析了synchronized的特性及其锁升级机制(无锁→偏向锁→自旋锁→重量级锁),以及锁消除、锁粗化等优化技术。详细探讨了CAS原理、ABA问题及解决方案,并介绍了JUC包中的ReentrantLock、Semaphore、CountDownLatch等并发工具的使用场景。最后对比了HashMap、Hashtable和ConcurrentHashMap的线程安全实现方式,

2026-02-27 20:08:57 924

原创 多线程(八)【定时器】

本文介绍了Java中的定时器(Timer)及其实现原理。首先概述了定时器的应用场景,如客户端请求超时处理。然后讲解了标准库Timer类的使用方法,通过schedule()方法设置延迟执行任务。接着详细展示了如何手动实现一个定时器:使用优先级队列(PriorityQueue)管理任务,按照执行时间排序;通过线程轮询检查任务是否到达执行时间,利用synchronized保证线程安全。文章提供了完整的代码示例,包括任务类MyTimerTask和定时器类MyTimer的实现,演示了如何创建并执行延迟任务。

2026-01-20 22:27:28 360

原创 多线程(七)【线程池】

本文介绍了线程池的概念及其实现原理。线程池通过预先创建线程并保存在集合中,避免了频繁创建和销毁线程的开销,提高了效率。文章详细解析了线程池的构造对象,包括核心线程数、最大线程数、非核心线程空闲时间、任务队列、线程工厂和四种拒绝策略。同时介绍了Java标准库中封装好的多种线程池类型。最后通过代码示例展示了如何手动实现一个固定线程数的简单线程池,使用阻塞队列管理任务,并将线程设置为后台线程。线程池能有效管理系统资源,提高多线程程序的性能和稳定性。

2026-01-01 10:33:03 838

原创 多线程(六)【阻塞队列】

本文介绍了阻塞队列的概念及其在生产者-消费者模型中的应用。通过佩奇一家吃饺子的生动例子,阐述了阻塞队列的线程安全性和阻塞功能(队列空时阻塞出队,队列满时阻塞入队)。文章分析了阻塞队列的三大优点:降低资源竞争、解耦合和削峰填谷。详细讲解了Java标准库中三种阻塞队列的实现方式(数组、链表、优先级队列),并提供了使用示例。最后,作者手动模拟实现了一个基于数组的阻塞队列,展示了put和take操作的同步机制,重点说明了使用while循环而非if判断wait条件的重要性,以确保线程安全。

2025-12-27 11:07:46 1060 2

原创 多线程(五)【单例模式】

本文深入探讨了单例模式在多线程环境下的实现与优化。首先介绍了单例模式的概念及其必要性,特别强调了懒汉模式和饿汉模式的区别。重点分析了懒汉模式的线程安全问题及其解决方案:1)通过synchronized加锁解决原子性问题;2)通过双重检查锁定优化性能;3)使用volatile防止指令重排序。文章详细阐述了每个优化步骤的原理,包括编译器优化可能导致的指令重排序问题。最终呈现了一个线程安全且高效的懒汉模式单例实现方案,展示了从基础到优化的完整演进过程。

2025-12-21 12:18:53 921 2

原创 多线程(四)【线程安全问题】

本文系统讲解了Java多线程中的线程安全问题。主要内容包括:1)线程安全问题的定义,即多个线程共享资源时对同一变量修改产生的冲突;2)问题产生的4个主要原因:线程调度随机性、共享变量修改、非原子操作及内存可见性;3)使用synchronized加锁解决线程安全问题;4)死锁概念及其4个必要条件;5)打破死锁的两种方法;6)volatile解决内存可见性问题;7)wait/notify机制避免线程饿死;8)wait与sleep的区别。通过代码示例详细演示了各种线程安全场景及解决方案。

2025-12-15 12:10:23 1060 2

原创 多线程(三)【多线程的属性&方法】

本文详细介绍了Java线程的基本操作和状态管理。主要内容包括:1)线程命名和获取名称的方法;2)前台线程与后台线程的区别及设置;3)四种中断线程的方式;4)线程等待的join方法(死等和有限等待);5)线程的六种状态(NEW、RUNNABLE等)及其获取方法。通过代码示例演示了如何控制线程的生命周期和行为,为多线程编程提供了实用指导。文章还解释了前台/后台线程的概念区别,以及线程状态的获取和转换方法。

2025-12-08 08:43:35 712 2

原创 多线程(二)【多线程的创建】

摘要:本文介绍了Java中创建多线程的5种方法:1)继承Thread类重写run方法;2)实现Runnable接口;3)使用匿名内部类继承Thread;4)使用匿名内部类实现Runnable;5)lambda表达式写法。重点说明了start()与run()的区别:start()会创建新线程,而run()只是普通方法调用。同时解释了为何Thread.sleep()需要try-catch处理异常。lambda表达式写法因其简洁性被推荐使用。每种方法都配有示例代码,展示了如何在主线程外创建新线程执行任务。

2025-12-03 08:54:31 560

原创 多线程(一)【进程VS线程】

这篇文章总结了进程和线程的核心概念。可执行文件是未运行的应用程序,运行后成为进程。进程是操作系统资源分配的基本单位,通过PCB(进程控制块)描述其属性。进程调度分为并行(多核同时执行)和并发(单核轮转执行)。进程状态包括就绪态和阻塞态。由于多进程开销大,引入了更轻量的线程。线程是调度执行的基本单位,共享进程资源,创建和销毁开销更小。一个进程可包含多个线程,但线程过多会导致调度开销增加。进程之间相互隔离,而线程共享资源容易引发冲突。

2025-11-26 11:04:08 907 2

原创 JDBC入门:从驱动到增删改查

JDBC是Java为统一数据库操作而设计的应用程序接口(API),它简化了不同数据库的学习成本。使用JDBC操作MySQL需要:1)下载MySQL驱动jar包;2)将jar包导入项目lib目录;3)建立数据源、连接数据库;4)构造SQL语句(增删改用executeUpdate,查询用executeQuery);5)处理结果集;6)按创建顺序逆序释放资源。通过JDBC可以实现对数据库的增删改查等基本操作,如插入数据和查询表记录。关键步骤包括:设置数据源URL、建立连接、预处理SQL语句、执行操作并处理结果。

2025-11-18 08:47:07 958 1

原创 MySQL事务

事务是将多个SQL语句打包成一个执行单元,要么全部执行成功,要么全部回滚到初始状态(原子性)。事务具有四大特性:原子性、一致性(确保数据正确)、持久性(修改永久保存)和隔离性(防止并发问题)。隔离性问题包括脏读(读取未提交数据)、不可重复读(同一事务内读取结果不同)和幻读(查询结果集变化)。针对这些问题,数据库提供了四种隔离级别:READ UNCOMMITTED(最低隔离)、READ COMMITTED(解决脏读)、REPEATABLE READ(解决不可重复读)和SERIALIZABLE(最高隔离,解决所

2025-11-13 10:24:34 345 1

原创 MySQL索引

MySQL索引采用B+树作为数据结构,相比数组、二叉搜索树和哈希表具有更优的查询性能。B+树高度低、支持范围查询、叶子节点使用双向链表连接,且将非叶子节点缓存在内存中。索引创建方式包括建表时创建、ALTER和CREATE语句创建,但大表创建索引需谨慎以防性能问题。索引失效的常见情况包括:未使用索引列查询、索引列值单一、对索引列进行表达式计算、OR条件包含非索引列、模糊查询首字符为%、使用!=或NOT、字符集不一致以及复合索引使用不当。合理创建和使用索引能显著提升查询效率,但需注意避免上述失效场景。

2025-11-08 10:44:21 856 2

原创 MySQL联合查询

本文介绍了SQL中的四种表连接方式:1.笛卡尔积通过排列组合生成所有可能结果,需结合条件筛选有效数据;2.内连接(INNER JOIN)通过ON条件关联两表,仅返回匹配行;3.外连接分为左外连接(LEFT JOIN)和右外连接(RIGHT JOIN),分别以左/右表为基准保留不匹配记录;4.合并查询(UNION/UNION ALL)用于合并多个查询结果,前者去重后者保留重复。文中通过学生-班级-成绩等示例数据,详细演示了每种连接方式的具体SQL实现步骤和应用场景。

2025-11-04 11:26:41 594

原创 MySQL表约束

MySQL数据库约束机制详解 MySQL提供了多种数据约束来确保数据完整性和有效性,主要包括: 非空约束(NOT NULL)- 强制列不能为空值 默认值约束(DEFAULT)- 为列提供默认值 唯一约束(UNIQUE)- 确保列值不重复 主键约束(PRIMARY KEY)- 唯一标识每行记录(NOT NULL+UNIQUE) 自增主键(AUTO_INCREMENT)- 自动递增的PRIMARY KEY 外键约束(FOREIGN KEY)- 建立表间关联关系 检查约束(CHECK)- 设置数据验证规则(MyS

2025-10-29 08:50:52 709

原创 MySQL增删改查

2.)查询语文成绩有多少条记录,如果某位同学的语文成绩为null则不会记录。我们先创建一张成绩表,里面包含姓名,语文成绩,数学成绩,英语成绩。4.)查询语文成绩 > 80 分并且英语成绩 > 80分的同学。7.) 查询数学成绩在78, 79, 80, 81,82的同学。2.)将曹孟德的语文成绩改为10086分,英语成绩改为1分。5.)查询语文成绩 > 80或英语成绩 > 80的同学。5.)查看语文成绩最高分, 英语成绩最低分。1.)语文成绩 > 80 分的同学才显示。2.)查询语文成绩高于英语成绩的同学。

2025-10-23 14:27:31 700

原创 MySQL基础命令

可以看到我当前选中的数据库中有class表,course表, grade表, score表, student表。2.)修改列表信息,将刚刚新增的列class_id 的int类型修改为bigint。可以查看我们当前的数据库中有多少个数据库,其中里面有MySQL自带的数据库。1.)新增列(class_id),增加到性别的后面。1.)根据创建表时,依次根据列名进行插入。查看我们刚刚对student表插入的数据。在实际开发中,对表的删除要慎重考虑!查看我们选中的数据库中有多少表。3.)一次性多行插入。

2025-10-20 15:01:16 189

原创 MergeSort

归并排序是一种稳定且高效的排序算法,时间复杂度为O(nlogN),空间复杂度O(n)。它采用分治法思想,通过递归将数组分解为子序列排序后合并。核心步骤包括:分解数组、递归排序子序列、合并有序子序列。算法实现中需要创建临时数组存储排序结果,最后将排序好的元素拷贝回原数组。示例代码展示了归并排序在Java中的实现,通过递归分解数组并使用二路归并策略合并有序子序列,最终输出排序结果。测试案例验证了算法能正确将乱序数组排序为有序序列。

2025-10-16 14:33:15 193 1

原创 HeapSort

摘要:本文介绍了堆排序算法的实现过程。堆排序是一种不稳定的排序算法,时间复杂度为O(nlogN),空间复杂度为O(1)。通过创建大根堆,将堆顶最大元素与末尾元素交换并调整堆结构,重复此过程最终得到升序数组。代码示例展示了完整的堆排序实现,包括创建堆、向下调整等核心方法,并通过测试验证了排序效果。

2025-10-15 11:40:07 217 1

原创 SelectSort

本文介绍了选择排序算法,这是一种不稳定的排序方法,时间复杂度为O(N^2),空间复杂度为O(1)。其核心思想是每次遍历找出未排序部分的最小元素,并与当前元素交换位置。文中给出了Java实现代码示例,通过双重循环实现:外层循环控制排序轮数,内层循环寻找最小值下标。若找到更小值则更新最小下标,每轮结束后交换当前元素与最小值位置。该实现展示了选择排序的基本流程和关键操作。

2025-10-14 10:47:19 249

原创 ShellSort

摘要:Shell排序是一种不稳定的排序算法,时间复杂度在O(N^13~N^17)之间,空间复杂度为O(1)。其不稳定性源于多次插入排序可能改变相同元素的相对位置。代码示例展示了通过分组(gap)逐步缩小间隔的排序过程,每组内进行插入排序,最终完成整个数组的排序。关键步骤包括确定初始gap值,分组比较交换元素,并逐步缩小gap直至1完成排序。

2025-10-13 11:08:37 185 1

原创 InsertSort

本文介绍了插入排序算法,通过扑克牌排序的日常例子说明其应用场景。算法具有稳定性,空间复杂度为O(1),时间复杂度为O(n^2)。文章提供了Java实现代码示例:初始化数组后,通过外层循环控制待插入元素,内层循环比较并移动元素完成排序,最终输出排序结果。代码展示了插入排序"将每个元素插入到已排序部分的正确位置"的核心思想。

2025-10-11 11:17:07 235

原创 BubbleSort

摘要:本文展示了Java实现的冒泡排序算法,时间复杂度为O(n²),空间复杂度O(1),是稳定排序。通过双重循环比较相邻元素并交换位置,并使用flag标志优化,当某一轮未发生交换时提前结束排序。示例对数组{26,28,24,11}进行排序,输出排序前后的数组内容。

2025-10-10 14:15:49 171

原创 Queue的模拟实现

本文介绍了队列的基本操作及其链表实现方式。队列是一种先进先出(FIFO)的数据结构,主要包含四个核心操作:1)从队尾插入元素;2)从队头删除元素;3)获取队头元素;4)获取队列元素个数。通过链表实现时,每个节点包含prev、next指针和val值。具体实现包括:使用first/last指针记录队首队尾,useSize记录元素数量;插入时处理空队列情况;删除时需判断队列状态并更新指针;获取队头元素需先检查队列是否为空;元素个数直接返回useSize值。这些操作完整展现了队列的基本特性和实现原理。

2025-09-28 10:53:06 355

原创 Stack的模拟实现

本文介绍了使用数组模拟实现栈的四个基本操作。1)插入元素时需要判断数组容量,必要时扩容并更新useSize;2)查看栈顶元素需先检查栈是否为空,再返回useSize-1位置的元素;3)删除栈顶元素前需检查栈空状态,保留元素后更新useSize;4)直接返回useSize即可获取栈元素个数。栈遵循先进后出原则,通过useSize标记有效实现了栈的核心特性。

2025-09-26 11:22:04 254

原创 LinkedList模拟实现

本文介绍了链表的基本操作实现方法。首先阐述了链表的结点结构,由值域(val)和指针域(next)组成。然后详细讲解了六种链表操作的实现:1)头插法,需判断链表是否为空;2)尾插法,需要找到最后一个结点;3)任意位置插入,要处理位置合法性及头尾特殊情况;4)查找操作,遍历链表查找指定值;5)删除第一次出现的指定值,需处理头结点特殊情况;6)删除所有指定值,需要额外处理头结点。所有操作都强调了链表为空时的边界条件处理,并注意保持头指针的正确性。实现时要注意避免使用头指针直接遍历,防止丢失链表起始位置。

2025-09-25 22:00:00 399

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除