跳转至

移动端专项测试教程(软件测试人员专用)

本教程面向软件测试工程师,系统讲解移动端 App 专项测试,从弱网模拟、兼容性覆盖到崩溃分析与性能监控,帮助你建立完整的移动端测试能力。


前置要求

项目 要求 获取方式
软件测试基础 了解测试用例设计、Bug 提交流程 通用基础
接口测试基础 了解 HTTP 请求/响应、抓包工具基本使用 接口测试完整教程
命令行基础 能在终端执行基本命令 通用基础
移动设备 Android 真机或 iOS 真机至少一台 自备或团队共享

新手导读

移动端测试比 Web 测试多了很多"不可控因素"——不同厂商的系统、不同网络环境、不同权限状态,这些都会导致 Bug。第一遍不需要记住所有工具命令,重点理解"为什么做"和"测什么"。

建议学习顺序:

  1. 理解移动端测试与 Web 测试的核心差异。
  2. 用 Charles 或 Fiddler 模拟一次弱网,观察 App 表现。
  3. 列出你当前项目的兼容性测试矩阵。
  4. 用 adb 命令查看一次 App 的内存占用。
  5. 理解崩溃日志的基本结构。
  6. 实际操作一次覆盖升级测试。

能发现真实场景下的 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 设置步骤:

  1. 打开 Charles → ProxyThrottle Settings
  2. 勾选 Enable Throttling
  3. 选择预设或自定义参数:
预设 带宽 延迟 适用场景
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
  1. 可勾选 Only for selected hosts 限定只对特定域名限速

自定义配置示例(模拟弱 3G):

Bandwidth: 780 kbps | Utilisation: 80%
Latency: 200ms | Reliability: 90%(10% 丢包)

2.3 Fiddler 模拟弱网

打开 Fiddler → RulesCustomize Rules,在 OnBeforeRequest 中添加:

if (oSession.HostnameIs("api.yourapp.com")) {
    oSession["request-trickle-delay"] = "300";   // 发送延迟 ms/KB
    oSession["response-trickle-delay"] = "300";  // 接收延迟 ms/KB
}

启用:RulesPerformanceSimulate 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)

内存信息:

adb shell dumpsys meminfo com.example.app
# 关键指标:PSS Total、Java Heap、Native Heap、Graphics

CPU 信息:

adb shell dumpsys cpuinfo
adb shell top -d 1 | grep com.example.app

电量消耗:

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 → ProductProfile(⌘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)

符号化命令:

xcrun atos -o ExampleApp.app.dSYM/Contents/Resources/DWARF/ExampleApp -l 0x00001234 -arch arm64

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 卸载后重装测试点

□ 正常卸载完成,图标移除
□ 卸载后用户数据是否清除
□ 重装后是否为全新状态
□ iOS 注意:Keychain 数据可能残留!

6.4 应用商店审核注意事项

平台 关键审核点
App Store 隐私政策、权限说明、IPv6 兼容、热更新限制
Google Play 64 位支持、目标 API Level、数据安全声明
国内商店 软著证书、备案号、隐私合规

七、推送通知测试

7.1 推送到达率测试

□ App 在前台时收到推送
□ App 在后台时收到推送
□ App 被杀进程后收到推送
□ 设备重启后收到推送(App 未打开)
□ 网络断开后恢复,延迟推送是否补发

到达率 = 成功展示通知数 / 发送推送数 × 100%,目标 > 95%

7.2 推送点击跳转测试

□ 点击通知打开 App 并跳转到正确页面
□ 参数正确传递(订单ID、活动ID)
□ 冷启动后正确跳转
□ 通知已过期时的处理

7.3 免打扰/权限关闭场景

□ 用户关闭通知权限后不弹出通知
□ 开启免打扰模式不弹出通知
□ 应用内关闭推送开关后不收到推送
□ 权限关闭后重新开启恢复正常

7.4 多平台推送差异

平台 推送服务 特点
iOS APNs 统一通道、延迟低
Android 原生 FCM 需 Google 服务、海外为主
华为 HMS Push 后台保活能力强
小米 MiPush 可达性高
OPPO/vivo 各自推送 设备专属

国内常见策略: 有厂商推送的用厂商通道,其余回退 FCM 或自建通道。


八、手势与交互测试

8.1 手势测试要点

手势 测试点 常见问题
单击 按钮响应 点击区域过小、误触
双击 放大、点赞 与单击冲突
长按 弹出菜单 与系统长按冲突
滑动 列表滚动 滑动方向冲突
下拉刷新 列表刷新 与系统下拉冲突
双指缩放 地图/图片 缩放不流畅

8.2 横竖屏切换测试

□ App 支持自动旋转时,布局正确
□ App 锁定竖屏时,旋转不触发重绘
□ 切换过程中输入框内容不丢失
□ 视频播放页面横屏全屏正常

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)将重复性测试自动化,把精力集中在探索性测试和新场景覆盖上。