软件测试方法有很多种,可以从不同维度进行分类。下面我将从测试设计方法、测试策略、测试类型等多个角度为您详细梳理常用的测试方法。
---
一、 按测试设计方法(黑盒、白盒、灰盒)
这是最核心的分类方式,描述了如何设计测试用例。
1. 黑盒测试
核心思想:只关心软件的输入和输出,不关心内部代码结构和实现方式。测试者像用户一样使用软件。
· 等价类划分:
· 原理:将所有可能的输入数据划分成若干个子集(等价类),从每个子集中选取少数有代表性的数据作为测试用例。
· 示例:测试一个输入1~100数字的文本框。有效等价类:1-100间的数字;无效等价类:0, 101, 字母, 特殊符号等。
· 边界值分析:
· 原理:大量错误发生在输入或输出的边界上。专门对边界值及其左右相邻的值进行测试。
· 示例:同上例,测试边界值:0, 1, 2, 99, 100, 101。
· 判定表/决策表:
· 原理:适用于有多个输入条件、多个操作(输出)的复杂业务逻辑。列出所有输入条件的组合及其对应的输出结果。
· 示例:测试用户登录(输入:用户名、密码;操作:登录成功、提示用户名错误、提示密码错误)。
· 因果图:
· 原理:一种辅助生成判定表的方法,通过分析输入的“因”和输出的“果”,找出其逻辑关系。
· 状态迁移图:
· 原理:针对那些状态会发生变化的系统或功能(如订单状态:未支付、已支付、已发货、已完成)。测试不同状态之间转换的路径是否正确。
· 场景法/用例法:
· 原理:基于用户场景或业务用例来设计测试用例,模拟真实用户操作流程。这是最常用、最直观的方法之一。
2. 白盒测试
核心思想:关注软件内部代码结构、逻辑路径和程序实现细节。需要测试人员懂代码。
· 语句覆盖:
· 标准:设计用例使得程序中的每条可执行语句至少执行一次。覆盖率最低。
· 判定覆盖/分支覆盖:
· 标准:设计用例使得程序中的每个判断的取真和取假分支至少执行一次。
· 条件覆盖:
· 标准:设计用例使得程序中的每个判断中的每个条件的可能取值至少执行一次。
· 路径覆盖:
· 标准:设计用例覆盖程序中所有可能的执行路径。覆盖率最高,但难度也最大,通常无法100%实现。
· 基本路径测试:
· 原理:在路径覆盖的基础上,简化出程序的基本独立路径(圈复杂度),保证这些基本路径都被覆盖。是一种实用的、强度较高的覆盖方法。
3. 灰盒测试
核心思想:介于黑盒和白盒之间。既关注外部的输出表现,也结合部分内部代码和结构知识(如接口定义、数据库Schema、日志等)来设计测试用例。这是目前集成测试和API测试中最常用的思路。
---
二、 按测试策略/阶段(测试金字塔)
这描述了测试在什么阶段、以何种粒度执行。
1. 单元测试:
· 对象:软件的最小可测试单元(如一个函数、一个类、一个方法)。
· 执行者:通常是开发人员。
· 方法:主要使用白盒测试方法。常用框架如JUnit, pytest, TestNG。
2. 集成测试:
· 对象:将多个单元模块组装起来,测试它们之间的接口和交互是否正确。
· 方法:常用灰盒测试方法。关注数据传递、接口调用、消息队列等。
3. 系统测试:
· 对象:完整的、集成后的软件系统。
· 目的:验证系统是否满足需求规格说明书的要求。
· 方法:几乎完全使用黑盒测试方法。这是测试工程师最主要的工作内容。
4. 验收测试:
· 对象:完整的系统。
· 目的:由用户或业务方进行,确认软件是否 ready for release,是否满足合同约定和业务需求。
· 分类:包括Alpha测试(公司内部模拟环境)、Beta测试(真实用户公测)、UAT(用户验收测试)。
---
三、 按测试类型(非功能特性)
除了测试功能对不对,还要测试好不好用。
· 性能测试:评估系统在各种负载下的响应时间和稳定性。
· 压力测试:极限负载下的表现。
· 负载测试:正常和峰值负载下的表现。
· 并发测试:多用户同时操作。
· 安全测试:发现系统漏洞,防止被黑客攻击。如SQL注入、XSS跨站脚本、CSRF等。
· 兼容性测试:测试软件在不同浏览器、操作系统、设备、分辨率下的表现。
· 可用性测试:测试软件是否易学、高效、令人满意,用户体验如何。
· 回归测试:这不是一种新方法,而是一种策略。当修复一个bug或增加新功能后,重新执行之前的测试用例,确保没有引入新的错误。自动化测试在此领域至关重要。
总结与选择
方法类别 核心关注点 常用技术 适用阶段
黑盒测试 输入输出,用户视角 等价类、边界值、场景法、判定表 系统测试、验收测试
白盒测试 内部逻辑,代码结构 语句覆盖、分支覆盖、路径覆盖 单元测试
灰盒测试 接口交互,内外结合 结合黑盒和白盒方法 集成测试、API测试
非功能测试 系统质量属性 性能、安全、兼容性工具 专项测试
在实际项目中,这些方法不是孤立使用的,而是需要紧密结合。例如:
1. 开发人员编写代码时,用白盒方法设计单元测试。
2. 测试人员根据需求文档,主要用黑盒方法(场景法、等价类等)设计系统测试用例。
3. 在测试模块间接口时,采用灰盒测试思想。
4. 在发布前,会进行性能、安全等专项测试。
5. 任何修改后,都要进行回归测试。