告别手动点点点!用ADB命令实现手游自动化测试的保姆级教程
手游测试工程师们是否厌倦了日复一日的重复点击操作?每次版本更新后,那些固定的新手引导、关卡挑战、商城购买流程,都需要人工一遍遍验证。这不仅效率低下,还容易因疲劳导致漏测。本文将带你深入探索ADB命令在手游自动化测试中的实战应用,从基础操作到复杂脚本封装,彻底解放你的双手。
1. ADB自动化测试的核心武器库
ADB(Android Debug Bridge)作为Android官方调试工具,其input系列命令能完美模拟用户触屏操作。对于手游测试而言,以下几个命令尤为关键:
精准点击:
adb shell input tap x y
其中x和y是屏幕坐标,可精确触发按钮点击。例如点击屏幕中央(540,960)位置:adb shell input tap 540 960滑动操作:
adb shell input swipe x1 y1 x2 y2 [duration]
模拟手指滑动,特别适合测试跑酷类游戏的转向操作:# 从屏幕左侧滑到右侧,持续500毫秒 adb shell input swipe 200 1000 900 1000 500文本输入:
adb shell input text "string"
自动填写账号密码等输入框,注意特殊字符需转义:# 输入带@的邮箱地址 adb shell input text "test\\@example.com"物理按键:
adb shell input keyevent [code]
常用键值包括:- 3: Home键
- 4: 返回键
- 24: 音量+
- 25: 音量-
坐标获取技巧:在开发者选项中开启"指针位置",触摸屏幕时会显示实时坐标。不同分辨率设备需要做坐标换算,建议使用
adb shell wm size先获取屏幕分辨率。
2. 构建完整的测试用例链
单一命令只能完成基础操作,真正的自动化测试需要将多个命令组合成有逻辑的测试流程。以典型的手游登录流程为例:
#!/bin/bash # 启动游戏 adb shell am start com.game.example/.MainActivity sleep 5 # 等待游戏加载 # 点击"开始游戏"按钮 adb shell input tap 540 1200 sleep 2 # 输入测试账号 adb shell input tap 300 600 # 点击账号输入框 adb shell input text "test\\@demo.com" sleep 1 # 输入密码 adb shell input tap 300 750 adb shell input text "123456" sleep 1 # 点击登录按钮 adb shell input tap 540 900 sleep 3 # 验证登录后界面 adb shell screencap -p /sdcard/login_result.png adb pull /sdcard/login_result.png ./logs/这个简单脚本已经可以替代人工完成整个登录流程的验证。实际项目中,我们可以进一步:
- 增加错误处理(如超时重试)
- 添加结果验证(通过截图或日志分析)
- 参数化测试数据(使用不同账号组合)
3. 日志捕获与问题定位
自动化操作只是手段,发现问题才是目的。ADB提供了强大的日志捕获工具:
# 清除旧日志 adb logcat -c # 开始记录游戏日志(带时间戳) adb logcat -v time > game.log & # 执行测试脚本 ./test_login.sh # 测试结束后停止日志记录 kill %1关键日志分析技巧:
- 过滤游戏特定TAG:
adb logcat -s Unity - 仅显示错误:
adb logcat *:E - 实时监控崩溃:
adb logcat | grep -i crash
对于Unity游戏,还可以启用更详细的日志级别:
adb shell setprop log.tag.Unity VERBOSE4. 高级技巧:Python封装与多设备管理
当测试规模扩大时,简单的Shell脚本会变得难以维护。使用Python封装可以提供更好的扩展性:
import subprocess import time class ADBTester: def __init__(self, device_id=None): self.base_cmd = ['adb'] if device_id: self.base_cmd.extend(['-s', device_id]) def tap(self, x, y): subprocess.run(self.base_cmd + ['shell', 'input', 'tap', str(x), str(y)]) def swipe(self, x1, y1, x2, y2, duration=300): subprocess.run(self.base_cmd + ['shell', 'input', 'swipe', str(x1), str(y1), str(x2), str(y2), str(duration)]) def start_app(self, package): subprocess.run(self.base_cmd + ['shell', 'am', 'start', '-n', package]) def screencap(self, path): subprocess.run(self.base_cmd + ['shell', 'screencap', '-p', path]) subprocess.run(self.base_cmd + ['pull', path, './screenshots/']) # 使用示例 tester = ADBTester('emulator-5554') tester.start_app('com.game.example/.MainActivity') time.sleep(5) tester.tap(540, 1200)对于多设备并行测试,可以结合adb devices列出所有设备,然后为每个设备创建独立的测试实例:
import re def get_devices(): result = subprocess.run(['adb', 'devices'], capture_output=True, text=True) devices = [] for line in result.stdout.split('\n')[1:]: if match := re.match(r'^(\S+)\s+device$', line.strip()): devices.append(match.group(1)) return devices for device in get_devices(): tester = ADBTester(device) # 启动并行测试...5. 实战:构建自动化回归测试体系
将上述技术整合,我们可以建立完整的自动化测试流程:
环境准备阶段
- 连接测试设备/模拟器
- 安装最新游戏包
- 清除旧数据和日志
测试执行阶段
- 按顺序执行预定义的测试脚本
- 关键操作点截图存档
- 全程记录设备日志
结果分析阶段
- 自动对比截图与基线图
- 分析日志中的异常和错误
- 生成测试报告
示例CI集成配置(Jenkins pipeline):
pipeline { agent any stages { stage('Setup') { steps { sh 'adb kill-server && adb start-server' sh 'adb install -r game.apk' } } stage('Test') { steps { sh 'python run_tests.py --device emulator-5554' archiveArtifacts 'screenshots/*.png,logs/*.log' } } stage('Report') { steps { sh 'python generate_report.py' publishHTML target: [ allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'reports', reportFiles: 'index.html', reportName: 'Test Report' ] } } } }6. 避坑指南与性能优化
在实际项目中,我们积累了一些宝贵经验:
坐标适配问题:
- 使用百分比坐标而非绝对数值
- 开发分辨率自适应算法:
def get_relative_pos(x_percent, y_percent): size = subprocess.check_output(['adb', 'shell', 'wm', 'size']) width, height = map(int, re.search(r'(\d+)x(\d+)', size).groups()) return (width * x_percent / 100, height * y_percent / 100)
同步等待策略:
- 简单的
sleep不可靠,改为检测特定画面元素 - 示例:等待"开始游戏"按钮出现(通过截图颜色检测)
def wait_until_visible(x, y, expected_color, timeout=10): start = time.time() while time.time() - start < timeout: if get_pixel_color(x, y) == expected_color: return True time.sleep(0.5) return False
执行速度优化:
- 减少不必要的截图和日志
- 批量执行命令(使用
adb shell一次执行多条) - 关闭动画提高速度:
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 0
稳定性提升:
- 增加命令执行结果检查
- 关键步骤添加重试机制
- 定期重启ADB服务(长时间运行可能出现连接问题)
手游自动化测试不是简单的命令堆砌,而是需要根据游戏特性设计合理的操作序列和验证点。在最近的一个跑酷游戏项目中,我们通过ADB自动化将每日回归测试时间从4小时缩短到20分钟,同时发现的边界条件问题比人工测试多出30%。