1.1 测试内容介绍
界面测试验证用户界面(UI)的视觉呈现和交互逻辑,确保符合设计规范并提供良好的用户体验。测试内容包括:
1.2 关键指标
1.3 常见界面错误
2.1 可靠性概念
可靠性指系统在规定条件下和时间内,无故障执行所需功能的能力。反映软件的健壮性和持续服务能力。
2.2 关键指标
可靠性等级 | 年故障时间 | 适用场景 |
---|---|---|
99.9%(三个9) | ≤8.76小时 | 普通应用 |
99.99%(四个9) | ≤52.6分钟 | 企业系统 |
99.999%(五个9) | ≤5.26分钟 | 金融/医疗 |
2.3 常见可靠性问题
验证系统在异常输入或故障环境下的自我恢复能力:
国家有关计算机软件产品开发文件编制指南中共有14 种文件,可分为3 大类。
在实际的测试中,最常见的是用户文件的测试,例如:手册说明书等。也会有一些公司对需求文档进行测试,来保证需求文档的质量。
测试要点:
跨维度兼容验证矩阵:
维度 | 测试范围 | 工具推荐 |
---|---|---|
操作系统 | Windows/macOS/Linux/iOS/Android | VirtualBox, Docker |
浏览器 | Chrome/Firefox/Safari/Edge | BrowserStack |
分辨率 | 720P/1080P/4K/折叠屏 | Viewport Resizer |
外设 | 打印机/扫描仪/特殊输入设备 | Device Farmer |
API版本 | 向后兼容3个历史版本 | Postman, Swagger |
基于尼尔森十大原则的验证:
关键测试场景矩阵:
阶段 | Windows | macOS | Linux | Mobile |
---|---|---|---|---|
安装 | 管理员/普通权限安装 | 应用商店/直接安装 | 源码编译/包管理器 | 应用商店/侧载 |
升级 | 增量更新/覆盖安装 | 版本兼容升级 | 依赖冲突解决 | 热更新/强更 |
卸载 | 控制面板卸载残留检测 | AppCleaner验证 | 包管理器卸载验证 | 清除用户数据 |
回滚 | 版本回退功能 | TimeMachine恢复 | 快照还原 | 历史版本安装 |
OWASP Top 10 2023核心测试点:
渗透测试工具链:
分层性能指标:
层级 | 关键指标 | 测试工具 |
---|---|---|
前端 | FCP/LCP/FID/CLS | Lighthouse |
接口 | TPS/响应时间P99/错误率 | JMeter, Locust |
服务器 | CPU/内存/磁盘IO/网络吞吐 | Prometheus, Grafana |
数据库 | 查询耗时/锁等待/连接池 | SQL Profiler |
全链路 | 端到端延迟/事务成功率 | SkyWalking |
性能反模式检测:
内存泄漏检测方法论:
内存泄漏典型场景:
排查黄金法则:
优点 | 缺点 |
---|---|
✅ 无需了解内部实现细节 | ❌ 无法覆盖所有代码路径 |
✅ 贴近用户实际使用场景 | ❌ 可能遗漏边界条件组合 |
✅ 早期即可开展测试 | ❌ 测试用例设计依赖需求质量 |
✅ 适合功能验证 | ❌ 难以检测深层次逻辑错误 |
定义:确保程序中的每条可执行语句至少被执行一次
测试用例设计:
# 示例函数
def login(username, password):
if username == "admin": # 语句1
print("管理员登录") # 语句2
else:
print("普通用户登录") # 语句3
return True # 语句4
# 满足语句覆盖的用例
test_case1 = ("admin", "123456") # 覆盖语句1,2,4
test_case2 = ("user", "password") # 覆盖语句1,3,4
覆盖能力:⭐
缺陷检测:无法发现条件分支中的逻辑错误
定义:每个逻辑判断的真假分支至少执行一次
测试用例设计:
# 示例函数
def check_discount(amount, is_vip):
if amount > 100 and is_vip: # 判定点
return 0.8
return 1.0
# 满足判定覆盖的用例
test_case1 = (150, True) # 真分支
test_case2 = (50, False) # 假分支
覆盖能力:⭐⭐
局限:无法检测条件内部的错误(如 amount > 100
写成 amount >= 100
)
定义:每个子条件的真假取值至少出现一次
测试用例设计:
# 示例函数
def grant_access(age, has_permission):
if age >= 18 and has_permission: # 条件1: age>=18, 条件2: has_permission
return True
return False
# 条件覆盖用例
test_case1 = (20, True) # 条件1真, 条件2真
test_case2 = (15, False) # 条件1假, 条件2假
覆盖能力:⭐⭐⭐
特点:比判定覆盖更细致,但可能遗漏判定组合
定义:同时满足判定覆盖和条件覆盖
测试用例设计:
# 接上例
test_case1 = (20, True) # 真分支, 条件1真, 条件2真
test_case2 = (15, True) # 假分支, 条件1假, 条件2真 → 覆盖假分支
test_case3 = (20, False) # 假分支, 条件1真, 条件2假 → 覆盖假分支
覆盖能力:⭐⭐⭐⭐
价值:平衡了判定和条件的验证深度
定义:所有条件取值的可能组合都被覆盖
测试用例设计:
# 两个条件,需4种组合
test_case1 = (20, True) # 条件1真, 条件2真 → 真分支
test_case2 = (20, False) # 条件1真, 条件2假 → 假分支
test_case3 = (15, True) # 条件1假, 条件2真 → 假分支
test_case4 = (15, False) # 条件1假, 条件2假 → 假分支
覆盖能力:⭐⭐⭐⭐⭐
代价:条件数n → 组合数2^n(指数级增长)
定义:覆盖程序中所有可能的执行路径
测试用例设计:
def process_order(status, amount):
if status == "PAID": # 分支1
if amount > 1000: # 分支2
print("大额订单审核")
else:
print("订单直接发货")
else:
print("等待付款")
# 路径覆盖用例
test_case1 = ("PAID", 1500) # 路径:分支1真→分支2真
test_case2 = ("PAID", 500) # 路径:分支1真→分支2假
test_case3 = ("UNPAID", 0) # 路径:分支1假
覆盖能力:⭐⭐⭐⭐⭐
挑战:循环结构可能导致路径无限(需设置最大迭代)
优点 | 缺点 |
---|---|
✅ 高代码覆盖率(可达100%) | ❌ 需要编程能力和源码访问权限 |
✅ 发现深层次逻辑错误 | ❌ 测试成本高(设计/维护) |
✅ 适合关键模块测试 | ❌ 可能产生"过度测试" |
✅ 支持自动化测试 | ❌ 无法检测遗漏功能 |
优势 | 挑战 |
---|---|
✅ 兼顾内外视角 | ❌ 需要跨领域技能 |
✅ 高效定位缺陷根源 | ❌ 测试设计复杂度高 |
✅ 适合微服务架构 | ❌ 工具链整合成本 |
✅ 优化测试资源分配 | ❌ 可能遗漏纯黑盒场景 |
单元测试是对软件组成单元进行测试。其目的是检验软件基本组成单位的正确性。测试的对象是软件设计的最小单位:模块。
集成测试也称联合测试(联调)、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。集成主要目的是检查软件单位之间的接口是否正确。
将软件系统看成是一个系统的测试。包括对功能、性能以及软件所运行的软硬件环境进行测试。
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件主要功能和核心流程正常,在正式进行系统测试之前执行。冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时,先进行冒烟测试,保证基本功能正常,不阻碍后续的测试。
如果冒烟测试通过,则测试人员开始进行正式的系统测试,如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过,再开始进行系统测试。
回归测试和冒烟测试都属于系统测试
验收测试是部署软件之前的最后一个测试操作。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买都展示该软件系统满足原始需求。
类型 | 执行者 | 典型活动 |
---|---|---|
Alpha测试 | 内部用户 | 受控环境模拟操作 |
Beta测试 | 外部公测用户 | 真实环境收集反馈 |
UAT(用户验收测试) | 真实客户 | 生产环境验证业务流程 |
合同验收测试 | 客户+供应商 | SLA(服务等级协议)验证 |
谓静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。不以测试数据的执行而是对测试对象的分析过程,仅通过分析或检查源程序的设计、内部结构、逻辑、代码风格和规格等来检查程序的正确性。
动态测试(dynamic testing),指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程,所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运行程序。
手工测试就是由人去一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。
优点:自动化无法替代探索性测试、发散思维结果的测试。
缺点:执行效率慢,量大易错。
在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。简单说自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。
国际化测试、本地化测试