软件测试分类目录
1. 测试金字塔
由测试金字塔可以看出, 投入相同的人力和物力, 从下到上, 投入产出比越来越小
- 从下到上的测试, 成本越来越高
- 从下到上的测试, 效率越来越低
- 从下到上的测试, 定位问题越来越难
2. 软件测试分类
2.1 按照开发阶段进行划分
(1). 单元测试
单元测试又称为模块测试: 针对程序中一个小的单元模块进行测试
- 测试目的: 检验软件基本组成单位的正确性
- 测试阶段: 编码后或编码前
- 测试对象: 软件设计的最小单位 — 模块
- 测试人员: 白盒测试工程师或开发工程师
- 测试依据: 代码 + 注释, 详细设计文档
- 测试方法: 白盒测试
- 测试内容: 模块接口测试, 局部数据结构测试, 路径测试, 错误处理测试, 边界测试
(2). 集成测试
集成: 按照一定的组合策略, 把功能模块组装起来
集成测试: 对组装后的模块进行功能测试
- 测试目的: 检查软件单位之间的接口是否正确
- 测试阶段: 单元测试通过之后
- 测试对象: 模块间的接口
- 测试人员: 白盒测试工程师或开发工程师
- 测试依据: 单元测试模块 + 概要设计文档
- 测试方法: 黑盒测试和白盒测试相结合
- 测试内容: 模块之间数据传输, 模块之间功能冲突, 模块组装功能正确性, 全局数据结构, 单模块缺陷对系统的影响
(3). 系统测试
系统测试是一个较为全面的测试, 一般将软件系统看成是一个系统的测试, 包括对功能, 性能以及软件所运行的软硬件环境进行测试
- 测试阶段: 集成测试通过之后
- 测试对象: 整个系统(软, 硬件)
- 测试人员: 黑盒测试工程师
- 测试依据: 需求说明文档
- 测试方法: 黑盒测试
- 测试内容: 界面, 功能, 性能, 兼容性, 安全性等
系统测试包括: 回归测试和冒烟测试
①. 回归测试
回归测试是指修改了旧代码后, 重新进行测试用以确认此次修改没有引入新的错误或导致其他代码错误
②. 冒烟测试
冒烟测试这一术语来自硬件行业, 顾名思义, 刚给机器通上电, 还没测试, 机器就冒烟了
- 测试对象: 每一个新编译好, 需要进行正式测试的软件版本
- 测试目的: 确认软件基本功能正常, 可以进行后续的正式测试工作
通常情况下, 测试人员可以通过冒烟测试决定是否接受该版本软件的测试
(4). 验收测试
验收测试是部署软件之前的最后一个测试, 又称为交付测试 / 用户测试
- 测试目的: 确保软件准备就绪
- 测试阶段: 系统测试通过之后
- 测试对象: 整个系统(包括软, 硬件)
- 测试人员: 最终用户或需求方
- 测试依据: 用户需求, 验收标准
- 测试方法: 黑盒测试
- 测试内容: 界面, 功能, 性能, 安全性, 兼容性等
注意:
验收测试的内容除了系统以外, 还需要对文档进行验收(用户手册, 功能手册等)
2.2 按照测试实施组织进行划分
①. α测试
α测试: 把用户请到开发现场进行测试
- 优点: 方便用户及时和开发人员沟通系统的问题, 测试时间相对集中
- 缺点: 用户测试的思路会受到开发环境的限制
②. β测试
β测试: 用户在实际使用环境下进行测试
- 优点: 在实际使用环境下进行测试, 测试环境更加接近用户的实际使用环境
- 缺点: 测试不集中
α测试和β测试的区别
- α测试是优先于β测试的
- 测试场所不同: α测试的测试场所是开发现场; β测试的测试场所是实际使用环境
- α测试的测试人员较少, 测试时间集中; β测试的测试人员较多, 测试时间不集中
③. 第三方测试
- 介于开发方和用户间的测试
2.3 按照是否运行划分
(1). 静态测试
静态测试是指: 不运行被测程序本身, 仅通过分析原码, 接口, 分析需求, 软件规格说明书等来找错
(2). 动态测试
动态测试是指: 通过对被测程序执行测试用例, 查看程序运行结果并分析它和预期结果的差异性
2.4 按是否手工划分
(1). 手工测试
手工测试: 由人一个一个手工的输入测试用例, 然后观察结果
- 优点: 灵活性强, 可以充分利用人的发散性思维和探索性思维
- 缺点: 执行效率低, 量大易错
(2). 自动化测试
自动化测试就是在预设条件下运行系统或者应用程序, 评估运行结果
只有当系统功能稳定且变动不大的情况下, 才可以更好的使用自动化测试
自动化测试是否可以代替手工测试?
答案当然是不可以了, 原因有两点:
- 当系统功能不稳定, 变动大的情况下, 自动化代码就需要不停的修改
- 自动化测试结果是无法代替探索性测试和发散性测试的结果的
2.5 按照是否查看代码划分
(1). 黑盒测试
黑盒测试: 相当于把软件看成一个黑色的盒子, 因此是一种并不关系软件的内部结构, 只关心输入和输出的一种测试方法
黑盒测试的方法有: 等价类, 边界值, 因果图, 正交排列法, 场景法以及错误猜测法. 详细的方法说明可以参考该篇博客https://blog.csdn.net/HHHuYYYue/article/details/107612159.
(2). 白盒测试
白盒测试: 相当于一个打开的盒子, 因此是一种需要关心程序内部逻辑和结构的一种测试方法.
白盒测试的测试方法有: 逻辑覆盖法, 语句覆盖法, 循环覆盖法, 路径覆盖法
逻辑覆盖法又分为: 判定覆盖, 条件覆盖, 判定和条件的组合, 条件和条件的组合, 判定和判定的组合.
(3). 灰盒测试
灰盒测试: 介于白盒和黑盒之间的一种测试方法, 既要关系程序内部结构和逻辑, 又要关心软件的输入和输出情况
2.6 按照测试地域划分
(1). 国际化测试
在设计或者开发软件的过程中, 使得软件可以适用于不同的语言以及不同的风俗习惯, 在软件进行语言转换的时候, 也不需要对源码进行修改, 这种工程技术, 就称为软件国际化.
(2). 本地化测试
2.7 按照测试对象划分
(1). 业务测试
业务测试: 测试人员将系统模块全部串接起来运行, 模拟真实用户实际的工作流程, 满足用户需求定义的功能来进行测试的过程
业务测试通常使用场景法进行测试
如何快速熟悉一个系统的业务?
- 自己亲自使用一下系统, 了解系统的业务
- 查看系统说明文档
- 对于较为复杂的系统, 可以记录下每个场景的具体业务是什么
(2). 界面测试
界面测试通常是对界面上的标题, 图片, 控件以及排版进行测试的.
- 标题: 字体的大小, 类型, 粗细, 是否斜体等
- 图片: 图片是否清晰, 大小以及位置等
- 控件: 滚动条, 按钮等
- 界面布局: 整个页面的布局是否合理, 美观等
界面测试中常见的 BUG 有:
- 不合适的快捷键
- 丢失文字(控件, 弹出框等)
- 文字被截断, 没有展示出来
- 行与行之间没有对齐
- 一行还没有写完就自动换行
- 文字展示重叠, 被覆盖掉
- 重复的快捷键
响应式的界面测试要点(如: 微信页面, 可以适用于不同的屏幕大小):
- 页面在不同的屏幕(分辨率)下, 文字有没有消失, 重叠等现象, 是否可以完全的展示
- 页面在不同的屏幕(分辨率)下, 图片有没有变形, 不清晰, 消失或者重叠现象发生
- 页面在不同的屏幕(分辨率)下, 页面的排版, 布局还是否合理
- 页面在不同的屏幕(分辨率)下. 页面是否是按照需求设计去展示的
(3). 容错性测试
容错性测试是指: 系统在发生一些错误或者不当操作的时候, 能够自我处理这些错误, 不让错误或者异常直接抛给客户
容错性测试:
- 数据及数据类型异常: 例如: 输入了 3.001 元
- 例如: 搜索的时候, 应该过滤掉输入字符串的前后端空格
- 系统的软硬件容错性:
- 服务器硬件发生故障, 需要有备用的服务器, 进行用户无感知切换
- 系统崩溃(宕机), 需要切换到备用系统上
- 断电, 断网, 需要有备用电源, 备用网络进行切换
失效恢复性测试: 人为的用一些暴力的手段让系统发生故障, 查看系统的自我保护和自我恢复能力
(4). 文档测试
文档测试的测试对象为: 开发文档(设计文档, 接口文档等), 用户文档(用户使用手册, 功能介绍文档等), 管理文档等
文档测试的关注点在于:
- 文档的术语
- 文档的正确性
- 文档的完整性
- 文档的一致性
- 文档的易用性
(5). 兼容性测试
兼容性主要是指软件之间是否能够很好的运做, 软件和硬件之间是否能高效率的进行工作
兼容性:
- 平台和浏览器的兼容性
- 手机APP: 测试软件在不同的手机系统中功能是否正常, 页面展示是否正常
- 浏览器: web 系统需要在不同的浏览器上进行测试
- 软件向前向后的兼容性
软件目前的迭代不能影响系统之前的功能, 也不能影响未来系统迭代功能 - 不同软件的兼容性
- 同一厂家不同的软件之间具有兼容性
- 不同厂家的软件具有兼容性
- 数据兼容
(6). 易用性测试
易用性测试又称用户体验测试, 测试产品是否容易使用
(7). 安全测试
测试程序的安装, 卸载
(8). 安全性测试
安全性测试的主要内容: SQL 注入, XSS 注入, 爬虫, 网络攻击等
对于上传下载的安全性测试要点:
- 上传和下载的过程中不能被拦截
- 不能上传有病毒的文件
- 上传或者下载的文件过大, 系统能够检测到并提示
(9). 性能测试
性能测试需要关注的要点:
- 系统运行时占用的资源: 内存, CPU, 磁盘, 网络带宽, 耗电量等
- 并发数: 同一时刻使用系统同一功能的用户数
- 吞吐量: 服务器单位时间处理的信息量, 单位时间吞吐量越大, 说明系统性能越好
- 响应时间: 用户发送请求 到 用户看到自己预期的响应内容的时间间隔
(10). 内存泄漏测试
内存泄漏的原因: 分配的内存没有办法回收 / 分配的内存没有及时回收 / API 引用有问题, 造成无法回收