软件测试方法分类详解
一、软件测试的定义
软件测试(Software Testing)是通过执行程序或系统,以验证其功能是否符合预期需求、发现潜在缺陷(Bug)并评估软件质量的过程。
核心目标:
验证需求: 确保软件满足用户需求和规格说明书;发现缺陷: 识别代码、逻辑或功能中的错误;评估质量: 判断软件的可靠性、性能、安全性等非功能性指标;降低风险: 减少上线后因缺陷导致的故障或损失。
二、软件测试的核心目的
保证质量: 确保软件在交付前达到预期的稳定性、功能性和用户体验。减少维护成本: 早期发现缺陷可显著降低修复成本(修复时间越晚,成本越高)。提升用户满意度:通过高质量的软件增强用户信任和使用体验。支持持续改进: 通过测试数据反馈,优化开发流程和产品质量。
三、软件测试的分类
(一)根据利用的被测对象信息的不同,可以将软件测试方法分为:黑盒测试、灰盒测试、白盒测试。
测试类型
特点
备注
白盒测试(White Box Testing)
基于代码逻辑设计测试用例(如路径覆盖、条件覆盖)
分析源代码或二进制文件的语法、结构等
黑盒测试(Black Box Testing)
不关注内部代码结构,仅根据需求文档设计测试用例(如功能测试)
模拟黑客行为对应用程序进行动态攻击
灰盒测试(Gray Box Testing)
结合黑盒和白盒测试,了解部分内部逻辑但不完全依赖代码(如接口测试)
结合SAST和DAST的优点,通过实时交互进行高效、准确的漏洞识别
1、白盒测试
1)概念:是依据被测软件分析程序内部构造,并根据内部构造分析用例,来对内部控制流程进行测试,可完全不顾程序的整体功能实现情况,即已知软件产品的内部实现过程,可以通过测试证明每种内部操作是否符合设计规格的要求,所有内部成分是否已经过检查。2)思想:白盒测试又被称为玻璃盒测试、透明盒测试、开放盒测试、结构化测试、逻辑驱动测试、是基于程序结构的逻辑驱动测试。3)测试对象: 函数、算法与数据结构4)目的 (1)一般在测试前期进行,通过达到一定的逻辑覆盖率指标,使得软件内部逻辑控制结构上的问题能基本得到消除; (2)保证内部结构达到一定的覆盖程度,能够给予软件代码质量更大的保证; (3)白盒测试发现问题后,解决问题的成本较低。
5)白盒测试的常用技术: (1)静态分析:包括控制流分析、数据流分析、信息流分析 (2)动态分析:逻辑覆盖测试(分支测试、路径测试等)、程序插装等 ,逻辑覆盖测试根据覆盖的对象不同,可以分为:语句覆盖、判定(分支)覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。 程序插装指调试程序时,在程序中插入一些打印语句,程序执行时打印出我们关心的信息,通过这些信息了解执行过程中程序的一些动态行为。
6)白盒测试的特点:(1)测试人员需要了解软件的实现;(2)可以检测代码中的每条分支和路径;(3)揭示隐藏在代码中的错误;(4)对代码的测试比较彻底;(5)实现代码结构上的优化;(6)投入较大,成本高;(7)无法检测代码中遗漏的路径和数据敏感性错误;(8)不验证规格的正确性。
2、黑盒测试
1)定义:把测试对象看成是一个黑盒,只考虑其整体特性,不考虑其内部具体实现过程。即已知产品的需求规格,但不知其内部实现,可以进行测试证明每个需求是否实现。2)思想:基于规格的测试,测试类型都来源于质量模型。3)测试对象:系统、子系统、模块、子模块、函数等。4)常用的黑盒测试方法:等价类划分法、边界值分析法、因果图分析法、判定表法、状态迁移法等。5)目的:减少测试时的测试用例数,用尽量少的测试用例完成测试,发现更多的问题。6)黑盒测试的特点(1)对于更大的代码单元来说(子系统甚至系统级)比白盒测试效率要高;(2)测试人员不需要了解软件的实现细节,包括特定的编程语言;(3)从用户的视角进行测试,很容易被理解和接受;(4)有助于暴露任何规格不一致或有歧义的问题;(5)没有清洗和简明的规格,测试用例很难设计;(6)不能控制内部执行路径,会有很多内部程序路径没有被测试到;(7)不能直接针对特定的程序段,这些程序可能非常复杂(因此可能隐藏更多的问题)
3、灰盒测试
利用被测对象的整体特性信息,采用黑盒测试方法;利用被测对象的内部具体实现信息,采用白盒测试方法;介于白盒和黑盒测试之间的测试方法测试方法称之为灰盒测试。1)定义:如果即利用被测对象的整体特性信息,又利用被测对象的内部具体实现信息,采用得就是灰盒测试方法。两种信息占得比例不同,相应的灰度就不同。2)适用对象:一般集成测试采用灰盒测试方法。
(二)按照被测试的软件系统是否运行,将测试分为静态测试和动态测试。
1、静态测试
1)定义:不运行被测试的软件系统,而是采用其他手段和技术对被测试软件进行检测的一种测试技术,例如:代码走读、文档评审、程序分析等。2)常用技术:静态分析技术。(1)定义:静态分析是一种不通过执行程序而分析程序的技术。(2)功能:检查软件的表示和描述是否一致,没有冲突或者没有歧义(3)目的:纠正软件系统在描述、表示和规格上的错误,因此是任何进一步测试的前提。(4)静态分析技术主要有3种不同的程序测试可能性考虑程序是否满足编码规则,语法上是否具有一致性和完整性;考虑文档描述是否规范、准确、便于查阅;考虑程序和文档之间的一致性。(5)静态分析技术有:控制流分析、数据流分析和信息流分析,下面一一介绍:
1、控制流分析(控制流相关概念)程序元素:一个程序元素通常是一个条件,一个简单的语句或者一块语句(多个连续语句)。控制流关系:一个程序的控制流关系(Control Flow Relation)叙述了程序元素和他们执行的次序之间的关系。控制流图:对应于控制流关系的图被称为控制流图。控制流矩阵:有控制流图得到,反映相邻程序元素之间的先后顺序关系。(控制流分析能发现的问题 )
通过对控制流信息进行分析,确保写出的程序不应包含:转向并不存在的标号;没用的语句标号;从程序入口进入后无法达到的语句;不能达到停机语句的语句。
2、数据流分析(数据流相关概念 )
数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化(代码优化主要包含:结构优化即可读性、时间效率和空间效率优化、可移植性优化)。数据流分析法关键是数据的引用和定义。 数据的定义:如果程序中某一语句执行时能改变某程序变量V的值,则称V是被该语句定义的。
数据的引用:如果程序中一语句的执行引用了内存中变量V的值,则称V是被该语句引用的。
(数据流分析步骤 )
根据代码得到数据流表
分析数据流表找到以下两种错误:变量未定义但被引用
变量定义但未被引用
2、动态测试
1)定义:按照预先设计的数据和步骤去运行被测软件系统,从而对被测试软件进行检测的一种测试技术。2)特点:主要分析软件系统在模拟或是真实的环境中执行之前、之中、之后的动态行为。3)常用技术:动态分析技术(1)定义:对软件系统运行行为进行分析,包含程序在受控的环境下使用特定的输入进行正式的运行,和期望的结果比较以检查系统运行是正确还是不正确。(2)常用动态分析技术:
路径测试
分支测试
性能测试
(3)常用动态分析工具及功能
测试覆盖率分析:用于测试对代码的检测范围;
跟踪:跟踪程序执行期间的所有路径
调整:度量程序执行过程中所有的资源
模拟:模拟系统的部分
(三)按照执行主体,都可以归类为手工测试和自动化测试。
测试类型
特点
备注
手动测试(Manual Testing)
人工执行测试用例,适用于功能简单或探索性测试。
自动化测试(Automated Testing)
使用工具(如Selenium、JMeter)编写脚本自动执行重复性高或大规模测试。
1、手工测试
1)定义:手工测试是传统的测试方法,由测试人员手工编写测试用例,执行,观察结果。2)缺点:测试工作量大,重复多,回归测试难以实现
2、自动化测试
1)定义:自动化测试指利用软件测试工具自动实现全部或者部分测试工作:管理、设计、执行和报告,自动化测试节省大量的测试开销,并能够完成一些手工测试无法实现的测试。2)自动化测试的意义(1)对程序新版本运行前一版本执行的测试,提高回归测试效率(2)可以运行更多更频繁的测试(3)可以执行手工测试困难或不可能做到的测试,比如大量的重复操作或者集成测试(4)更好的利用资源,比如测试仪器或者被测对象(5)测试具有一致性和可重复性,及自动化测试的步骤和结果完全一样的测试的复用性,及自动化测试甲苯可以拆分开给其他测试脚本使用(6)可以更快地将软件推向市场,软件发布前进行高效的回归测试,减少软件发布的时间(7)增加软件的信任度,通过自动化测试提高了测试效率,可以吧节约的时间拿出来做更多的测试
3)自动化测试的限制(1)不能取代手工测试,自动化测试只能提高测试效率,不能提高测试有效性,即不可能发现更多缺陷更多(2)对测试设计依赖性极大,测试设计的不好会遗漏问题(3)自动化测试对软件开发具有很大的依赖性,开发出现变更可能导致前面的自动化测试完全失效(4)工具本身并不具备想象力,工具不具有智能
4)自动化测试的误区(1)不现实的期望,希望自动化能取代手工测试(2)缺乏测试实践经验,手工测试都做不好,或者经验积累不够,就尝试自动化,很难成功(3)期望自动化测试发现大量新缺陷,自动化只能保证测试执行效率,确保已有的问题不会再发生,发现新缺陷不是其目的(4)安全性错觉,认为进行了自动化测试的软件就是安全的、质量有保证的只有手工测试做好了,明确了测试的观察点,才能把自动化测试做好,所以手工测试是自动化测试的一个基础。
(四)按照测试阶段,单元、集成、系统、冒烟、回归
测试类型
特点
备注
单元测试(Unit Testing)
针对最小功能模块(如函数、类)进行测试,通常由开发人员完成。
集成测试(Integration Testing)
验证多个模块或组件组合后的交互逻辑是否正确。
系统测试(System Testing)
在完整系统环境中测试整体功能和性能,确保符合需求规格。
回归测试(Regression Testing)
在代码修改后验证原有功能是否受影响
冒烟测试(Smoke Testing)
快速验证核心功能是否正常,决定是否继续深入测试。
验收测试(Acceptance Testing)
由用户或客户执行,确认软件是否满足业务需求并可以上线。
1、单元测试
针对最小功能模块(如函数、类)进行测试,通常由开发人员完成。
2、集成测试
测试阶段:⼀般单元测试之后进⾏测试对象:模块间的接⼝测试⼈员:⽩盒测试⼯程师或开发⼯程师测试依据:单元测试的模块+概要设计⽂档测试⽅法:⿊盒测试与⽩盒测试相结合测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块缺陷对系统的影响
3、系统测试
对通过集成测试的系统进⾏整体测试,验证系统功能性和⾮功能性需求的实现。
测试阶段:集成测试通过之后测试对象:整个系统(软、硬件)测试⼈员:⿊盒测试⼯程师测试依据:需求规格说明⽂档测试⽅法:⿊盒测试测试内容:功能、界⾯、可靠性、易⽤性、性能、兼容性、安全性等
4、冒烟测试
冒烟测试(Smoke Testing):快速验证核心功能是否正常,决定是否继续深入测试。
检查主流程是否走得通,看程序是否有可测性。冒烟测试的对象是每⼀个新编译的需要正式测试的软件版本,⽬的是确认软件主要功能和核⼼流程正常,在正式进⾏系统测试之前执⾏。冒烟测试⼀般在开发⼈员开发完毕后提交给测试⼈员来进⾏测试时,先进⾏冒烟测试,保证基本功能正常,不阻碍后续的测试。如果冒烟测试通过,则测试⼈员开始进⾏正式的系统测试,如果不通过,则测试⼈员可以让开发⼈员重新修复代码直到冒烟测试通过,再开始进⾏系统测试。
5、回归测试
回归测试(Regression Testing):在代码修改后验证原有功能是否受影响。所有的页面,所有的功能测试完整之后要整体再回归一遍。
(五)其他分类
测试类型
特点
备注
功能测试(Functional Testing)
验证软件功能是否符合需求(如登录、支付)
非功能测试(Non-functional Testing)
测试性能(负载测试)、安全性(渗透测试)、兼容性(跨平台测试)等。
功能测试(Functional Testing):验证软件功能是否符合需求(如登录、支付)。
非功能测试(Non-functional Testing):测试性能(负载测试)、安全性(渗透测试)、兼容性(跨平台测试)等。
四、软件测试的基本流程
需求分析:理解需求文档,识别测试范围和关键点。制定测试计划:确定测试目标、资源、工具、时间表和风险评估。设计测试用例:根据需求和边界条件编写测试用例(输入、操作、预期结果)。搭建测试环境:配置硬件、软件、网络等测试环境。执行测试:运行测试用例,记录实际结果与预期结果的差异。缺陷跟踪:使用工具(如Jira)记录缺陷,跟踪修复进度。测试报告:总结测试覆盖率、缺陷统计、质量评估及改进建议。
五、常用测试思想、方法与技术
1. 方法论与思想
测试分析TA&TD测试分析和测试设计方法论(KYM、TOP、MFQ、PPDS)
2. 测试设计技术
等价类划分:将输入划分为有效/无效等价类,减少测试用例数量。边界值分析:针对输入范围的边界值(如最大值、最小值)设计用例。因果图法:分析输入条件与输出结果之间的逻辑关系。
3. 自动化测试工具
功能测试工具:Selenium(Web应用)、Appium(移动应用)、Katalon Studio。性能测试工具:JMeter、LoadRunner、Gatling。接口测试工具:Postman、SoapUI、RestAssured。
4. 测试驱动开发(TDD)
先编写测试用例,再开发代码以满足测试要求,强调“先测试后实现”。
六、常见误区
测试等于调试:测试是发现缺陷,调试是定位并修复缺陷。测试是开发者的责任:测试需由独立团队(如QA)或用户共同参与。自动化测试万能:自动化适合重复性高、稳定的场景,无法替代手动测试。
七、总结
软件测试是保障软件质量的关键环节,贯穿开发全生命周期。通过合理的测试策略、工具和流程,可以有效降低风险、提升效率,并为用户提供可靠的产品。无论是手动测试还是自动化测试,都需要结合具体场景选择合适的方法。