告别手动点点点:用ADB命令实现Android游戏自动化测试(附常用脚本)
手游测试工程师每天面对大量重复操作:刷初始号、跑图验证、关卡压力测试...这些工作不仅耗时耗力,还容易因人为失误导致数据偏差。其实只需掌握ADB命令的组合技巧,就能将Android调试桥变成自动化测试利器。本文将手把手教你用命令行解放双手,特别适合中小团队快速搭建轻量级自动化测试方案。
1. ADB自动化测试核心原理
ADB(Android Debug Bridge)本质上是通过USB或网络在PC与Android设备间建立通信管道。游戏自动化测试主要依赖其中的input事件模拟和shell环境控制能力。当我们在命令行输入adb shell input tap 500 500时,实际发生了以下链路:
- PC端ADB客户端将命令编码为特定协议
- 通过USB传输到设备的ADB守护进程
- 设备端将命令解析为Linux内核的input子系统事件
- 系统将事件注入到当前活动窗口(游戏进程)
这种机制相比基于图像识别的自动化方案有三大优势:
- 零延迟:直接调用系统API,响应速度在毫秒级
- 低开销:不占用GPU资源,不影响游戏性能测试
- 精准控制:坐标和时序可精确到像素和毫秒
注意:部分游戏会检测输入源,可能需要额外处理。可通过
adb shell settings put global restricted_input_devices 0关闭输入限制。
2. 游戏测试四大高频场景实战
2.1 自动刷初始账号
角色扮演类游戏常需要批量创建账号测试不同开局。传统方式需要人工完成:
- 启动游戏
- 跳过开场动画
- 输入随机用户名
- 完成新手引导
- 截图存档
用ADB脚本可简化为:
#!/bin/bash for i in {1..10} # 循环10次 do adb shell am start com.game.package/.MainActivity sleep 5 # 等待加载 adb shell input tap 300 500 # 跳过动画 adb shell input text "Player$i" adb shell input tap 200 600 # 确认 # 模拟新手引导操作 adb shell input swipe 500 1000 500 500 200 adb shell input tap 400 400 # 截图存档 adb shell screencap -p /sdcard/screenshot_$i.png adb pull /sdcard/screenshot_$i.png ./results/ adb shell pm clear com.game.package # 清数据 done2.2 关卡遍历测试
动作游戏需要验证每个关卡的通过性。关键命令组合:
# 模拟方向键移动角色 adb shell input keyevent 21 # KEYCODE_DPAD_LEFT adb shell input keyevent 22 # KEYCODE_DPAD_RIGHT # 连招组合键(间隔100ms) adb shell input keyevent 23 && sleep 0.1 && adb shell input keyevent 23 && sleep 0.1 && adb shell input keyevent 23建议配合getevent监听触摸事件:
adb shell getevent -lt /dev/input/event2 # 输出示例: # [ 12345.678] EV_ABS ABS_MT_POSITION_X 0000012c # [ 12345.678] EV_ABS ABS_MT_POSITION_Y 000003e82.3 性能监控与日志收集
测试过程中需要同步记录性能数据:
# CPU监控(每秒采样) adb shell top -n 10 -d 1 -b > cpu.log & # 内存监控 adb shell dumpsys meminfo com.game.package >> mem.log & # 温度监控 adb shell cat /sys/class/thermal/thermal_zone*/temp >> temp.log & # 开始测试后... adb shell logcat -v time -b main > game.log2.4 多设备并行测试
用-s参数指定设备序列号实现并行:
| 命令 | 作用 |
|---|---|
adb -s DEV1 install | 在DEV1设备安装 |
adb -s DEV2 install | 在DEV2设备安装 |
adb devices -l | 查看所有设备详细信息 |
3. 高阶技巧:提升脚本健壮性
3.1 动态坐标适配
不同分辨率设备需要自动换算坐标:
# 获取屏幕分辨率 output = subprocess.check_output("adb shell wm size", shell=True) width, height = map(int, output.decode().split()[-1].split('x')) # 百分比坐标转换 def get_pos(x_percent, y_percent): return (width*x_percent//100, height*y_percent//100) tap_pos = get_pos(50, 70) # 屏幕中心偏下3.2 异常处理机制
增加错误检测和重试逻辑:
max_retry=3 for i in $(seq 1 $max_retry); do adb shell input tap 500 500 if [ $? -eq 0 ]; then break else echo "Attempt $i failed, restarting ADB..." adb kill-server && adb start-server fi done3.3 视频录制分析
用screenrecord录制测试过程:
adb shell screenrecord --bit-rate 4000000 /sdcard/test.mp4 & # 开始测试... adb shell pkill -l SIGINT screenrecord # 结束录制 adb pull /sdcard/test.mp44. 常用脚本库分享
4.1 自动战斗循环
#!/bin/bash # 自动刷副本脚本 duration=$((60*5)) # 5分钟 start_time=$(date +%s) while [ $(($(date +%s) - start_time)) -lt $duration ]; do # 释放技能 adb shell input tap 800 1800 sleep 1 # 移动 adb shell input swipe 300 1600 700 1600 500 sleep 2 done4.2 压力测试工具
import random import subprocess import time def random_swipe(): x1, y1 = random.randint(100,900), random.randint(500,1500) x2, y2 = x1+random.randint(-200,200), y1+random.randint(-200,200) subprocess.run(f"adb shell input swipe {x1} {y1} {x2} {y2} 50", shell=True) for _ in range(1000): random_swipe() time.sleep(0.1)4.3 界面遍历测试
// 使用Node.js自动遍历所有UI元素 const { execSync } = require('child_process'); const grid = []; for(let x=100; x<900; x+=50){ for(let y=200; y<1600; y+=50){ grid.push([x,y]); } } grid.forEach(([x,y]) => { try { execSync(`adb shell input tap ${x} ${y}`); console.log(`Clicked ${x},${y}`); } catch(e) { console.error(`Failed at ${x},${y}`); } });实际项目中建议将常用操作封装成函数库。比如创建一个gamebot.sh包含:
#!/bin/bash source ./adb_functions.sh login_player() { adb_tap 300 500 # 跳过动画 adb_text "TestBot" adb_tap 200 600 # 确认 } start_battle() { adb_swipe 500 1000 500 500 # 进入副本 sleep 2 adb_tap 400 700 # 开始战斗 }