【测试】移动APP测试操作手册
文章目录移动APP测试实战一、ADBAndroid 调试1.1 环境准备1.2 安装与卸载1.3 文件与日志1.4 应用管理1.5 专项操作1.6 ADB 常用场景速查二、Charles抓包 弱网2.1 HTTPS 抓包完整配置2.2 抓包实战技巧2.3 弱网模拟配置三、PerfDog性能测试3.1 安装和连接3.2 核心指标解读3.3 实战检测内存泄漏3.4 标签功能打点记录关键操作四、AppiumUI自动化4.1 环境搭建4.2 编写第一个测试4.3 元素定位实战4.4 Page Object 模式4.5 运行测试五、JMeter 后端性能压测5.1 创建测试计划六、一个版本的测试周期七、常用命令速查总表移动APP测试实战ADB命令调试、Charles抓包与弱网模拟、PerfDog性能监测、Appium自动化编写与执行、Battery Historian耗电分析、JMeter后端压测一、ADBAndroid 调试ADBAndroid Debug Bridge是连接电脑和 Android 设备的桥梁。不管使用什么测试工具底层都在调 ADB。能欧掌握ADB就是掌握了一切 Android 调试的入口。1.1 环境准备第一步下载 Platform Tools第二步手机端开启 USB 调试设置 → 关于手机 → 连续点击版本号7次 → 开启开发者选项 → 开发者选项 → 开启USB调试 → 连接电脑 → 手机上弹出允许USB调试 → 勾选始终允许 → 确定第三步验证连接# 查看已连接设备adb devices# 输出示例# List of devices attached# 8BDAX00A32 device ← 正常连接# 8BDAX00A32 unauthorized ← 手机上未点允许# 8BDAX00A32 offline ← 设备离线或ADB服务挂了ADB 服务管理adb kill-server# 杀掉ADB服务连接异常时先kill再startadb start-server# 启动ADB服务adb reconnect# 重新连接设备免拔线1.2 安装与卸载# 安装APKadbinstallapp.apk# 普通安装adbinstall-rapp.apk# 覆盖安装保留数据adbinstall-dapp.apk# 降级安装adbinstall-gapp.apk# 安装时自动授予所有权限# 卸载adb uninstall com.example.app# 卸载adb uninstall-kcom.example.app# 卸载但保留数据和缓存1.3 文件与日志# 文件传输adb push local_file /sdcard/# 电脑→手机adb pull /sdcard/remote_file ./# 手机→电脑# 截图和录屏adb shell screencap /sdcard/screen.png# 截图到手机adb pull /sdcard/screen.png# 拉到电脑adb shell screenrecord /sdcard/video.mp4# 录屏CtrlC停止# 日志查看adb logcat# 实时日志刷屏adb logcat-c# 清空日志缓冲区adb logcat-sTAG# 只看指定TAG的日志adb logcat|grepERROR# 过滤ERROR日志adb logcat-vtimecrash_log.txt# 带时间戳保存到文件adb logcat-bcrash# 只看崩溃日志# APP专属日志adb logcat--pid$(adb shell pidof com.example.app)# 只看目标APP的日志1.4 应用管理# 查看已安装应用列表adb shell pm list packages# 所有应用adb shell pm list packages|grep某个关键词# 过滤# 查看当前前台应用adb shell dumpsys window|grepmCurrentFocus# 启动应用adb shell am start-ncom.example.app/.MainActivity# 停止应用强制杀掉adb shell am force-stop com.example.app# 清除应用数据等同于清除缓存清除数据adb shell pmclearcom.example.app1.5 专项操作# 模拟输入adb shell input text13800138000# 输入文字adb shell input keyevent4# 按返回键KEYCODE_BACKadb shell input keyevent3# 按Home键adb shell input keyevent26# 电源键锁屏/唤醒adb shell input tap5001500# 点击坐标(x,y)adb shell input swipe5001500500500# 滑动(startX,startY,endX,endY)# 模拟系统事件adb shell am broadcast-aandroid.intent.action.BATTERY_LOW# 低电量广播# 查看系统信息adb shell getprop ro.build.version.sdk# SDK版本adb shell getprop ro.build.version.release# 系统版本号adb shell wm size# 屏幕分辨率adb shell wm density# 屏幕密度DPIadb shell dumpsys battery# 电池信息# 修改系统设置测试用adb shell settings put global airplane_mode_on1# 开飞行模式adb shell settings put global airplane_mode_on0# 关飞行模式# Monkey 随机压力测试adb shell monkey-pcom.example.app-v500# 随机500次操作adb shell monkey-pcom.example.app-v--throttle300500# 间隔300ms1.6 ADB 常用场景速查测试场景ADB 命令安装测试包adb install -r app-debug.apk卸载清理adb uninstall 包名 adb shell pm clear 包名看实时日志adb logcat | grep -E ERROR|FATAL截图存证adb shell screencap /sdcard/bug.png adb pull /sdcard/bug.png模拟返回键adb shell input keyevent 4查看当前页面adb shell dumpsys window | grep mCurrentFocus强制杀APPadb shell am force-stop 包名模拟低电量adb shell dumpsys battery set level 15恢复电量adb shell dumpsys battery reset二、Charles抓包 弱网Charles 是 APP 测试的必备工具注意:看请求内容和模拟弱网。2.1 HTTPS 抓包完整配置第一步电脑端安装并信任证书第二步开启 SSL Proxying第三步手机配置代理第四步手机安装证书iOS 额外步骤设置 → 通用 → 关于本机 → 证书信任设置 → 开启 Charles 证书验证是否成功打开爱听外语APP随便操作在 Charles 中应能看到 HTTPS 请求且 Contents 标签有明文 JSON 数据。2.2 抓包实战技巧过滤请求Charles 左下角 Filter 输入框 ai.ting - 只看包含 ai.ting 的请求 !Google - 排除包含 Google 的请求 /api/user - 精确匹配路径断点修改请求/响应Breakpoints右键目标请求 -Breakpoints - 重新触发请求 - 弹窗显示 Request 内容 - 可修改参数 → Execute - 弹窗显示 Response 内容 - 可修改返回值 → Execute适用场景测试服务端返回异常数据时APP会不会崩Map Local本地文件替换返回右键请求 -Map Local → 选择一个本地的 JSON 文件 - 此后该请求的返回值全部被替换为本地文件内容适用场景服务端还没开发好接口时用 Mock 数据验证前端处理。Rewrite自动修改请求/响应Tools -Rewrite - Add -设置规则 例如 Type: Body, Where: Response, Replace: isVip:false → isVip:true 作用测试VIP和非VIP用户看到的内容差异不需要切换账号2.3 弱网模拟配置Charles → Proxy → Throttle Settings → 勾选 Enable Throttling 预设场景可以直接选 56 kbps Modem模拟2G - 256 kbps ISDN模拟3G 512 kbps DSL模拟弱3G 2 Mbps ADSL模拟4G弱信号 也可以自定义常用配置场景下行上行延迟丢包Charles配置2G极限502050010%选 Modem 预设弱3G3841282003%接近 ISDN 预设弱4G/地铁500010001002%自行调整网络抖动200005000200-10005%勾选 Random执行弱网测试的步骤1. 手机连接 Charles 代理 2. Charles → Throttle Settings → 选择或自定义一个网络配置 3. 在手机APP上执行目标操作 4. 观察 是否出现 Loading 状态 超时时间是否合理 超时后提示文案是否可理解 网络恢复后能否自动继续 5. 切换不同网络配置逐档记录表现 6. 关闭 Throttle → 恢复正常弱网测试报告模板测试场景网络配置操作实际表现是否通过备注首页加载2G冷启动白屏20秒后提示网络加载失败⚠️建议提前展示骨架屏音频播放弱4G点击播放缓冲8秒后正常播放✅—表单提交3G点击登录Loading2秒后登录成功✅—网络切换弱4G→正常播放中切网络自动切换音质⚠️应提前缓冲三、PerfDog性能测试PerfDog 是腾讯出品的跨平台性能测试工具支持 Android iOS无需 root 也无需越狱3.1 安装和连接1. 下载并安装 PerfDoghttps://perfdog.qq.com/ 2. 手机连接到电脑USB→ 确认 adb devices 能看到设备 3. iOS 需要另外安装 iTunes 或 Xcode 4. 打开 PerfDog → 选择设备 → 选择要监控的APP进程 5. 点击开始录制3.2 核心指标解读指标含义参考标准FPS帧率屏幕每秒刷新次数滑列表 55静置 0Jank卡顿次数每10分钟 10次CPUCPU占用百分比空闲 5%操作 30%Memory内存占用视APP类型Network上行/下行流量速度—Battery电流消耗(mA)后台 50mA前台 300mATemperature电池温度 40℃3.3 实战检测内存泄漏操作步骤 1. PerfDog 开始录制 2. 启动APP → 静置30秒 → 记录基线内存假设200MB 3. 反复执行目标操作如打开关闭详情页20次 4. 回到首页 → 手动触发GCAndroid: adb shell dumpsys meminfo 包名 5. 观察最终内存值是否为基线附近 判定 210MB - 正常波动无泄漏 260MB30%- 疑似泄漏需进一步确认 350MB75%- 明显泄漏提单3.4 标签功能打点记录关键操作PerfDog 支持在录制过程中打标签方便事后分析某个操作时性能如何执行某个操作前 → PerfDog界面点添加标签 → 输入标签名如冷启动 → 事后在图表上能看到标签对应位置的性能数据四、AppiumUI自动化Appium 是目前使用最广泛的移动端 UI 自动化框架一套代码同时支持 Android 和 iOS。4.1 环境搭建需要的组件1. JDK 11Java开发环境 2. Android SDK含 adb 3. Node.jsAppium Server 基于 Node 4. Appium Server 5. Appium-Python-ClientPython客户端库 6. Appium Inspector元素定位辅助工具安装命令# 安装 Appium Servernpminstall-gappium# 安装 UIAutomator2 驱动Androidappium driverinstalluiautomator2# 安装 XCUITest 驱动iOSappium driverinstallxcuitest# 安装 Python 客户端pipinstallAppium-Python-Client# 安装 Appium Inspector桌面应用单独下载# 下载地址https://github.com/appium/appium-inspector/releases启动 Appium Server# 命令行启动appium# 输出# [Appium] Welcome to Appium v2.x.x# [Appium] Appium REST http interface listener started on http://0.0.0.0:47234.2 编写第一个测试# test_app_login.pyfromappiumimportwebdriverfromappium.webdriver.common.appiumbyimportAppiumByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECimporttime# 连接设备的Desired Capabilitiesdesired_caps{# 平台信息platformName:Android,platformVersion:14,deviceName:Pixel_7,# APP信息appPackage:com.aitingwaiyu.app,appActivity:.ui.login.LoginActivity,# 测试配置noReset:True,# 不清除APP数据保留登录态autoGrantPermissions:True,# 自动授予权限newCommandTimeout:300,# 命令超时5分钟unicodeKeyboard:True,# 使用Appium输入法支持中文输入resetKeyboard:True# 测试结束后恢复原输入法}# 连接Appium Serverdriverwebdriver.Remote(http://localhost:4723,desired_caps)# 设置显式等待waitWebDriverWait(driver,10)try:# 1. 输入手机号phone_inputwait.until(EC.presence_of_element_located((AppiumBy.ID,com.aitingwaiyu.app:id/etPhone)))phone_input.clear()phone_input.send_keys(13800138000)# 2. 点击获取验证码code_btndriver.find_element(AppiumBy.ID,com.aitingwaiyu.app:id/btnGetCode)code_btn.click()# 3. 等待并输入验证码模拟环境固定验证码time.sleep(2)code_inputdriver.find_element(AppiumBy.ID,com.aitingwaiyu.app:id/etCode)code_input.send_keys(000000)# 4. 勾选用户协议agree_cbdriver.find_element(AppiumBy.ID,com.aitingwaiyu.app:id/cbAgree)ifnotagree_cb.get_attribute(checked):agree_cb.click()# 5. 点击登录login_btndriver.find_element(AppiumBy.ID,com.aitingwaiyu.app:id/btnLogin)login_btn.click()# 6. 验证登录成功——等待首页元素出现home_elementwait.until(EC.presence_of_element_located((AppiumBy.XPATH,//android.widget.TextView[text首页])))asserthome_elementisnotNone,登录失败未跳转到首页print(✓ 登录成功)exceptExceptionase:# 失败截图driver.save_screenshot(login_error.png)print(f✗ 测试失败:{e})raisefinally:driver.quit()4.3 元素定位实战Appium Inspector 定位元素——它能看到页面上所有元素的结构树和属性。定位优先级优先级定位方式示例场景1accessibility id(AppiumBy.ACCESSIBILITY_ID, 登录按钮)iOS/Android通用2resource-id(AppiumBy.ID, com.xx:id/btn)Android专用3UIAutomator 选择器(AppiumBy.ANDROID_UIAUTOMATOR, text(登录))按文本找控件4class name(AppiumBy.CLASS_NAME, android.widget.Button)控件唯一时可用5xpath(AppiumBy.XPATH, //Button[text登录])兜底最慢4.4 Page Object 模式实际项目不会把所有代码写在一个文件里用 Page Object 封装# pages/login_page.pyfromappium.webdriver.common.appiumbyimportAppiumByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECclassLoginPage:def__init__(self,driver):self.driverdriver self.waitWebDriverWait(driver,10)# 元素定位器self.PHONE_INPUT(AppiumBy.ID,com.aitingwaiyu.app:id/etPhone)self.CODE_BTN(AppiumBy.ID,com.aitingwaiyu.app:id/btnGetCode)self.CODE_INPUT(AppiumBy.ID,com.aitingwaiyu.app:id/etCode)self.AGREE_CB(AppiumBy.ID,com.aitingwaiyu.app:id/cbAgree)self.LOGIN_BTN(AppiumBy.ID,com.aitingwaiyu.app:id/btnLogin)definput_phone(self,phone):elself.wait.until(EC.presence_of_element_located(self.PHONE_INPUT))el.clear()el.send_keys(phone)defclick_get_code(self):self.driver.find_element(*self.CODE_BTN).click()definput_code(self,code):self.driver.find_element(*self.CODE_INPUT).send_keys(code)defagree_protocol(self):cbself.driver.find_element(*self.AGREE_CB)ifcb.get_attribute(checked)!true:cb.click()defclick_login(self):self.driver.find_element(*self.LOGIN_BTN).click()returnHomePage(self.driver)# pages/home_page.pyclassHomePage:def__init__(self,driver):self.driverdriver self.TITLE(AppiumBy.XPATH,//android.widget.TextView[text首页])defis_displayed(self):returnWebDriverWait(self.driver,5).until(EC.presence_of_element_located(self.TITLE))isnotNone# tests/test_login.pydeftest_login_success(driver):login_pageLoginPage(driver)login_page.input_phone(13800138000)login_page.click_get_code()login_page.input_code(000000)login_page.agree_protocol()home_pagelogin_page.click_login()asserthome_page.is_displayed(),登录失败4.5 运行测试# 启动 Appium保持运行appium# 运行测试脚本python-mpytest tests/-v--tbshort# 生成 Allure 报告python-mpytest tests/--alluredir./allure_results allure serve ./allure_results五、JMeter 后端性能压测APP 的流畅度不仅取决于前端后端接口的性能同样关键。用 JMeter 做接口压力测试的完整步骤5.1 创建测试计划第一步线程组线程数100模拟100并发用户 Ramp-Up时间10秒10秒内逐步启动 循环次数勾选永远 持续时间300秒5分钟第二步HTTP请求默认值协议https 服务器IPapi.aitingwaiyu.com 端口443第三步HTTP Header 管理器Content-Type: application/json Authorization: Bearer ${token}第四步登录请求 Token 提取方法POST 路径/api/user/login Body Data: {phone:13800138000,code:000000} 变量名token JSON路径$.data.token第五步业务请求路径/api/course/list 参数page1size20 自动携带 ${token}第六步断言JSON路径$.code 期望值200第七步监听器监听器 - 聚合报告 - 核心报表 监听器 - 查看结果树 - 调试用正式压测时禁用 监听器 - TPS图 - 吞吐量趋势第八步命令行执行# 正式压测不要用 GUIGUI 本身消耗资源影响结果jmeter-n-taitingwaiyu.jmx-lresult.jtl-e-oreport/# -n 非GUI模式# -t 测试脚本文件# -l 原始结果文件# -e 生成HTML报告# -o 报告输出目录第九步分析结果打开report/index.html重点关注指标关注点Average (ms)整体 1000ms90% Line90%用户感受Throughput (TPS)系统处理能力峰值Error %必须 0%六、一个版本的测试周期Day 1收到提测邮件 ├── 拉取测试分支 → adb install 安装测试包 ├── 阅读需求文档 → 确认测试范围 └── 编写/补充测试用例 Day 2功能与接口测试 ├── 手工跑核心流程用例在自备真机上 ├── Charles 抓包验证接口参数和返回值 ├── Postman 或 JMeter 单接口验证 └── 发现的 bug 提交到 TAPD / Jira Day 3专项测试 ├── Charles Throttle 弱网模拟2G/3G/4G/断网/切换 ├── 中断测试来电/短信/锁屏/低电量/后台 ├── 横竖屏切换 不同输入法测试 └── 安装/覆盖/升级/卸载测试 Day 4兼容性性能 ├── PerfDog 录制性能启动/内存/帧率/耗电 ├── 多台真机至少华为小米OPPOiPhone跑冒烟 ├── 云测平台补充10-20台兼容性验证 └── JMeter 后端接口压测 Day 5回归报告 ├── 执行自动化脚本回归 ├── 整理测试报告 ├── 遗留bug评估 └── 发送测试通过/阻塞结论七、常用命令速查总表# ---- ADB ----adb devices# 设备列表adbinstallapp.apk# 安装adb uninstall 包名# 卸载adb logcat|grepERROR# 看错误日志adb shell am force-stop 包名# 杀进程adb shell input keyevent4# 返回键adb shell screencap /sdcard/s.pngadb pull /sdcard/s.png# 截图# ---- Appium ----appium# 启动Serverappium driver list# 查看已安装驱动pipinstallAppium-Python-Client# 安装客户端# ---- JMeter ----jmeter-n-ttest.jmx-lresult.jtl-e-oreport/# 命令行执行jmeter-gresult.jtl-oreport/# 从已有结果生成报告# ---- PerfDog ----GUI工具无命令行# ---- Charles ----GUI工具