- 博客(65)
- 收藏
- 关注
原创 测试分类介绍
今天小编来介绍下测试分类。那么为什么要有这个测试分类呢?软件测试是软件生命周期中的一个重要环节,具有较高的复杂性,对于软件测试,可以从不同的角度/维度加以分类,使开发者在软件开发过程中的不同层次,不同阶段对测试工作进行更好的执行和管理测试的分类方法。
2025-10-31 15:13:36
360
原创 BUG与测试用例
定义:一个计算机bug指在计算机程序中的一个错误、缺陷、疏忽或故障,这些bug使程序使无法正确的运行。Bug产生于程序的源代码或程序设计阶段的疏忽或者错误那么回归到软件测试中呢,bug可以更加准确来说:1.当且仅当需求规格说明书是存在的并且正确,程序与规格说明之间的不匹配才是错误2.当需求规格说明书没有提到的功能,判断标准以最终用户为准,当程序没有实现其最终用户合理预期的功能要求时,就是软件错误如何描述一个Bug以下是一个基础骨架要素说明示例1. 出现的版本(Version)
2025-10-31 15:08:39
1297
原创 认识软件测试
软件测试开发工程师:是介于传统测试工程师与开发工程师直接的角色,不仅负责测试策略与用例设计、还具有较强的编码能力、开发自动化测试框架、工具、脚本,以提升测试效率和质量保障能力。敏捷模型是一种以人本、协作、响应变化和可工作软件为核心的软件开发方法论,强调小步快跑、持续交付、快速反馈,它不是单一的模型,而是一类方法的统称。2.迭代计划会议:项目团队对每一个story进行任务分解,分解的标准是完成该story的所有任务,每个任务都有明确的负责人,并完成工时的初步预估。它是开发和测试工作的直接依据。
2025-09-30 22:51:12
887
原创 浅谈WebSocket
与传统的HTTP不同,HTTP是客户端发出请求,服务端做出相应,一问一答是形式,而WebSocket在建立连接后,客户端和服务器可以任意时刻互相发送数据,而无需重复建立连接,极大程度下,减少了通信开销。一些普通的网站还好,像一些实时性较强的,比如一些网页游戏、股票网站之类的,难道我们想获取数据,就一直刷新页面吗?但是后端有数据更新了,我们需要查看实时的数据的话,此时,需要刷新操作,来重新获取后端返回的数据。在我们日常访问一些网站的时候,我们会点击某个页面,或是点击某个板块,才出现对应的信息。
2025-09-30 22:29:52
725
原创 Java Web部署
今天小编来分享下如何将本地写的Java Web程序部署到Linux上。小编介绍两种方式:部署基于Linux Systemd服务、基于Docker容器化部署首先部署基于Linux Systemd服务那么部署之前,要对下载所需的环境。
2025-08-16 18:31:30
821
原创 SpringAOP:代码增强术
与JDK动态代理不同,CGLIB通过继承的方式实现代理对象,即它会生成目标类的子类来覆盖目标类的方法,以此达到增强目的方法的功能。它是一种结构性设计模式,它允许你提供一个代替对象(即代理对象),来控制对某个其他对象(即目标对象)的访问,代理模式可以用来执行额外的操作,比如延迟初始化,访问控制,日志记录,而不需要改变原始对象的行为或接口。显然是没有看到doThrowing返回的,这是因为,t1方法中没有出现异常,同时也可以观察到,Around通知级别是最高的。
2025-07-16 20:38:27
938
原创 Spring事务与事务传播机制
创建一个新的事务,如若当前存在事务,则把当前事务挂起,也就是说不管外部方法事务是否开启,当前方法设置该属性后,该方法都会新开启自己的事务,且开启的事务相互独立,互不干扰。所以开启了一个新事务,新事务与其他事务独立,此时logservice遇到异常了,所以只会是logservice中事务回滚,不涉及到userservice。的注解,用于在方法或类上标注,让 Spring 自动在方法执行前开启事务,在方法执行成功后提交事务,如果方法抛出异常,则回滚事务。是范围小,代码抛出的异常是范围大。
2025-07-16 20:38:20
753
原创 Mybatis-Plus简单介绍
同时想要更多的详细信息,了解select提供的参数,可以访问官网了解:https://baomidou.com/guides/data-interface/#select。Mybatis-Plus简称MP,它是一个Mybatis的增强工具之一,在Mybatis的基础上只做增强不做改变,为简化开发而生。WRAPPER="ew",写上这个,是告诉Mybatis-plus,这个是Wrapper对象,并且它的参数固定名为。那么值得注意的是,查询出来的结果及其结果样式,与上篇文章查询的结果,区别不大,所以不做展示。
2025-05-31 22:58:31
977
原创 Mybatis:灵活掌控SQL艺术
Navicat 是一款功能强大且广受欢迎的数据库管理和开发工具,支持多种数据库系统。它由 PremiumSoft CyberTech Ltd. 开发,并面向数据库管理员、软件开发者等专业人士设计,旨在简化数据库管理流程,提高工作效率。
2025-05-31 22:52:30
1149
原创 Spring配置文件及其日志
Properties#整数类型my.key=1#布尔类型#字符串类型取值:引入@Value注解,该注解会找到对应的属性值绑定到当前的变量值中Java@Component//取配置文件值//这些属性被注入完后,就会执行这个方法System.out.println("参数1:"+ret1);System.out.println("参数2:"+ret2);System.out.println("参数3:"+ret3);
2025-05-11 10:46:40
1198
原创 SpringIoC And DI
简单来说,在传统编程中,你的代码是主动控制对象的创建和依赖的调用,在IoC中,这样的控制权被“反转”给了框架(Spring),由它来控制对象的创建和依赖注入。每个类构造方法参数中,不提供具体数值,而是提供相对应的对象,那么修改的时候,也是对一个被引用类中的内容进行修改,引用类中不需要做出修改。所以在这个例子中,想要修改tire的参数,那么就在tire类中修改即可,其他组成类,比如bottom类就不需要再动了。通过这个五大注解,只是呢,提取到了,一个类,如若是一个类中,也包含了其他对象呢?
2025-05-11 10:35:59
822
原创 从请求到响应:初探spring web
这个RequesParam注解也是可以设置参数的,此时呢,我在代码中写required=f=alse,这个是说明这个age参数不是必传的,而name参数中,没有设置,那么它就是默认为true它就是要必传的,还有,如若这个注解中,什么参数都没有,此时就可以默认为前端传来的参数和方法中的参数是一致的。这是因为在Springboot中,使用@RequestMapping接收参数时,如果是一个自定义对象,Spring会自动进行参数绑定,将http请求中的查询参数或表单数据映射到对象的属性上。
2025-05-01 17:05:39
830
原创 Maven与Springboot创建
比如当maven从中央仓库拉取依赖的时候,发现多次出现拉去失败,或者拉取缓慢,那么此时呢,就可以找到这个setttings文件,修改下镜像仓库地址,比如使用阿里云的仓库,加快下载。那么引入jar的包过程,其实呢是比较麻烦的,特别是以后进行项目开发的时候,一个个的引入jar包,那是基本不太可能的,所以,为了解决这些“障碍”,项目管理工具就应运而生了。但是呢,手动去一个个寻找,一个个写排除依赖语句,我们会发现这是比较慢的,也费点精力,所以此时呢,可以借助一个插件。
2025-04-18 09:12:12
1656
原创 探秘JVM内部
在这个阶段中呢,jvm根据类权限定名(包名和类名)从字节码文件(.class文件)中,加载类的内容,形成一个class对象,此时,jvm将从字节码文件读入内存,并创建一个代表该类的class对象。当你项目定义的一个类个原有JDK中的某个类,重合了,此时呢,执行单亲委派模型的时候,就会只会加载JDK中类,自己写的类,不会生效,从而不会对项目中造成负面破坏。还有其它条件进行,判断,比如此时存活区中,所有对象大小超过一定比例,那么此时,不会等待某些对象进行年龄增长,而是让较大的年龄对象,直接晋升到老年代。
2025-04-06 20:44:59
702
原创 网络探索之旅:网络原理(第三弹)
通俗的来说,点外卖支付的时候,因为网络卡顿,点击了两次支付按钮,但此时只会生成一个支付订单,商家也只会收到一个订单。对于浏览器保存的cookie,也是手动删除的,删除过后,再次请求,响应就会再次设置cookie。但是,黑客已经入侵这个路由器了,所以,我发的密钥也是无用了,毕竟黑客获取到后,拿解密就行了。HTTP/3.0:最新的HTTP规范,与前面不同的是,它使用的是UDP传输而不是TCP传输。这两个东西是比较有意思的,就是说POST使用的场景,GET也是可以使用的,GET使用的场景。
2025-04-05 00:28:10
896
原创 网络探索之旅:网络原理(第二弹)
这是为了如若,传输目的是错误的,即IP地址是不存在的,如若一直是发送当前的数据包,就会占用网络带宽资源,所以生存时间规定它只能存活多长时间,时间到了,就被当前的路由器丢弃。当一个很大的数据包需要通过分片传输时,每个分片都会携带相同的“标识”值,以便接收端区分哪些数据包是一个原始数据包的,并正确的讲它们组合在一起。公网:公网指的是开放给所有人访问的网络,最典型的例子就是互联网。前四位代表的是网络号,最后一位1代表的是主机号(同一网段下,网络号相同,主机号不同,不同网段下,网络号必须不同)
2025-03-29 19:21:07
1072
原创 网络探索之旅:网络原理
这个ack报文同时涉及到另一个事“延时应答”,那么此时,没有立刻返回,而此时,业务数据在这个延时时间内完成了计算,要返回了,所以此时,ack报文信息,就不用单独返回了,就直接合并在业务数据中直接返回即可。实际情况是发送方第一次重传的时候,超时时间是t1,重传过后,任然是没有ACK返回,此时还会继续重传,此时的重传时间是t2,而这个t2 往往是 大于 t1的,以此类推。比如,当前接收方的缓冲区满了,暂时不需要发送数据过来处理,此时呢,就会把当前的ack报文中窗口大小设置为0,告诉发送方,缓冲区满了。
2025-03-25 17:34:59
813
原创 网络世界探索之旅:网络编程
那么在之前呢,小编也是介绍到了网络的一些相关知识,特别是TCP/IP模型,也是着重介绍了一番。那么今天小编要分享的是基于TCP、UDP的网络编程。那么对于网络编程,这个又是个什么东东呢?网络编程:是指编写能够通过计算机网络进行通讯的程序。那么接下来的网络编程讲解,将以服务器和客户端的模型来展开。服务器:是指在网络上提供资源和服务的计算机或程序。可以是一台物理机器,也可以是在多台机器上运行的软件。客户端:是指那些用来访问服务器提供的资源和服务的应用程序或设备。
2025-03-22 20:28:47
862
原创 网络世界探索之旅:初始网络
此时网络层也是接近底层了,所以此时呢,我们对于些个细节方面,系统提供的API也是完善好了,所以对于这些个调用过程,我们无需担心了,传输层会干它该干的活的。这是因为,如若我们网络中,两个主机之间发送的数据,其解析数据的时候,它们解析的标准是各自独有的,那么此时的网络通信变得毫无意义是,就像是鸡同鸭讲。这是因为,TCP/IP模型是早于OSI模型,在二十世纪七十年代,随着ARPANET的普及而去广泛使用了,OSI模型则是在二十世纪八十年代提出的。在网络诞生的时候,网络可是个“稀罕”玩意,在军事领域中。
2025-03-14 13:09:53
639
原创 探索文件IO奥秘:操作文件IO
此时呢,如若不主动释放资源,一直添加,而这个表呢,也是有限的空间,填满后,后续打开文件的操作就会失败,而不主动释放的资源,导致的问题呢,也就叫“文件资源泄露”这样的格式也是没有问题,但是,使用完InputStream这个操作之后,那么我们最后一定要调用close()方法,关闭资源操作,但也不排除真忘了。而上面讲到的四个类,它们是抽象类,真正在工作的,并不是它们,而是众多实现它们的类。那么有了文件之后,我们肯定是要对它”动手动脚“的,所以接下来分享的是文件的操作。值得注意的是,这里的输入/输出是认为的定义。
2025-03-05 20:36:27
906
原创 探索文件IO奥秘:初识文件
exFAT:设计用于闪存驱动器,解决了FAT32的一些局限性,如支持更大的文件大小和分区大小,但缺乏高级的安全功能。Btrfs:新一代的文件系统,旨在解决ext系列文件系统的局限性,提供快照、透明压缩、子卷管理等高级功能。FAT32:较老的文件系统,兼容性好但有单个文件最大4GB的限制,并且不支持很多现代的安全特性。这些文件按照一定的格式命名,并存储在特定的目录中,操作系统或者应用程序能够正确访问。值得注意的是,由于是需要移动读写头,所以其速度是较低的,同时其耐用可靠性也不是很高,
2025-03-04 22:20:26
663
原创 多线程之旅:锁策略(2)
drainPermits():获取并返回立即可用的所有许可,即消耗所有许可,即原本有三个信号量,那就调用这个方法后,所有许可没有了,执行acquire就会阻塞,直到释放一个许可。既然是一条cpu指令执行操作,就是很大程度上避免了多线程编程,也多线程编程提供这样的一个思路,就是无锁化编程,毕竟加锁操作,是要增加资源开销的。ok,一套下来,诶发现这个CAS是不是还挺好用的,但是呢,一个事物有好的一面,也有不好的一面。这个代码就是说,让一共有20个任务,然后线程池中存储4个任务,submit执行完任务后,
2025-02-28 19:36:30
996
原创 多线程之旅:锁策略
小编假设这个女孩子是不忙的,所以小编是直接找到女孩子了,然后就问她可不可以一起看电影,如若是真的不忙,还答应了,那就一起去了,此时如果是忙的,那么就下次再来(我们是没有加锁的,但是此时也是可以得到访问冲突了)悲观锁:假设并发冲突是频繁发生的,此时呢,没有更新数据之前,就可以加锁,从而导致其他线程无法访问该资源。那么这个锁策略是比较广泛的内容,包括不限于锁的类型、锁的粒度、锁的实现方式、锁的公平性等。我下午2点钟约你看电影行不?值得注意的是,这个锁升级的过程,它不是可逆的,只能一步步变“大”,变“重”
2025-02-27 21:22:03
707
原创 多线程之旅:线程池与定时器
ok,今天小编接着来介绍下线程池与定时器。那么,同样的请出我们今天的第一位主角那么之前小编分享过了如何创建线程和启动线程了,那么为什么还需要个线程池呢?回到最初讲到线程的时候,线程为什么要引入呢?这是因为进程太“重”,频繁的进行创建销毁,需要消耗资源较大。此时就引入了线程。同样,随着业务量对性能要求的提高,此时线程不断的频繁创建销毁,那么此时这笔开销,就显的不能忽略不计了。那么这就引入了一个线程池。。线程池,就是提前从系统那边申请好线程资源,放到一个地方,此时,后面谁需要线程就从这里取。
2025-02-19 10:50:55
937
原创 多线程之旅:单例模式以及生产者消费者模型
这是因为,加锁操作也是会消耗资源,那么此时如若再次调用这个方法,还得加锁一次,所以造成一定性能浪费,不如在外面套个判断语句,进行提高点效率。所以为了解决这个问题,那么我们此时可以在两个服务器中间,设置一个容器,起到一个过度、缓冲作用。此时在多线程环境中,会出现线程安全问题了,为了解决这个问题,所以分别在这两个方法进行加锁操作。此时,原本没有容器的时候,服务器A与服务器B的耦合度较高,加入容器后,耦合度就会下降。那么某一时刻,传给服务器A的流量突然增大,此时服务器A的流量也要流入到服务器B,
2025-02-16 21:04:17
739
原创 多线之旅:wait 与 notify
1.notify需要在同步方法或者同步块中使用,因为该方法是去通知可能等待该对象的对象锁的其他线程,并使它们重新获取锁资源。3.notify方法执行完后,不会立即释放当前锁资源,而是还会等到同步方法,或者同步块执行完。在多线程环境下,由于线程调度的不确定性,所以我们有时候无法很好的去保证其线程的执行顺序。2.如若是多个线程进行等待,那么此时唤醒线程,也是随机的,没有所谓的“先来后到之说”唤醒后,所有线程需要重新获取锁,获取锁的过程是系统决定,依然是具有不确定性。A线程,打印A,B线程中等待,C等待B线程。
2025-02-14 17:23:24
471
原创 B-树:解锁大数据存储和与快速存储的密码
这是因为,我们二叉树中,一个节点只保存了一个数据域,此时遇到非常大数据量的时候,导致树高变得很高,进行遍历查询树的时候,需要遍历树较深的地方,当然,查询的数据如若是在较浅树层,那么查询的时间还好,如若是非常深,那么此时查询的时间就会变得很耗时。那么此时就到了53这棵树这里,此时显然,54也是不在这里的,那么此时我们按照逻辑,还是得去子树再找,那么这里呢,没有子树了,所以导致我们寻找节点变为null了。这里值得注意的是,上述节点图例,是一般情况下的,为了后续插入操作简易进行,所以节点内部会进行修改。
2025-02-01 23:58:48
1180
1
原创 多线程之旅:开启多线程安全之门的钥匙
意思就是说,加锁的时候判定下,当前这个锁是否是被占用状态,是被哪个线程占用了,如若是当前线程对这个锁进行多次加锁,此时后续的加锁将不会进行真正的加锁操作。所以,我们可以这样子,这个房间内我加一把锁,A进去之后,锁住房间,期间内不能让其他人进去,等A说完后,再把锁给其他人,按照刚刚的方法。就是说呢,A、B、C三个线程,然后,A线程执行完,下次系统分配资源执行的时候,不知道是B先执行,还是C先执行,具有不确定性。值得注意的是,锁是不可被抢占,一个线程拿到了锁,其他线程要想拿到这个锁,必须等待这个锁被释放。
2025-01-22 23:26:51
910
原创 多线程之旅:线程安全问题
这两个是独立操作,即变量中,没有依赖关系,那么此时,编译器有可能把flag = true,放到numbe = 42之前执行,此时很显然,如若出现这样的情况,那么t2线程中的if语句就会为真,执行打印代码。但是,t2线程中,当用户执行输入的时候,n的值改变,这个值是写回到内存中的,t1线程读取n的值,是在寄存器中了,很明显,位置不一样,t1线程感知不到n的变化,那么就无法结束while循环。我们之前说过线程的调度是具有不确定性的,所以执行的结果如若没有锁的加持下,结果也是不唯一。
2025-01-21 22:34:25
1103
原创 探索数据缓存——
Cache不像内存那样有很多空间,所以,当Cache的容量用完后,而又有新的内容需要添加进来的时候,就需要挑选并舍弃原有的部分内容,从而腾出空间放新的内容。LRU是LeastRecentlyUsed的缩写,译为最近最少使用的,所以合起来意思是最近最少使用的缓存,它是一种Cache替换算法。还有值得注意的是,如若我们放入的个数是大于了我们默认给定的初始值,那么就会删除头节点,然后再把新插入节点放入到尾节点去。链表的插入和删除的复杂度也是比较快的,也是O(1),这里指的是头尾操作噢~
2025-01-18 14:00:28
696
原创 探秘并查集——数据世界的“社交圈”
思路:核心是要修改合并两个元素对应位置的数据,例:合并0和1两棵树,那么此时0下标的数值绝对值要变大,1的父亲边成了0。在这之前,我们通过这个场景引入,可以了解到,其底层是一个数组构成的,那么初始化的时候,其编号下标值设置为-1。我们可以观察到,如若是树的孩子节点,那么此时,对应数组下标值是根节点的索引值。那么,到了出发去学校的日子,此时,三个地方组成三个小分队,即三个小集合。现在对这些人进行编号:0,1,2,3,4,5,,6,7,8,9。值得注意的的是,我们查询的是孩子节点,即是大于0的值。
2025-01-17 12:55:17
307
原创 高效查找的秘密武器二:布隆过滤器
布隆过滤器,是由布隆在1970年提出的一种紧凑型,比较巧妙的概率型数据结构,其特点就是高效的插入和查找,它可以告诉你一样东西一定不存在,或者可能存在,它是由多个哈希函数通过映射关系到位图中的,大大的节省了存储空间。注意add的时候,是六个哈希函数,那么对应的是六个比特位被设置了,所以检查的时候,也要加检查六个比特位是否都是1,但凡有一个不是,那么这个字符串是不存在的。在这个类里面呢,我们就要进行哈希函数的创建了,那么这个哈希函数呢,又得是不同哈希函数,可不敢一样的,一样的话,那就全部哈希到一个位置了。
2024-12-07 19:46:25
1077
原创 高效查找秘密武器一:位图
其实不然,电脑上不单单只是跑这个程序,后面还有很多,比如微信啊,爱奇艺什么的,所以一般来说,这么大容量放到16G的电脑内存是不太现实的。当前的i=0,因为我们输出的数字是5,在字节数组的0下标,当j从下标开始遍历,j=5时,就可以输出这个数字5了。那么此时此刻,我们再次细想一下,这些方法一般放在内存中进行的,那么40亿个不重复的无符号整数,有多大容量呢?比如,我们set方法,参数传入一个数字的话,如若数字给到的是<0的数字,那么此时是不符合我们位图的。适用于海量数据,整数,数据无重复的场景。
2024-12-06 20:13:38
721
原创 红与黑的秘密——红黑树
上次小编分享了AVL树那么这个AVL树呢,由于涉及到比较多的旋转,所以呢,一旦进行了对的树的修改操作就显得性能较为低下,所以AVL树呢,一般适合静态数据的查找。那么有没有一种既可以较为高效的查找,且也对树的结构进行操作,但并没有造成性能较为低下的数据结构呢?那么此时主角登场——红黑树那么红黑树是什么呢?这个红黑树也是一种二叉搜索树,但是呢,在每个节点上增添一个可以表示节点颜色的存储位,那么可以表示Red、Black,并满足一定的条件来保证树的平衡。
2024-11-29 09:01:47
728
原创 探秘计算机内部秘密
说起计算机,那么大家几乎都不陌生它,在日常生活中,它可是起着重要作用呢。那么,今天小编就来献献丑,带着大家深入些了解下吧。计算机中文名字:电子数字积分和计算器同时,最初的用途,更多是用于军事,比如计算弹道的轨迹的,直到第四代超大规模集成电路计算机研制成功,即二十世纪七十年代,才开始广泛应用于民用方面。那么,这个研发人员有谁呢?这些呢,是主要的研发人员。此时我们可以发现一个熟悉的名字,冯诺依曼。
2024-11-24 11:01:14
820
原创 二叉搜索树进阶——AVL树
如若当前节点不为空,那么判断下当前的节点值和插入的节点值,当前的节点值大于插入的节点值,那么就往左边寻找,反之,就从右边寻找,如果等于,那就退出,不能插入相同的节点值。假设我们要插入的是18这个节点,那么插入之后,就要让18的父亲节点保存此时的parent,此时的parent是15这个节点。此时发现,我们图A定义的节点中,subR的平衡因子等于-1,parent的平衡因子等于0,subRL的平衡因子等于0。因为在25这个节点进行插入的时候,插入25左节点和右节点,其情况是不一样的,对应的就有两个图了。
2024-11-20 21:56:41
898
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅