ADB 自动化测试实战:5个高频场景脚本与性能监控指令详解
ADB 自动化测试实战5个高频场景脚本与性能监控指令详解在移动应用质量保障体系中自动化测试已成为不可或缺的一环。对于Android测试工程师而言ADBAndroid Debug Bridge就像一把瑞士军刀既能完成基础设备操作又能实现复杂的自动化测试场景。本文将深入剖析ADB命令的组合应用技巧通过5个典型测试场景的完整脚本示例结合性能监控方法论帮助开发者构建高效的自动化测试解决方案。1. 环境准备与ADB进阶技巧1.1 设备连接管理多设备连接时需指定目标设备避免命令执行对象错误# 查看已连接设备列表 adb devices # 输出示例 # List of devices attached # emulator-5554 device # 5f9d1f07 device # 针对特定设备执行命令 adb -s emulator-5554 shell pm list packages无线调试模式可摆脱USB线缆束缚# 切换到无线调试模式 adb tcpip 5555 adb connect 192.168.1.100:5555 # 验证连接状态 adb devices1.2 权限提升与系统操作获取root权限可突破普通ADB命令的限制adb root adb remount # 重新挂载系统分区为可写注意部分厂商设备需要解锁Bootloader才能获取完整root权限系统关键目录说明/system系统应用和库文件/data/data应用私有数据/sdcard共享存储空间2. 应用生命周期自动化脚本2.1 安装-启动-卸载全流程#!/bin/bash # 定义变量 APK_PATH/path/to/app.apk PACKAGE_NAMEcom.example.app # 静默卸载旧版本 adb uninstall $PACKAGE_NAME /dev/null 21 # 安装应用并验证 install_result$(adb install -r $APK_PATH) if [[ $install_result *Success* ]]; then echo 安装成功 # 启动主Activity adb shell am start -n $PACKAGE_NAME/.MainActivity # 等待10秒后强制停止 sleep 10 adb shell am force-stop $PACKAGE_NAME # 清除应用数据 adb shell pm clear $PACKAGE_NAME # 卸载应用 adb uninstall $PACKAGE_NAME else echo 安装失败: $install_result exit 1 fi关键参数说明-r允许覆盖安装-n指定组件名称启动-S启动前停止目标应用3. 性能监控与数据分析3.1 内存监控脚本#!/bin/bash PACKAGE_NAMEcom.example.app DURATION60 # 监控时长(秒) INTERVAL2 # 采样间隔(秒) OUTPUT_FILEmem_report.csv # 写入CSV表头 echo Timestamp,TotalPSS(Native),TotalPSS(Dalvik),TotalPSS(Other),Graphics $OUTPUT_FILE end_time$((SECONDSDURATION)) while [ $SECONDS -lt $end_time ]; do # 获取内存数据 mem_info$(adb shell dumpsys meminfo $PACKAGE_NAME | grep -E Native|Dalvik|Other|Graphics) # 解析数据 native$(echo $mem_info | grep Native | awk {print $2}) dalvik$(echo $mem_info | grep Dalvik | awk {print $2}) other$(echo $mem_info | grep Other | awk {print $2}) graphics$(echo $mem_info | grep Graphics | awk {print $2}) # 写入CSV echo $(date %H:%M:%S),$native,$dalvik,$other,$graphics $OUTPUT_FILE sleep $INTERVAL done内存指标解析指标类型说明Native Heap本地堆内存使用量Dalvik HeapJava堆内存使用量Graphics图形缓冲区占用Private Dirty私有脏内存页3.2 CPU使用率监控#!/bin/bash PACKAGE_NAMEcom.example.app OUTPUT_FILEcpu_report.csv # 获取进程ID pid$(adb shell pidof $PACKAGE_NAME) # 监控CPU使用率 adb shell top -d 1 -p $pid | awk BEGIN { print Timestamp,CPU% } !/%CPU/ { timestampstrftime(%H:%M:%S); print timestamp,$9 } $OUTPUT_FILE4. UI自动化操作封装4.1 通用操作函数库#!/bin/bash # ui_operations.sh # 点击指定坐标 tap() { adb shell input tap $1 $2 } # 滑动屏幕 swipe() { adb shell input swipe $1 $2 $3 $4 ${5:-100} # 默认100ms完成滑动 } # 文本输入 input_text() { adb shell input text $1 } # 按键事件 send_keyevent() { adb shell input keyevent $1 } # 返回桌面 go_home() { send_keyevent 3 } # 返回键 go_back() { send_keyevent 4 }4.2 登录测试用例#!/bin/bash source ui_operations.sh # 元素坐标定义 declare -A elements( [username_field]300 500 [password_field]300 600 [login_button]300 700 ) # 执行登录操作 tap ${elements[username_field]} input_text testuser tap ${elements[password_field]} input_text password123 tap ${elements[login_button]} # 验证登录结果 sleep 3 if adb shell dumpsys window windows | grep -q MainActivity; then echo 登录成功 else echo 登录失败 exit 1 fi5. 高级应用场景实战5.1 Monkey压力测试集成#!/bin/bash PACKAGE_NAMEcom.example.app EVENT_COUNT10000 THROTTLE200 # 事件间隔(ms) LOG_FILEmonkey_test.log adb shell monkey -p $PACKAGE_NAME \ --throttle $THROTTLE \ --ignore-crashes \ --ignore-timeouts \ --monitor-native-crashes \ -v $EVENT_COUNT $LOG_FILE 21 # 分析测试结果 crash_count$(grep -c CRASH $LOG_FILE) anr_count$(grep -c ANR $LOG_FILE) echo 测试完成 - 崩溃次数: $crash_count, ANR次数: $anr_count5.2 网络状态模拟测试#!/bin/bash # 网络状态切换工具 enable_wifi() { adb shell svc wifi enable } disable_wifi() { adb shell svc wifi disable } set_airplane_mode() { adb shell settings put global airplane_mode_on $1 adb shell am broadcast -a android.intent.action.AIRPLANE_MODE } # 示例模拟网络切换测试 test_network_switch() { echo 开始网络切换测试... # WiFi正常 enable_wifi sleep 10 # 飞行模式 set_airplane_mode 1 sleep 10 # 恢复网络 set_airplane_mode 0 disable_wifi }6. 测试报告生成与分析6.1 日志收集脚本#!/bin/bash # collect_logs.sh TIMESTAMP$(date %Y%m%d_%H%M%S) OUTPUT_DIRlogs_$TIMESTAMP mkdir -p $OUTPUT_DIR # 收集系统日志 adb logcat -d $OUTPUT_DIR/system.log # 收集内核日志 adb shell dmesg $OUTPUT_DIR/kernel.log # 收集ANR日志 adb pull /data/anr $OUTPUT_DIR/anr /dev/null 21 # 收集崩溃日志 adb pull /data/tombstones $OUTPUT_DIR/tombstones /dev/null 21 # 打包日志文件 zip -r $OUTPUT_DIR.zip $OUTPUT_DIR /dev/null rm -rf $OUTPUT_DIR echo 日志已保存到 $OUTPUT_DIR.zip6.2 性能数据可视化使用Python生成内存使用趋势图import pandas as pd import matplotlib.pyplot as plt # 读取监控数据 data pd.read_csv(mem_report.csv) # 绘制内存使用曲线 plt.figure(figsize(12, 6)) plt.plot(data[Timestamp], data[TotalPSS(Native)], labelNative) plt.plot(data[Timestamp], data[TotalPSS(Dalvik)], labelDalvik) plt.title(Memory Usage Over Time) plt.xlabel(Time) plt.ylabel(Memory (KB)) plt.legend() plt.grid() plt.savefig(memory_usage.png) plt.close()7. 最佳实践与疑难解答7.1 常见问题解决方案问题1ADB设备离线状态解决方案adb kill-server adb start-server问题2权限拒绝错误可能原因未启用USB调试或未授权计算机解决步骤检查设备开发者选项重新插拔USB线缆确认设备端授权对话框问题3命令执行超时优化方法adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 adb shell settings put global animator_duration_scale 07.2 性能优化建议批量命令执行减少ADB连接开销adb shell pm list packages -3; dumpsys meminfo com.example.app; top -n 1 异步执行策略长时间操作使用后台进程adb shell nohup monkey -p com.example.app 1000 /sdcard/monkey.log 21 设备预热测试前确保设备处于稳定状态# 关闭后台进程 adb shell pm disable com.facebook.katana # 清理内存 adb shell echo 3 /proc/sys/vm/drop_caches掌握这些ADB自动化测试技巧后测试工程师可以快速构建轻量级自动化测试方案在CI/CD流程中实现快速反馈。随着Android系统的迭代更新建议定期查阅官方文档获取最新命令参数和最佳实践。