返回业务状态流转测试App 结果由四层共同影响
中断后的恢复判断
权限状态流转 网络异常要覆盖不同注入时点
外部入口进入业务页面
移动端问题证据链
Main Track / Tutorial 08
移动端 App 测试实战教程
把商城交易放进真实设备环境,验证安装升级、系统中断、权限、网络变化和平台差异下的业务连续性。
9 个章节Android + iOS设备操作 + 日志证据
01
移动端比 Web 多了哪些变量
业务运行在设备与系统中业务状态订单支付退款
应用状态前台后台与进程
系统能力权限通知相机
设备网络机型系统与链路
先准备设备矩阵
- 按真实用户占比选择 Android/iOS 主版本与代表机型。
- 覆盖高低性能、不同屏幕和至少一台真机。
- 记录 App 版本、构建号、渠道、系统和网络。
- 高风险支付与退款优先在目标设备组合验证。
模拟器适合快速回归,但不能完全替代真机上的相机、推送、网络切换、性能、厂商系统和生物识别验证。
02
验证安装、升级与卸载
版本变化不能破坏用户数据应用生命周期场景
| 场景 | 准备条件 | 关键预期 |
|---|---|---|
| 首次安装 | 新设备、低存储、不同系统版本 | 启动正常,不生成脏数据 |
| 覆盖升级 | 旧版本登录态、购物车、待支付订单 | 兼容旧数据,核心状态不丢失 |
| 跨版本升级 | 跳过一个或多个历史版本 | 迁移脚本仍能正确执行 |
| 卸载重装 | 本地缓存、通知权限、服务端账号 | 本地数据按设计清除,服务端订单保留 |
升级测试步骤
- 安装线上或指定旧版本并登录。
- 创建购物车、待支付订单和退款中订单。
- 不清数据覆盖安装新版本。
- 首次启动检查迁移、权限提示和崩溃。
- 核对登录态、购物车与三个订单状态。
- 完成一次新下单、模拟支付和退款。
升级用例
- 当旧版本存在待支付订单时,升级后订单仍可查询且金额不变。
- 当升级过程中空间不足时,安装失败不破坏原可用版本。
- 当卸载后重新安装时,本地敏感信息不被错误恢复。
03
测试前后台切换与系统中断
随时会被打断交易进行中记录本地状态
系统中断后台、锁屏、来电
应用恢复重新查询服务端
继续或结束按真实状态展示
支付过程中的中断
| 中断 | 操作 | 检查 |
|---|---|---|
| 切到后台 | 支付中按 Home,等待后恢复 | 不重复支付,能查询最终结果 |
| 来电/通知 | 收银台被系统界面覆盖 | 恢复后页面和输入状态合理 |
| 锁屏 | 提交订单后立即锁屏 | 解锁后不重复提交且状态更新 |
| 进程被杀 | 后台清理 App 后重启 | 从服务端恢复订单真实状态 |
| 横竖屏/多窗口 | 关键页面改变窗口形态 | 不丢数据、不重复触发请求 |
恢复页面时以服务端状态为准。不要仅凭本地“支付中”动画决定成功或失败。
04
覆盖首次、拒绝和再次授权
权限也有状态流转未询问解释使用目的
已允许使用最小权限
已拒绝提供替代路径
永久拒绝引导系统设置
相机扫码退款凭证
- 当首次扫码时,先解释用途再请求相机权限。
- 当用户拒绝相机权限时,功能给出替代上传方式。
- 当用户永久拒绝时,引导到系统设置但不死循环弹窗。
- 当授权后又在设置中关闭时,再次扫码能识别变化。
- 当照片包含个人信息时,只申请必要访问范围并按规则清理。
不要把“用户拒绝权限”当异常崩溃场景。核心交易若不依赖该权限,应当仍可继续完成。
05
在弱网、断网和网络切换中验证
慢、丢、断、切发送前断网请求未发出
发送后丢包结果未知
响应慢超时与等待
恢复网络查询与幂等重试
交易弱网用例
| 条件 | 当……时,…… | 关键证据 |
|---|---|---|
| 提交前断网 | 当无网络提交订单时,页面提示可恢复且不生成订单 | 请求未到达或明确失败 |
| 响应前断网 | 当订单请求已受理但响应丢失时,重试不会创建第二单 | 幂等键与最终订单数 |
| 支付中切网 | 当 Wi-Fi 切到蜂窝网络时,App 查询支付最终结果 | 支付单与订单一致 |
| 高延迟 | 当退款响应变慢时,按钮保持防重且允许离开后查询 | 单一退款单与超时策略 |
执行原则
- 准备可清理的测试订单并记录初始状态。
- 设置延迟、丢包、断网或网络切换条件。
- 在请求前、发送后、响应前分别注入变化。
- 恢复网络后查询服务端最终状态。
- 核对重复请求、提示、重试、数据和日志。
06
测试推送、深链与扫码
从系统入口回到正确业务推送/深链/扫码携带定位信息
App 唤起解析安全参数
身份校验登录与数据权限
业务查询展示最新状态
外部入口测试
| 能力 | 测试点 | 商城预期 |
|---|---|---|
| 推送 | 前台、后台、进程关闭、权限关闭 | 退款进度通知准确,点击进入对应退款单 |
| 深链 | 已登录、未登录、链接过期、参数篡改 | 登录后回到授权订单,不泄露他人信息 |
| 扫码 | 正常、模糊、无效、重复、相册导入 | 识别安全,错误可恢复,不重复领券 |
| 支付回跳 | 成功、取消、App 被杀、重复回跳 | 始终查询服务端结果,不仅信任回跳参数 |
推送文本和深链参数都不应被视为可信业务事实。打开页面后重新鉴权并查询最新订单或退款状态。
07
处理 Android 与 iOS 差异
同一目标,不同系统行为平台差异清单
| 方向 | Android | iOS |
|---|---|---|
| 返回行为 | 系统返回键、手势返回、Activity 栈 | 导航返回手势、视图栈 |
| 权限 | 版本与厂商差异较多 | 权限文案和系统策略更统一 |
| 后台 | 厂商省电可能杀进程 | 系统后台时间限制严格 |
| 推送 | 厂商通道与系统通知设置 | APNs、专注模式和通知摘要 |
| 安装 | APK/AAB、签名与渠道包 | TestFlight/企业签名与描述文件 |
平台用例
- 当 Android 用户按系统返回键离开支付页时,二次确认且不取消已受理支付。
- 当 iOS 用户侧滑返回时,页面行为与导航按钮一致。
- 当系统通知权限关闭时,退款进度仍可在 App 内查询。
- 当低内存导致进程回收时,重启后从服务端恢复交易状态。
08
使用 ADB 与设备日志定位问题
让现象有时间线屏幕现象录屏与时间
设备日志Crash / ANR
网络请求request_id
服务与数据订单最终状态
Android 常用只读排查命令
adb devices
adb shell getprop ro.build.version.release
adb shell dumpsys package com.example.mall
adb logcat -c
adb logcat -v time | findstr /i "order payment refund crash"
adb shell dumpsys activity activities定位“支付后 App 无响应”
- 记录设备、系统、App 版本和发生时间。
- 复现前清空日志,避免旧信息干扰。
- 同时记录订单号、request_id 和屏幕录制。
- 检查崩溃、ANR、网络异常和 Activity 切换。
- 把客户端时间线与接口、服务日志和业务数据对齐。
- 分享前删除令牌、账号和个人信息。
ADB 适用于已授权的测试设备。iOS 使用 Xcode Devices and Simulators 或 Console 收集对应设备日志,分析思路仍是“时间 + 业务 ID + 状态”。
09
完成一次移动商城实战
真机验证与证据闭环练习
- 选择 Android 与 iOS 各一台代表设备并记录环境。
- 准备旧版本中的登录态、购物车和三种订单状态后升级。
- 在支付中执行后台、锁屏、切网和杀进程。
- 验证相机权限首次允许、拒绝和设置中关闭。
- 验证退款推送和订单深链在登录前后的行为。
- 收集一次失败的设备日志并关联请求和订单数据。
- 按“当……时,……”写 12 条用例并给出结果。
设备与版本
- 矩阵有依据
- 升级数据保留
- 卸载行为明确
- 平台差异已覆盖
环境变化
- 前后台已覆盖
- 权限状态已覆盖
- 弱网断网已覆盖
- 进程恢复已覆盖
业务证据
- 请求可追踪
- 状态以服务端为准
- 数据没有重复
- 日志已经脱敏