测试分类篇
文章目录
- 目录
- 1. 为什么要对软件测试进行分类
- 2. 按照测试目标分类
- 2.1 界面测试
- 2.2 功能测试
- 2.3 性能测试
- 2.4 可靠性测试
- 2.5 安全性测试
- 2.6 易用性测试
- 3. 按照执行方式分类
- 3.1 静态测试
- 3.2 动态测试
- 4. 按照测试方法分类
- 4.1 白盒测试
- 4.1.1 语句覆盖
- 4.1.2 判定覆盖
- 4.1.3 条件覆盖
- 4.1.4 判定条件覆盖
- 4.1.5 条件组合覆盖
- 4.1.6 路径覆盖
- 4.2 黑盒测试
- 4.3 灰盒测试
- 5. 按照测试阶段分类
- 5.1 单元测试
- 5.2 集成测试
- 5.3 系统测试
- 5.3.1 冒烟测试
- 5.3.2 回归测试
- 5.4 验收测试
- 6. 按照是否手工测试分类
- 6.1 手工测试(Manual testing)
- 6.2 自动化测试(Automation Testing)
- 6.3 自动化测试和手工测试优缺点
- 7. 按照实施组织划分
- 7.1 α测试(Alpha Testing)
- 7.2 β测试(Beta Testing)
- 7.3 第三方测试
- 8. 按照测试地域划分
- 8.1 国际化测试
- 8.2 本地测试
目录
- 为什么要对软件测试进行分类
- 按照测试目标分类
- 按照执行方式分类
- 按照测试方法分类
- 按照测试阶段分类
- 按照是否手工测试分类
- 按照实施组织划分
- 按照测试地域划分
1. 为什么要对软件测试进行分类
软件测试是软件生命周期中的一个重要环节,具有较高的复杂性,对于软件测试,可以从不同的角度加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试工作进行更好的执行和管理测试的分类方法。
2. 按照测试目标分类
2.1 界面测试
软件只是⼀种工具,软件与人的信息交流是通过界面来进行的,界面是软件与用户交流的最直接的一层,界面的设计决定了用户对我们设计的软件的第一印象;界面如同人的面孔,具有吸引用户的直接优势,设计合理的界面能给用户带来轻松愉悦的感受。
界面测试(简称UI测试),指按照界面的需求(一般是UI设计稿)和界面的设计规则,对我们软件界面所展示的全部内容进行测试和检查,一般包括如下内容:
- 验证界面内容显示的完整性,一致性,准确性,友好性。比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示
- 验证整个界面布局和排版是否合理,不同板块字体的设计,图片的展示是否符合需求
- 对界面不同控件的测试,比如:对话框,文本框,滚动条,选项按钮等是否可以正常使用
- 有效和无效的状态是否设计合理
- 界面的布局和色调符合当下时事的发展
2.2 功能测试
功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。
根据产品特性、操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求。本地化软件的功能测试,用于验证应用程序或网站对目标用户能正确工作。使用适当的平台、浏览器和测试脚本,以保证目标用户的体验将足够好,就像应用程序是专门为该市场开发的一样。功能测试是为了确保程序以期望的方式运行而按功能要求对软件进行的测试,通过对一个系统的所有的特性和功能都进行测试确保符合需求和规范。
如何进行功能测试?
设计功能测试用例,参考产品规格说明书进行用例的编写,具体的测试用例需要使用黑盒设计测试用例的方法,如等价类、边界值、判定表法、正交法、场景法、错误猜测法等。
2.3 性能测试
我们在使用软件的时候有时会碰到软件网页打开时越来越慢,查询数据时很长时间才显示列表,软件运行越来越慢等问题,这些问题都是系统的性能问题引起的。
要测试软件产品的性能问题,要对产品的性能需求进行分析,然后基于系统的性能需求和系统架构,完成性能测试的设计和执行,最后要进行持续的性能调优。
2.4 可靠性测试
可靠性(Availability)即可用性,是指系统正常运行的能力或者程度,一般用正常向用户提供软件服务的时间占总时间的百分比表示。
可靠性 = 正常运行时间 /(正常运行时间 + 非正常运行时间)* 100%
系统非正常运行的时间可能是由于硬件,软件,网络故障或任何其他因素(如断电)造成的,这些因素能让系统停止工作,或者连接中断不能被访问,或者性能急剧降低导致不能使用软件现有的服务等。
可用性指标⼀般要求达到4个或5个“9”,即99.99%或者99.999%
如果可用性达到99.99%,对于一个全年不间断(7*24的方式)运行的系统,意味着全年(252600min)不能正常工作的时间只有52min,不到一个小时;如果可用性达到99.999%,意味着全年不能正常工作的时间只有5min。
不同的应用系统,可用性的要求是不一样的,非实时性的信息系统或一般网站要求都很低,99%和99.5%就可以了,但是军事系统,要求则很高。
2.5 安全性测试
安全性是指信息安全,是指计算机系统或网络保护用户数据隐私,完整,保护数据正常传输和抵御黑客,病毒攻击的能力。
安全性测试属于非功能性测试很重要的一个方面,系统常见的安全漏洞和威胁如下:
- 输入域,如输入恶性或者带有病毒的脚本或长字符串
- 代码中的安全性问题,如SQL/XML注入
- 不安全的数据存储或者传递
- 数据文件,邮件文件,系统配置文件等里面有危害系统的信息或者数据
- 有问题的访问控制,权限分配等
- 假冒ID:身份欺骗
- 篡改,对数据的恶意修改,破坏数据的完整性
安全性测试的方法有代码评审,渗透测试,安全运维等,常用的静态安全测试工具有:Coverity,IBM Appscan Source,HPFortify,常用的动态安全测试有:OWASP的ZAP,HP WebInspect等。其中静态安全测试是常用的安全性测试的方法。
2.6 易用性测试
许多产品都应用人体工程学的研究成果,使产品在使用起来更加灵活和舒适。软件产品也始终关注用户体验,让用户获得舒适,易用的体验,针对软件这方面的测试称之为易用性测试。易用性在ISO25020标准中指容易发现,容易学习和容易使用。易用性包含七个要素:符合标准和规范,直观性,一致性,灵活性,舒适性,正确性和实用性。我们主要讨论以下几个方面:
- 标准性和规范性
对于现有的软件运行平台,通常其UI标准已经不知不觉地被确立了,成为大家的共识。多数用户已经习惯并且接受了这些标准和规范,或者说已经认同了这些信息所代表的的含义。比如安装软件的界面的外观,在什么场合使用恰当的对话框等。
所以用户界面上的各中信息应该符合规范和习惯,否则用户使用起来会不舒适,并得不到用户的认可。
测试人员需要把与标准规范,习惯不一致的问题报告为缺陷。
- 直观性
用户界面的直观性,要求软件功能特性易懂,清晰,用户界面布局合理,对操作的响应在用户的预期之中。比如数据统计结果用报表的形式(条形图,扇形图等)展示清晰直观,现在主流的很多搜索引擎和日历的设计也有直观性的特点。
- 灵活性
软件可以有不同的选项以满足不同使用习惯的用户来完成相同的功能。但是灵活性的设计要把握好度,不然可能由于太多的用户状态和方式的选择,增加了软件设计的复杂性和程序实现的难度。 例如手机键盘有九宫格和全键盘,还支持手写,满足了不同用户的需求。
- 舒适性
舒适性主要强调界面友好,美观,操作过程顺畅,色彩运用恰当,按钮的立体感等。
3. 按照执行方式分类
3.1 静态测试
所谓静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。
不以测试数据的执行而是对测试对象的分析过程,仅通过分析或检查源程序的设计、内部结构、逻辑、代码风格和规格等来检查程序的正确性。
常见的静态测试方式有代码走查,代码扫描工具等。
3.2 动态测试
动态测试(dynamic testing)指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运行程序。
大多数软件测试工作都属于动态测试。
4. 按照测试方法分类
4.1 白盒测试
白盒测试又称为结构测试或逻辑测试,它一般用来分析程序的内部结构,针对程序的逻辑结构来设计测试用例进行测试。白盒测试的测试目的是通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致。
白盒测试主要分为静态测试和动态测试两种。
静态测试常见于桌面检查、代码审查、代码走查、代码扫描工具。
动态测试方法主要包含六种测试方法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。
给出简单的案例,接下来了解一下白盒测试方法的概念和使用:
if A and B
then action1
if C or D
then action2
4.1.1 语句覆盖
每个语句至少执行一次。
针对A and B:A为T且B为T
针对C or D:C为T或者D为T
得出用例:
用例1:A为T,B为T,C为T,D为F
4.1.2 判定覆盖
A and B 要为T => A=T B=T ①
A and B 要为F => A=T B=F 或者A=F B=T或者 A=F B=F ②
C or D 要为T => C=T D=T/F 或者 C=T/F D=T ③
C or D 要为F => C=F D=F ④
得出用例:
用例1:A=T B=T C=T D=F 满足 ①③
用例2:A=T B=F C=F D=F 满足 ②④
4.1.3 条件覆盖
A:T F
B:T F
C:T F
D:T F
⑤ ⑥
得出用例:
用例1:A=T B=T C=T D=T ⑤
用例2:A=F B=F C=F D=F ⑥
4.1.4 判定条件覆盖
结合判定覆盖和条件覆盖。
得出用例:
用例1:A=T B=T C=T D=T 满足①③⑤
用例2:A=F B=F C=F D=F 满足②④⑥
4.1.5 条件组合覆盖
A B ∣ C D
T T ∣ T T
T F ∣ T F
F T ∣ F T
F F ∣ F F
每行就可以是一个用例,一共四个用例。
4.1.6 路径覆盖
判定条件定义如下:
- if(x>0 && y>0)判定:记为P1
- if(z < 0)判定:记为P2
- x > 0:记为C1
- y > 0:记为C2
- z < 0:记为C3
测试用例设计:
总结:
- 白盒测试主要应用于单元测试阶段
- 先执行静态设计用例的方法,再执行动态设计测试用例的方法
- 设计用例一般使用路径测试,重点模块追加使用逻辑覆盖方法
4.2 黑盒测试
黑盒测试就是在完全不考虑程序逻辑和内部结构的情况下,检查系统功能是否按照需求规格说明书的规定正常使用、是否能适当的接收输入数据而输出正确的结果,满足规范需求。所以,黑盒测试又称之为数据驱动测试,只注重软件的功能。
黑盒测试的优点:不需要了解程序内部的代码以及实现,不关注软件内部的实现。从用户角度出发设计测试用例,很容易的知道用户会用到哪些功能,会遇到哪些问题,锻炼测试人员的产品思维。测试用例是基于软件需求开发文档,不容易遗漏软件需求文档中需要测试的功能。
黑盒测试的缺点:不可能覆盖所有代码。
黑盒测试用到的测试方法有:等价类,边界值,因果图,场景法,错误猜测法等。
4.3 灰盒测试
灰盒测试是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。但是,灰盒测试没有白盒测试详细和完整,而黑盒测试是覆盖产品范围最广的测试,因此灰盒测试基本是不能够替代黑盒测试,否则需要很大的代价,设计非常多的用例。
常见面试题: 你知道的测试方法有哪些?哪种用的比较多?
常见的测试方法有黑盒测试,白盒测试和灰盒测试。开发人员主要用白盒测试和灰盒测试,测试人员主要用白盒测试和黑盒测试。对于测试人员来说,相较于白盒测试,黑盒测试用的更多一些。
5. 按照测试阶段分类
5.1 单元测试
与编码同步进行,针对软件最小组成单元进行测试,主要采用白盒测试方法,从被测对象的内部结构出发设计测试用例。
到底怎么才算“最小单元”呢,最小单元实际是人为定义的,一个方法,一个类都可以理解为“最小单元”。
- 测试阶段:编码后或者编码前(TDD)
- 测试对象:最小模块
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:代码和注释+详细设计文档
- 测试方法:白盒测试
- 测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
针对下面给出的冒泡排序,我们尝试实现一个简单的单元测试。
public class Main {public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n; i++) {// 每轮遍历将最⼤的数移到末尾for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}public static void main(String[] args) {// 排序⽆序数组Test01();// 排序有序数组Test02();// 排序空数组Test03();// 排序有重复数数组Test04();}private static void Test04() {int[] act_array1= {1, 1, 29, 12, 12, 9, 9};int[] expect_array1 = {1, 1, 9, 9, 12, 12, 29};// 排序有重复数数组bubbleSort(act_array1);boolean isSame = Arrays.equals(act_array1, expect_array1);//判断两个数组内容是不是⼀样if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test03() {int[] act_array1= {};int[] expect_array1 = {};//排序空数组bubbleSort(act_array1);boolean isSame = Arrays.equals(act_array1, expect_array1);//判断两个数组内容是不是⼀样if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test02() {int[] act_array1= {1, 2, 3, 4, 5};int[] expect_array1 = {1, 2, 3, 4, 5};//排序有序数组bubbleSort(act_array1);boolean isSame = Arrays.equals(act_array1, expect_array1);//判断两个数组内容是不是⼀样if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}private static void Test01() {int[] act_array1= {64, 34, 25, 12, 22, 11, 90};int[] expect_array1 = {11, 12, 22, 25, 34, 64, 90};//排序⽆序数组bubbleSort(act_array1);boolean isSame = Arrays.equals(act_array1, expect_array1);//判断两个数组内容是不是⼀样if(isSame == false) {System.out.println("测试不通过");} else {System.out.println("测试通过");}}
}
java中也有很多单元测试框架,如Junit,Junit提供了非常多注解和断言函数,有效提升开发单元测试脚本的效率。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;public class BubbleSortTest {@Testpublic void testBubbleSort() {// 测试⽤例:正常情况下的冒泡排序int[] arr = {5, 3, 9, 1, 7};int[] expected = {1, 3, 5, 7, 9};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortEmptyArray() {// 测试⽤例:空数组的冒泡排序int[] arr = {};int[] expected = {};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortAlreadySorted() {// 测试⽤例:已经有序的数组,排序后应该保持不变int[] arr = {1, 2, 3, 4, 5};int[] expected = {1, 2, 3, 4, 5};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}@Testpublic void testBubbleSortWithDuplicates() {// 测试⽤例:包含重复元素的数组int[] arr = {4, 2, 4, 1, 3, 2};int[] expected = {1, 2, 2, 3, 4, 4};BubbleSort.bubbleSort(arr);assertArrayEquals(expected, arr);}
}
5.2 集成测试
集成测试也称联合测试(联调)、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。集成主要目的是检查软件单位之间的接口是否正确。
- 测试阶段:一般单元测试之后进行
- 测试对象:模块间的接口
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:单元测试的模块 + 概要设计文档
- 测试方法:黑盒测试与白盒测试相结合
- 测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块缺陷对系统的影响
5.3 系统测试
对通过集成测试的系统进行整体测试,验证系统功能性和非功能性需求的实现。
- 测试阶段:集成测试通过之后
- 测试对象:整个系统(软、硬件)
- 测试⼈员:黑盒测试工程师
- 测试依据:需求规格说明文档
- 测试方法:黑盒测试
- 测试内容:功能、界⾯、可靠性、易⽤性、性能、兼容性、安全性等
5.3.1 冒烟测试
这一术语源自硬件行业,对一个硬件或硬件组件进行更改或修复后,直接给设备加电,如果没有冒烟,则该组件就通过了测试。在软件中,“冒烟测试”这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性。
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件主要功能和核心流程正常,在正式进行系统测试之前执行。冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时,先进行冒烟测试,保证基本功能正常,不阻碍后续的测试。如果冒烟测试通过,则测试人员开始进行正式的系统测试,如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过,再开始进行系统测试。
在生活中,购买一个电视,首先会通电,查看电视是否能够运行;购买一个水杯,首先会灌水,查看水杯是否漏水。
在工作中,假如有一个博客系统项目提测了,冒烟测试即只需要测试系统是否能够成功打开,主流程是否可以走通即可。
5.3.2 回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。随着系统的庞大,回归测试的成本越来越大,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。
回归测试主要由人工测试和自动化测试进行。
在实际工作中,回归测试需要反复进行,当测试者一次又一次地完成相同的测试时,这些回归测试将变得非常令人厌烦,而在大多数回归测试需要手工完成的时候尤其如此。因此,需要通过自动测试来实现重复的和一致的回归测试。通过测试自动化可以提高回归测试效率,为了支持多种回归测试策略,自动测试工具应该是通用的和灵活的,以便满足达到不同回归测试目标的要求。
5.4 验收测试
针对用户需求,对通过系统测试的软件进行交付性测试,以确定系统是否满足验收标准,由用户或其他授权机构决定是否接受系统。验收测试是部署软件之前的最后一个测试操作,它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买者展示该软件系统满足原始需求。
- 测试阶段:系统测试通过之后
- 测试对象:整个系统(包括软硬件)
- 测试人员:主要是最终用户或者需求方
- 测试依据:用户需求、验收标准
- 测试方法:黑盒测试
- 测试内容:同系统测试(功能…各类文档等)
单元测试,集成测试,系统测试,回归测试之间的关系
关于车企生产车到客户开上小汽车的过程中~
造车需要原材料,如车轮、发动机等零部件不是车企自己制造出来的,而是通过购买零部件来造车。
对买来的零部件进行检查,零部件是否符合造车标准 (单元测试)
零件确认完毕,接下来就是复杂的造车工艺,将零部件集成起来构成了一辆车,并初步检查拼车的车是否能正常运作 (集成测试)
一辆车成型之后并不意味着就可以直接销售给客户了,需要车企专业的测试人员进行详细而完整的测试 (系统测试)
专业的测试人员对企业测试完毕,通过测试的汽车将会在车展或者4S店进行展示,供用户进行选择和购买。用户在选择汽车的过程中也会对车外观以及性能等方面进行校验 (验收测试)
除了以上阶段外,还有两个非常重要,在工作中经常会听到:冒烟测试和回归测试
6. 按照是否手工测试分类
6.1 手工测试(Manual testing)
手工测试就是由人去一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。
6.2 自动化测试(Automation Testing)
就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。简单说自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。自动化测试比如功能测试自动化、性能测试自动化、安全测试自动化。自动化测试按照测试对象来分,还可以分为接口测试、UI测试等。接口测试的ROI(产出投入比)要比UI测试高。(这里了解一下,等到将自动化的时候再详细展开)
6.3 自动化测试和手工测试优缺点
7. 按照实施组织划分
大型通用软件,在正式发布前,通常需要执行Alpha和Beta测试
7.1 α测试(Alpha Testing)
α测试又叫内测或者叫a测。
α测试通常是公司内部的用户在模拟实际操作环境下进行的测试。α测试的目的是评价软件产品的FLURPS(即功能、可使用性、可靠性、性能和支持)。α测试不能由程序员或测试员完成。
7.2 β测试(Beta Testing)
β测试又叫公测或者叫b测。
β测试由软件的最终用户们在一个或多个场所进行,这里就可以理解为,β测试是正式用户中的一部分,他们在任意的场合来使用软件,目的是为了发现软件是否存在一系列的问题。
通常会发送一些邀请码,来邀请用户参与项目测试。
α测试与β测试的区别
7.3 第三方测试
第三方软件测试是指由独立的第三方公司或组织进行的软件测试活动。
通过第三方测试,可以确保软件的质量,节省成本,确保软件尽快上线。
8. 按照测试地域划分
按照测试地域划分,一般会将测试划分为国际化测试和本地测试。
8.1 国际化测试
简言之,测试人员需要测试软件在不同语言和地区是否能正常工作。
国际化测试需要关注软件的哪些特性:
- 布局
- 时间
- 日期
- 数字格式
- 货币
- 机器型号
- …
8.2 本地测试
之前所讲的都属于本地测试。
相关文章:
测试分类篇
文章目录 目录1. 为什么要对软件测试进行分类2. 按照测试目标分类2.1 界面测试2.2 功能测试2.3 性能测试2.4 可靠性测试2.5 安全性测试2.6 易用性测试 3. 按照执行方式分类3.1 静态测试3.2 动态测试 4. 按照测试方法分类4.1 白盒测试4.1.1 语句覆盖4.1.2 判定覆盖4.1.3 条件覆盖…...
Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)
上文有介绍deepseek接入,但是需要 付费,虽然 sliconflow 可以白嫖 token,但是毕竟是有限的,本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火(免费) 测试对话 接入Django 扩展建议 接入讯飞星火…...
使用NVM下载Node.js管理多版本
提示:我解决这个bug跟别人思路可能不太一样,因为我是之前好用,换个项目就不好使了,倦了 文章目录 前言项目场景一项目场景二解决方案:下载 nvm安装 nvm重新下载所需Node 版本nvm常用命令 项目结构说明 前言 提示&…...
下载安装Node.js及其他环境
提示:从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm(我需要安装)安装脚手架安装依赖安装淘宝镜像(注意会更新)cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…...
Java 基础-31-枚举-认识枚举
在Java编程语言中,枚举(Enum)是一种特殊的类,它允许一组固定的常量。它们非常适合用来表示一组固定的值,比如星期几、季节、颜色等。枚举自Java 5开始引入,为定义常量提供了一种更强大和方便的方式。本文将…...
问题1:Sinal 4在开启PAC检查的设备崩溃
问题信息 硬件不支持PAC(Pointer Authentication),此类错误就是signal 11的错误,崩溃信息如下: Build fingerprint: google/sdk_gphone64_arm64/emu64a:16/BP22.250221.010/13193326:userdebug/dev-keys Revision: 0 ABI: arm64 Timestamp: 2025-04-06 11:33:13.923…...
美团Leaf分布式ID生成器:雪花算法原理与应用
📖 前言 在分布式系统中,全局唯一ID生成是保证数据一致性的核心技术之一。传统方案(如数据库自增ID、UUID)存在性能瓶颈或无序性问题,而美团开源的Leaf框架提供了高可用、高性能的分布式ID解决方案。本文重点解析Leaf…...
【C++奇遇记】C++中的进阶知识(多态(一))
🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…...
C++自学笔记---指针在数组遍历中的应用
指针在数组遍历中的应用 在这一篇文章中,我们可以看到指针在数组遍历中的具体应用例子。 1. 赋值 我们要创建一个将数组的所有元素赋值为 1 的函数,并使用解引用运算符来访问数组元素. 代码为: #include <iostream> using namespac…...
Java八股文-List集合
集合的底层是否加锁也就代表是否线程安全 (一)List集合 一、数组 array[1]是如何通过索引找到堆内存中对应的这块数据的呢? (1)数组如何获取其他元素的地址值 (2)为什么数组的索引是从0开始的,不可以从1开始吗 (3)操作数组的时间复杂度 ①查找 根据索引查询 未…...
二叉树——队列bfs专题
1.N叉树的层序遍历 我们之前遇到过二叉树的层序遍历,只需要用队列先进先出的特性就可以达到层序遍历的目的。 而这里不是二叉树,也就是说让节点的孩子入队列时不仅仅是左右孩子了,而是它的所有孩子。而我们看这棵多叉树的构造,它…...
ESPIDF备忘
ESP8266 环境搭建 Windows 首先确保安装好了vscode和git 在工作目录使用git 克隆这个 git clone --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git下载 集成环境和 ESP8266编译工具 旧版本的集成工具可能有问题 这里用20200601版本的 https://dl.espressif.co…...
4-c语言中的数据类型
一.C 语⾔中的常量 1.生活中的数据 整数: 100,200,300,400,500 小数: 11.11 22.22 33.33 字母: a,b,c,d A,B,C,D 在 C 语⾔中我们把字⺟叫做字符. 字符⽤单引号引⽤。例如A’ 单词…...
ST 芯片架构全景速览:MCU、无线 SoC、BLE 模块、MPU 差异详解
在嵌入式开发中,ST 是一个非常常见的芯片厂商,其产品线覆盖了 MCU、无线芯片、BLE 模块以及运行 Linux 的 MPU 等多个领域。很多开发者初次接触 ST 时会对这些产品之间的关系感到困惑。 本文从分类视角出发,带你快速了解 ST 芯片家族的核心架构和主要用途。 🧭 ST 芯片四…...
第十章Python语言高阶加强-SQL(数据库)
目录 一.数据库介绍 二.MySQL的安装 三.MySQL入门使用 四.SQL基础和DDL 五.SQL—DML 六.SQL—DQL 1.基础查询 2.分组聚合 七.Python操作MySQL 1.基础使用 2.数据插入 此章节主要掌握并且了解SQL语法和基础使用。如:安装、增删改查,SQL在未来我…...
NO.71十六届蓝桥杯备战|搜索算法-递归型枚举与回溯剪枝|枚举子集|组合型枚举|枚举排列|全排列问题(C++)
什么是搜索? 搜索,是⼀种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。 搜索⼀般分为深度优先搜索(DFS)与宽度优先搜索(BFS)。深度优先遍历vs深度优先搜索,宽度…...
C++ 中为什么构造函数不需要实现虚函数,而析构函数需要?
在C中,构造函数不需要是虚函数,而析构函数往往需要,原因如下: 构造函数 对象创建顺序:构造函数的主要任务是初始化对象的成员变量,创建对象时需要先调用基类的构造函数,再调用派生类的构造函数…...
如何获取oracle cloud永久免费的vps(4C/24G)?
1.注册oracle cloud账号 Oracle Cloud 免费套餐 | Oracle 中国 新注册的小伙伴,可以在 30 天内,利用 300 美元免费储值,任性使用所有 Oracle Cloud 基础设施服务。 30 天后呢?你仍然可以畅享 Always Free 免费套餐中的云服务&am…...
TypeScript面试题集合【初级、中级、高级】
初级面试题 什么是TypeScript? TypeScript是JavaScript的超集,由Microsoft开发,它添加了可选的静态类型和基于类的面向对象编程。TypeScript旨在解决JavaScript的某些局限性,比如缺乏静态类型和基于类的面向对象编程,…...
java面试篇 并发编程篇
目录 1.线程的基础知识 1.线程与进程的区别? 2.并行与并发的区别? 3.创建线程的方式有哪些? 4.线程包括哪些状态?状态之间是如何变化的? 5.T1,T2,T3三个线程新建完毕后,如何保证…...
掌握 JSON 到表格转换:全面指南
高效地转换数据格式对于现代数据处理至关重要。JSON(JavaScript 对象表示法)因其灵活性而广受欢迎,而 CSV 或 Excel 等表格格式则更适用于数据分析和可视化。本文将介绍多种 JSON 转换为表格格式的方法,帮助您提升数据处理和可视化…...
【Spring Cloud Netflix】GateWay服务网关
1.基本概述 GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…...
国产芯片解析:龙讯USB Type-C/DP Transmitter多场景覆盖,定义高速互联新标杆
在智能设备功能日益复杂化的今天,高速数据传输、高清视频输出与多功能接口融合已成为行业刚需。龙讯半导体(Lontium)凭借其领先的芯片设计能力,推出多款USB Type-C/DP Transmitter芯片,覆盖从消费电子到工业应用的…...
蓝桥杯 web 展开你的扇子(css3)
普通答案: #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…...
【Kubernetes】StorageClass 的作用是什么?如何实现动态存储供应?
StorageClass 使得用户能够根据不同的存储需求动态地申请和管理存储资源。 StorageClass 定义了如何创建存储资源,并指定了存储供应的配置,例如存储类型、质量、访问模式等。为动态存储供应提供了基础,使得 Kubernetes 可以在用户创建 PVC 时…...
4月7号.
双列集合的特点: Map中的常见API: //1.创建Map集合的对象 Map<String, String> m new HashMap<>();//2.添加元素 Stringvalue1 m.put("郭靖","黄蓉"); System.out.println(value1); m.put("韦小宝","沐剑屏"); m.put(&q…...
C++抽卡模拟器
近日在学校无聊,写了个抽卡模拟器供大家娱乐。 代码实现以下功能:抽卡界面,抽卡判定、动画播放、存档。 1.抽卡界面及判定 技术有限,不可能做的和原神一样精致。代码如下(注:这不是完整代码,…...
蓝桥杯 2. 开赛主题曲【算法赛】
2.开赛主题曲【算法赛】 - 蓝桥云课 这道题和3. 无重复字符的最长子串 - 力扣(LeetCode)类似,因为题目中规定只有小写字母,所以定义统计数组时只需要定义26个字母即可,然后每次遍历的字符减去‘a’即为他的下标 impo…...
Spring Boot 中的 Bean
2025/4/6 向全栈工程师迈进! 一、Bean的扫描 在之前,对于Bean的扫描,我们可以在XML文件中书写标签,来指定要扫描的包路径,如下所示,可以实通过如下标签的方式: <context:component-scan base-package&…...
基于springboot科研论文检索系统的设计(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在此…...
Mysql入门
一、数据库三层结构 所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)一个数据库中可以创建多个表,以保存数据(信息)。数据库管理系统(DBMS)、数据库和表的关系如…...
如何解决uniapp打包安卓只出现功能栏而无数据的问题
如何解决uniapp打包安卓只出现功能栏而无数据的问题 经验来自:关于Vue3中调试APP触发异常:exception:white screen cause create instanceContext failed,check js stack -> at useStore (app-service.js:2309:15)解决方案 - 甲辰哥来帮你算命 - 博客…...
Python高级爬虫之JS逆向+安卓逆向1.1节-搭建Python开发环境
目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…...
剖析Mybatis中用到的设计模式
框架对很多设计模式的实现,都并非标准的代码实现,都做了比较多的自我改进。实际上,这就是所谓的灵活应用, 只借鉴不照搬, 根据具体问题针对性地去解决。 涉及到Mybatis源码知识和设计模式,这点我之前的博客均有涉及。 可以查看我的…...
MySQL 函数(入门版)
目录 一、字符串函数 1、常用的字符串函数 2、函数演示 3、具体案例 二、数值函数 1、常用的数值函数 2、函数演示 3、具体案例 三、日期函数 1、常用的日期函数 2、函数演示 3、具体案例 四、流程函数 1、常用的流程函数 2、函数演示 3、具体案例 在MySQL中&a…...
d202546
目录 一、罗马字符转数字 二、二叉树的右视图 三、sql-查询结果的质量和占比 一、罗马字符转数字 首先把两个字符组成一个数字做一下单独判断 然后就是单个字符转数字 public int romanToInt(String s) {int sum 0;char[] ch s.toCharArray();int i 0;while(i < ch.len…...
洛谷每日1题-------Day37__P1634 禽兽的传染病
题目背景 mxj 的启发。 题目描述 禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染? 输入格式 两个非负整数 x 和 n。 输出格式 一个整数,即被传染的禽兽数。 输入输出样例 输入 #1复制 10 2 输出 #1复制 121…...
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理
c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理 【心法】 【第零章】c语言概述 【第一章】分支与循环语句 【第二章】函数 【第三章】数组 【第四章】操作符 【第五章】指针 【第六章】结构体 【第七章】const与c语言中一些错误代码 【禁忌秘术】 【第一式…...
理解进程和线程的概念
在操作系统中,进程和线程都是执行的基本单位,但它们在性质和管理方面有所不同 进程 定义: 进程是一个正在运行的程序的实例,是操作系统资源分配的基本单位。特点: 独立性:每个进程有其独立的内存空间、数据栈和其他辅助数据。重…...
【项目管理】第2章 信息技术发展 --知识点整理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 二、信息技术的发展 1. 信息技术及其发展 1)计算机软硬件 计算机硬件由电子机械、光电元件等组成的物理装置,提供物质基础给计算机软件运行。软件包括程…...
docker部署rabbitmq
拉取镜像 docker pull rabbitmq:managementmanagement 标签表示包含管理插件,可以通过 Web 界面管理 RabbitMQ 启动容器 docker run --restartalways -d --name rabbitmq \-p 9004:5672 -p 9005:15672 \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_P…...
手搓多模态-03 顶层和嵌入层的搭建
声明:本代码非原创,是博主跟着国外大佬的视频教程编写的,本博客主要为记录学习成果所用。 我们首先开始编写视觉模型这一部分,这一部分的主要功能是接收一个batch的图像,并将其转化为上下文相关的嵌入向量,…...
计算机系统---UEFI(统一可扩展固件接口)
一、UEFI定义与历史背景 UEFI(Unified Extensible Firmware Interface) 是替代传统BIOS的新一代固件接口标准,由UEFI论坛(前身是Intel的EFI论坛)制定,旨在解决BIOS在现代硬件和操作系统下的局限性。 设计…...
2025年渗透测试面试题总结-某四字大厂面试复盘扩展 二面 (题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 某四字大厂面试复盘 二面 一、文件上传绕过WAF的15种深度技巧 二、SSRF利用与WAF绕过的8种高阶手法 …...
基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术, 能够识别8种不同的杂草类别。用户可以通过上传图片,系统会自动识别图片中的杂草类别,并显示识别结果和…...
Java的Selenium的特殊元素操作与定位之时间日期控件
分为两种情况: 控件没有限制手动输入,则直接调用sendKeys方法写入时间数据 //时间日期控件处理 chromeDriver.get ("https://www,fliggy,com/?ttidsem.000000736&hlreferidbaidu.082076&route sourceseo"); chromeDriver.findElement (By.xpat…...
深入理解矩阵乘积的导数:以线性回归损失函数为例
深入理解矩阵乘积的导数:以线性回归损失函数为例 在机器学习和数据分析领域,矩阵微积分扮演着至关重要的角色。特别是当我们涉及到优化问题,如最小化损失函数时,对矩阵表达式求导变得必不可少。本文将通过一个具体的例子——线性…...
基于大数据的美团外卖数据可视化分析系统
【大数据】基于大数据的美团外卖数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过对海量外卖数据的深度挖掘与分析,能够为美团外卖平台提供运营决策支…...
TypeScript 类型系统详解
基础类型 TypeScript 支持丰富的基础数据类型,涵盖number、string、boolean、null、undefined、symbol以及bigint。这些类型为构建可靠的代码提供了基石。 数值类型(number):在 TypeScript 里,所有数字均为浮点数…...
【学Rust写CAD】33 近似 Alpha 混合函数(argb.rs补充方法)
源码 #[inline]pub fn over(self, dst: Argb) -> Argb {let a 256 - self.alpha32();let rb (dst.rb() * a) >> 8;let ag dst.ag() * a;Argb(self.0 (rb & Argb::MASK) | (ag & !Argb::MASK))}源码分析 这段代码实现了一个近似 Alpha 混合(“…...