移动端专项测试教程(软件测试人员专用)¶
本教程面向软件测试工程师,系统讲解移动端 App 专项测试,从弱网模拟、兼容性覆盖到崩溃分析与性能监控,帮助你建立完整的移动端测试能力。
前置要求¶
| 项目 | 要求 | 获取方式 |
|---|---|---|
| 软件测试基础 | 了解测试用例设计、Bug 提交流程 | 通用基础 |
| 接口测试基础 | 了解 HTTP 请求/响应、抓包工具基本使用 | 接口测试完整教程 |
| 命令行基础 | 能在终端执行基本命令 | 通用基础 |
| 移动设备 | Android 真机或 iOS 真机至少一台 | 自备或团队共享 |
新手导读¶
移动端测试比 Web 测试多了很多"不可控因素"——不同厂商的系统、不同网络环境、不同权限状态,这些都会导致 Bug。第一遍不需要记住所有工具命令,重点理解"为什么做"和"测什么"。
建议学习顺序:
- 理解移动端测试与 Web 测试的核心差异。
- 用 Charles 或 Fiddler 模拟一次弱网,观察 App 表现。
- 列出你当前项目的兼容性测试矩阵。
- 用 adb 命令查看一次 App 的内存占用。
- 理解崩溃日志的基本结构。
- 实际操作一次覆盖升级测试。
能发现真实场景下的 Bug,比记住所有命令更重要。
版本与维护说明¶
| 项目 | 说明 |
|---|---|
| 适用平台 | Android 8.0+、iOS 13+ |
| 工具 | Charles、Fiddler、adb、Xcode Instruments |
| 使用建议 | 以真机为主,模拟器为辅 |
| 更新提醒 | Android 权限模型和 iOS 系统行为每版都有变化,注意核对 |
一、移动端测试概述¶
1.1 移动端测试 vs Web 测试的差异¶
| 维度 | Web 测试 | 移动端测试 |
|---|---|---|
| 设备 | 浏览器种类有限 | 机型、系统版本、分辨率碎片化严重 |
| 网络 | 通常稳定的 Wi-Fi/有线 | Wi-Fi、4G、5G、弱信号频繁切换 |
| 交互 | 鼠标点击为主 | 触摸、滑动、长按、多点触控、陀螺仪 |
| 权限 | 浏览器沙箱,权限简单 | 系统级权限(相机、定位、存储、麦克风) |
| 生命周期 | 页面切换 | 前后台切换、系统杀进程、推送唤醒 |
| 安装/更新 | 浏览器自动加载 | 安装包下载、覆盖升级、卸载重装 |
1.2 移动端特有的测试维度¶
设备碎片化: Android 有数千款机型、数十个厂商 ROM,同一 API 在不同设备上行为可能不同。
网络环境: 用户可能在电梯、地铁、山区等弱信号环境使用 App,网络随时可能中断或切换。
系统权限: 用户可能拒绝授权或随时撤销权限,App 必须优雅降级而非崩溃。
系统干扰: 来电、闹钟、低电量弹窗、系统更新提示都可能打断 App 正常流程。
1.3 移动端专项测试全景图¶
移动端专项测试
├── 弱网测试 ← 网络层
├── 兼容性测试 ← 设备层
├── 性能监控 ← 资源层
├── 崩溃分析 ← 稳定性层
├── 安装/升级/卸载 ← 生命周期层
├── 推送通知 ← 消息层
├── 手势与交互 ← 交互层
└── 系统权限 ← 安全层
二、弱网测试¶
2.1 为什么要做弱网测试¶
真实用户场景中,弱网无处不在:
| 场景 | 典型网络状况 |
|---|---|
| 电梯/地下车库 | 信号极弱或无信号 |
| 地铁/高铁 | 频繁切换基站,网络不稳定 |
| 偏远山区 | 2G/低速 3G |
| 人流密集场所 | 带宽被共享,实际速度低 |
弱网下 App 的表现直接影响用户体验:页面白屏、数据丢失、重复提交、操作无响应,都是常见问题。
2.2 Charles 模拟弱网¶
Throttle 设置步骤:
- 打开 Charles →
Proxy→Throttle Settings - 勾选
Enable Throttling - 选择预设或自定义参数:
| 预设 | 带宽 | 延迟 | 适用场景 |
|---|---|---|---|
| 56 kbps (Modem) | 56 kbps | 300ms | 极弱网 |
| 256 kbps (DSL) | 256 kbps | 200ms | 弱 2G |
| 512 kbps | 512 kbps | 100ms | 3G |
| 2 Mbps | 2 Mbps | 50ms | 4G |
- 可勾选
Only for selected hosts限定只对特定域名限速
自定义配置示例(模拟弱 3G):
2.3 Fiddler 模拟弱网¶
打开 Fiddler → Rules → Customize Rules,在 OnBeforeRequest 中添加:
if (oSession.HostnameIs("api.yourapp.com")) {
oSession["request-trickle-delay"] = "300"; // 发送延迟 ms/KB
oSession["response-trickle-delay"] = "300"; // 接收延迟 ms/KB
}
启用:Rules → Performance → Simulate Modem Speeds
2.4 常见弱网场景速查¶
| 场景 | 带宽 | 延迟 | 丢包率 |
|---|---|---|---|
| 2G (GPRS) | 50-100 kbps | 300-500ms | 2-5% |
| 弱 3G | 200-500 kbps | 150-300ms | 1-2% |
| 正常 3G | 1-2 Mbps | 100-200ms | <1% |
| 弱 4G | 2-5 Mbps | 50-100ms | <1% |
| 高延迟 | 不限 | 500ms+ | 0% |
| 断网恢复 | 0 → 恢复 | - | 100% → 0% |
2.5 弱网下的常见 Bug¶
| Bug 类型 | 表现 | 根因 |
|---|---|---|
| 请求超时 | 页面长时间 loading 或白屏 | 未设置合理的超时时间 |
| 重复提交 | 同一订单/评论创建多条 | 前端未做防重,后端未做幂等 |
| 数据丢失 | 填写的内容提交后消失 | 缓存策略不当 |
| 图片加载失败 | 头像/商品图显示空白 | 未做降级/占位图处理 |
| 页面状态不一致 | 列表已更新但详情还是旧数据 | 缓存未刷新 |
| 断网恢复后异常 | 网络恢复后页面无法继续使用 | 未监听网络状态变化 |
三、兼容性测试¶
3.1 兼容性测试矩阵设计¶
核心原则:用有限的设备覆盖最大范围的用户。
| 维度 | Android | iOS |
|---|---|---|
| OS 版本 | 8.0 / 10 / 12 / 14 / 15 | 13 / 14 / 15 / 16 / 17 |
| 屏幕尺寸 | 5.0" / 5.5" / 6.1" / 6.7" / 折叠屏 | SE / 标准 / Plus / Pro Max / iPad |
| 厂商 | 华为 / 小米 / OPPO / vivo / 三星 / 荣耀 | Apple |
优先级策略:
- P0(必测): Top 3 机型 + 最新 OS + 最旧支持 OS
- P1(高优): Top 5-10 机型 + 主流分辨率
- P2(覆盖): 长尾机型 + 折叠屏 + 平板
3.2 真机测试 vs 云测平台¶
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 自有真机 | 完全可控、调试方便 | 机型有限、成本高 | 日常自测 |
| Testin | 海量机型、自动化执行 | 排队等待 | 兼容性批量验证 |
| AWS Device Farm | 真机远程操控 | 价格较高 | 出海产品 |
| Firebase Test Lab | Google 官方、集成 CI | 仅原生 | Google 生态项目 |
3.3 兼容性测试用例模板¶
| 用例编号 | 测试项 | 测试步骤 | 预期结果 | 设备组合 | 实际结果 | 状态 |
|---|---|---|---|---|---|---|
| CP-001 | 首页加载 | 冷启动 App | 3s 内完整展示 | 小米14/Android15 | 正常 | ✅ |
| CP-002 | 首页加载 | 冷启动 App | 3s 内完整展示 | 华为Mate60/HarmonyOS4 | 正常 | ✅ |
| CP-003 | 列表滑动 | 快速滑动100条 | 无卡顿 | 三星A54/Android14 | 轻微掉帧 | ⚠️ |
3.4 UI 适配问题检查清单¶
□ 文字是否溢出/截断(尤其长文案、多语言)
□ 图片是否拉伸/压缩/留白
□ 按钮/输入框是否被刘海/挖孔/圆角遮挡
□ 底部导航栏是否被系统手势条遮挡
□ 横竖屏切换后布局是否正常
□ 折叠屏展开/折叠后页面是否重绘
□ 大字体/无障碍模式下是否可用
□ 深色模式下文字/图标是否可见
□ 弹窗/底部弹出在不同屏幕高度下是否完整显示
四、移动端性能监控¶
4.1 Android 性能监控(adb)¶
内存信息:
CPU 信息:
电量消耗:
adb shell dumpsys batterystats --reset # 重置统计
adb shell dumpsys batterystats > battery.txt # 导出报告
# 关注:Estimated power use、Wakelock 持有时间
启动时间测量:
adb shell am force-stop com.example.app
adb shell am start -W com.example.app/.MainActivity
# 关注:TotalTime(Activity 创建到展示)、WaitTime(含系统调度)
4.2 iOS 性能监控(Instruments)¶
| Instrument | 用途 | 关注指标 |
|---|---|---|
| Time Profiler | CPU 分析 | 主线程耗时、方法调用栈 |
| Allocations | 内存分配 | 堆内存增长、对象生命周期 |
| Leaks | 内存泄漏 | 泄漏对象数量、大小 |
| Energy Log | 电量消耗 | 能耗等级、后台活动 |
| Network | 网络流量 | 请求次数、数据量、延迟 |
| Core Animation | UI 流畅度 | FPS、掉帧数 |
启动方式:Xcode → Product → Profile(⌘I)
4.3 流量消耗测试¶
| 场景 | 关注指标 |
|---|---|
| 首页加载 | 首屏总流量(KB) |
| 列表滑动 | 每屏增量流量 |
| 后台待机 | 静置 30 分钟后台流量是否为 0 |
| 图片加载 | 是否做了压缩、是否启用 gzip |
4.4 内存泄漏检测¶
常见泄漏场景:
| 场景 | 表现 |
|---|---|
| Activity/ViewController 被引用 | 退出页面后内存不降 |
| 未取消的网络回调 | 持有 Context/block 循环引用 |
| 未关闭的资源(Cursor、Stream) | FD 泄漏 |
| 静态集合持有对象引用 | 内存持续增长 |
检测方法:
- Android: 反复进出目标页面 5-10 次,观察
dumpsys meminfo中 Java Heap 是否持续增长 - iOS: Instruments → Allocations → Mark Heap → 操作 → 再次 Mark Heap → 对比增长
五、崩溃分析¶
5.1 Android 崩溃日志获取¶
adb logcat -d > device_log.txt # 导出完整日志
adb logcat *:E | grep -A 20 "FATAL\|ANR\|CRASH" # 过滤崩溃
adb pull /data/anr/traces.txt ./anr_traces.txt # ANR 日志
崩溃日志关键信息:
FATAL EXCEPTION: main
Process: com.example.app, PID: 12345
java.lang.NullPointerException: ...
at com.example.app.ui.ProfileFragment.onViewCreated(ProfileFragment.java:85)
需关注:异常类型、崩溃位置(类名:行号)、调用栈。
5.2 iOS 崩溃日志¶
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Thread 0 Crashed:
0 libobjc.A.dylib objc_msgSend + 16
1 ExampleApp -[ProfileViewController viewDidLoad] (ProfileViewController.m:42)
符号化命令:
5.3 常见崩溃类型¶
| 崩溃类型 | Android | iOS | 触发场景 |
|---|---|---|---|
| 空指针 | NullPointerException | EXC_BAD_ACCESS | 对象未初始化或已释放 |
| OOM | OutOfMemoryError | Jetsam(被系统杀) | 图片过多、内存泄漏 |
| ANR | Application Not Responding | watchdog timeout | 主线程阻塞超 5s |
| 数组越界 | IndexOutOfBoundsException | NSRangeException | 数据与 UI 不同步 |
| 类型转换 | ClassCastException | unrecognized selector | 接口返回类型变化 |
5.4 崩溃收集平台¶
| 平台 | 支持平台 | 特点 |
|---|---|---|
| Bugly(腾讯) | Android / iOS | 国内主流、免费 |
| Sentry | 全平台 | 开源、性能监控 |
| Firebase Crashlytics | Android / iOS | Google 官方、免费 |
| Instabug | Android / iOS | 用户反馈 + 崩溃 |
崩溃率标准: 优秀 < 0.1%,可接受 0.1%-0.5%,需关注 0.5%-1%,严重 > 1%。
六、安装/升级/卸载测试¶
6.1 全新安装测试点¶
□ 正常安装完成,图标显示正确
□ 首次启动引导页/权限弹窗正常展示
□ 存储空间不足时的安装提示
□ 安装过程中断后能否重新安装
□ 不同安装来源(应用商店、官网、ADB install)
□ 安装后权限默认状态是否正确
6.2 覆盖升级测试点¶
跨版本升级路径: v1.0 → v2.0(直接)、v1.0 → v1.5 → v2.0(逐级)、v1.0 → v2.0(跳版本,最容易出问题)
6.3 卸载后重装测试点¶
6.4 应用商店审核注意事项¶
| 平台 | 关键审核点 |
|---|---|
| App Store | 隐私政策、权限说明、IPv6 兼容、热更新限制 |
| Google Play | 64 位支持、目标 API Level、数据安全声明 |
| 国内商店 | 软著证书、备案号、隐私合规 |
七、推送通知测试¶
7.1 推送到达率测试¶
到达率 = 成功展示通知数 / 发送推送数 × 100%,目标 > 95%
7.2 推送点击跳转测试¶
7.3 免打扰/权限关闭场景¶
7.4 多平台推送差异¶
| 平台 | 推送服务 | 特点 |
|---|---|---|
| iOS | APNs | 统一通道、延迟低 |
| Android 原生 | FCM | 需 Google 服务、海外为主 |
| 华为 | HMS Push | 后台保活能力强 |
| 小米 | MiPush | 可达性高 |
| OPPO/vivo | 各自推送 | 设备专属 |
国内常见策略: 有厂商推送的用厂商通道,其余回退 FCM 或自建通道。
八、手势与交互测试¶
8.1 手势测试要点¶
| 手势 | 测试点 | 常见问题 |
|---|---|---|
| 单击 | 按钮响应 | 点击区域过小、误触 |
| 双击 | 放大、点赞 | 与单击冲突 |
| 长按 | 弹出菜单 | 与系统长按冲突 |
| 滑动 | 列表滚动 | 滑动方向冲突 |
| 下拉刷新 | 列表刷新 | 与系统下拉冲突 |
| 双指缩放 | 地图/图片 | 缩放不流畅 |
8.2 横竖屏切换测试¶
8.3 分屏模式¶
8.4 键盘弹出/收起¶
九、系统权限测试¶
9.1 权限测试矩阵¶
每项权限都需要测试三种状态:
| 测试状态 | 操作 | 预期表现 |
|---|---|---|
| 授予 | 用户允许权限 | 功能正常 |
| 拒绝 | 用户拒绝权限 | 功能降级,有提示,不崩溃 |
| 撤销 | 事后在设置中关闭 | 下次使用时重新请求或降级 |
9.2 运行时权限测试清单¶
| 权限 | 功能场景 | 拒绝后的降级方案 |
|---|---|---|
| 相机 | 扫码、拍照 | 使用相册选择 |
| 定位 | 地图、附近推荐 | 手动输入地址 |
| 存储/相册 | 保存图片、选文件 | 提示无权限 |
| 麦克风 | 语音输入、录音 | 使用文字输入 |
| 通知 | 推送消息 | 应用内提示开启 |
9.3 系统版本差异¶
| 版本 | 权限变更 |
|---|---|
| Android 6.0 | 运行时权限 |
| Android 10 | 后台定位单独申请、分区存储 |
| Android 11 | 一次性权限、自动重置未使用权限 |
| Android 12 | 精确/模糊定位可选 |
| Android 13 | 通知权限需运行时申请 |
| iOS 14 | 精确/模糊定位可选、剪贴板提示 |
| iOS 16 | 照片部分访问、粘贴权限确认 |
十、移动端测试工具速查¶
10.1 adb 常用命令速查表¶
设备管理:
| 命令 | 说明 |
|---|---|
adb devices |
列出已连接设备 |
adb install -r app.apk |
覆盖安装 |
adb uninstall com.example.app |
卸载应用 |
adb shell am start -n pkg/.Activity |
启动 Activity |
adb shell am force-stop pkg |
强制停止 |
日志与调试:
| 命令 | 说明 |
|---|---|
adb logcat |
实时查看日志 |
adb logcat -c |
清空日志 |
adb logcat -d > log.txt |
导出日志 |
adb logcat *:E |
只看 Error |
adb bugreport > bugreport.zip |
完整 Bug 报告 |
性能与操作:
| 命令 | 说明 |
|---|---|
adb shell dumpsys meminfo pkg |
内存详情 |
adb shell dumpsys cpuinfo |
CPU 使用 |
adb shell dumpsys battery |
电池状态 |
adb shell screencap /sdcard/s.png |
截图 |
adb shell screenrecord /sdcard/v.mp4 |
录屏 |
adb shell input tap 500 800 |
模拟点击 |
adb shell input swipe 500 1500 500 500 |
模拟滑动 |
10.2 Xcode Instruments 概述¶
| 工具 | 用途 |
|---|---|
| Time Profiler | CPU 分析、卡顿排查 |
| Allocations | 内存分配分析 |
| Leaks | 内存泄漏检测 |
| Zombies | 僵尸对象排查 |
| Network | 网络流量分析 |
| Energy Log | 电量分析 |
启动:Xcode ⌘I → 选择模板 → 录制 → 分析
10.3 Appium 特定配置¶
Android:
{
"platformName": "Android",
"automationName": "UiAutomator2",
"appPackage": "com.example.app",
"appActivity": ".MainActivity",
"noReset": true,
"newCommandTimeout": 300
}
iOS:
{
"platformName": "iOS",
"automationName": "XCUITest",
"bundleId": "com.example.app",
"noReset": true,
"newCommandTimeout": 300
}
常见问题: Android 安装超时增大 installTimeout;iOS WebDriverAgent 安装失败检查证书;元素定位优先用 accessibility-id;混合应用需切换 Context。
附录:移动端测试检查清单¶
安装/升级/卸载 □ 全新安装 □ 覆盖升级 □ 卸载重装 □ 跨版本升级
功能完整性 □ 核心功能 □ 边界场景 □ 异常处理
兼容性 □ OS版本 □ 机型覆盖 □ 分辨率 □ 厂商ROM
弱网/断网 □ 2G/3G □ 网络切换 □ 断网恢复
性能 □ 启动时间 □ 内存CPU □ 电量流量
稳定性 □ 崩溃率 □ ANR率 □ Monkey
权限 □ 授予 □ 拒绝 □ 撤销
推送 □ 到达率 □ 点击跳转 □ 权限关闭
手势交互 □ 滑动点击 □ 横竖屏 □ 分屏键盘
UI适配 □ 刘海挖孔 □ 折叠屏 □ 深色模式 □ 大字体
总结: 移动端专项测试的核心是覆盖"真实场景下的不可控因素"。弱网、兼容性、权限、崩溃是最高优先级。建议结合自动化框架(Appium / UIAutomator / XCUITest)将重复性测试自动化,把精力集中在探索性测试和新场景覆盖上。