告别手动点点点!用ADB命令实现手游自动化测试的保姆级教程
2026/5/31 2:29:34 网站建设 项目流程

告别手动点点点!用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/

这个简单脚本已经可以替代人工完成整个登录流程的验证。实际项目中,我们可以进一步:

  1. 增加错误处理(如超时重试)
  2. 添加结果验证(通过截图或日志分析)
  3. 参数化测试数据(使用不同账号组合)

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 VERBOSE

4. 高级技巧: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. 实战:构建自动化回归测试体系

将上述技术整合,我们可以建立完整的自动化测试流程:

  1. 环境准备阶段

    • 连接测试设备/模拟器
    • 安装最新游戏包
    • 清除旧数据和日志
  2. 测试执行阶段

    • 按顺序执行预定义的测试脚本
    • 关键操作点截图存档
    • 全程记录设备日志
  3. 结果分析阶段

    • 自动对比截图与基线图
    • 分析日志中的异常和错误
    • 生成测试报告

示例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%。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询