Python自动化测试实战:从刷视频到掌握ADB控制安卓设备
在移动互联网时代,自动化测试已成为保证App质量的关键技术。而学习自动化测试最好的方式,就是从实际场景入手。本文将从一个有趣的角度——自动刷视频,带你深入理解Android设备控制的核心技术ADB(Android Debug Bridge),并学会用Python构建自动化测试脚本。
1. 环境准备与ADB基础
1.1 搭建开发环境
要开始Android自动化测试之旅,我们需要准备以下工具:
- Python 3.8+:推荐使用最新稳定版
- PyCharm Community Edition:轻量级Python IDE
- ADB工具包:Android SDK Platform-Tools的一部分
- 安卓手机:系统版本5.0以上,开启开发者模式
安装完成后,验证ADB是否配置成功:
adb version如果看到版本号输出,说明环境配置正确。接下来连接手机:
adb devices成功连接后,设备列表中会显示你的手机序列号。
1.2 ADB基础命令解析
ADB提供了丰富的设备控制命令,其中input命令族特别适合模拟用户操作:
| 命令格式 | 功能描述 | 示例 |
|---|---|---|
adb shell input tap x y | 模拟点击屏幕坐标 | adb shell input tap 500 1000 |
adb shell input swipe x1 y1 x2 y2 | 模拟滑动操作 | adb shell input swipe 300 1600 300 800 |
adb shell input text "string" | 输入文本 | adb shell input text "hello" |
adb shell input keyevent code | 发送按键事件 | adb shell input keyevent 4(返回键) |
提示:获取屏幕坐标可以使用
adb shell getevent -l命令,或开启手机开发者选项中的"指针位置"功能。
2. Python控制ADB的核心技巧
2.1 使用subprocess模块调用ADB
Python的subprocess模块是与系统命令交互的最佳方式。下面是一个封装ADB命令的基础类:
import subprocess import time class ADBController: def __init__(self, device_id=None): self.device_id = device_id def run_adb(self, command): full_cmd = f"adb {f'-s {self.device_id}' if self.device_id else ''} {command}" try: result = subprocess.run( full_cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f"命令执行失败: {e.stderr}") return None def tap(self, x, y): return self.run_adb(f"shell input tap {x} {y}") def swipe(self, x1, y1, x2, y2, duration=300): return self.run_adb(f"shell input swipe {x1} {y1} {x2} {y2} {duration}")2.2 实现智能刷视频逻辑
单纯的固定间隔滑动缺乏真实感,我们可以加入随机性和智能判断:
import random from datetime import datetime class VideoWatcher(ADBController): def __init__(self, device_id=None): super().__init__(device_id) self.watch_count = 0 self.start_time = datetime.now() def random_swipe(self): # 随机生成滑动参数 x = random.randint(100, 500) y1 = random.randint(800, 1600) y2 = random.randint(300, 700) duration = random.randint(200, 500) self.swipe(x, y1, x, y2, duration) self.watch_count += 1 # 随机观看时长 watch_time = random.uniform(8.0, 15.0) time.sleep(watch_time) current_time = datetime.now() - self.start_time print(f"[{current_time}] 已观看 {self.watch_count} 个视频,本次观看 {watch_time:.1f} 秒")3. 从刷视频到自动化测试的思维转换
3.1 理解自动化测试的核心要素
刷视频只是ADB能力的简单展示,真正的自动化测试需要考虑更多因素:
- 元素定位:通过UI Automator或XPath定位界面元素
- 状态验证:检查页面元素或系统属性确认操作结果
- 异常处理:网络中断、弹窗处理等边界情况
- 测试报告:记录测试过程和结果
3.2 构建完整的测试用例
以视频App为例,一个完整的测试用例可能包含:
- 启动测试:验证App能否正常启动
- 权限检查:处理各种系统权限弹窗
- 核心功能测试:
- 视频播放/暂停
- 点赞/收藏操作
- 评论功能
- 分享流程
- 性能监测:记录CPU、内存占用
- 清理工作:测试完成后重置状态
class VideoAppTester(VideoWatcher): def test_video_interaction(self): # 测试点赞功能 self.tap(900, 1800) # 点赞按钮坐标 time.sleep(1) # 验证是否点赞成功(需要根据实际UI调整) screenshot = self.run_adb("shell screencap -p /sdcard/screen.png") self.run_adb(f"pull /sdcard/screen.png ./screenshots/like_{int(time.time())}.png") # 测试评论功能 self.tap(800, 1850) # 评论按钮 time.sleep(2) self.run_adb('shell input text "自动化测试评论"') self.run_adb('shell input keyevent 66') # 回车键 time.sleep(3)4. 高级技巧与实战优化
4.1 多设备并行控制
当需要测试多台设备时,可以扩展我们的控制器:
class MultiDeviceManager: def __init__(self): self.devices = self._get_devices() self.controllers = [ADBController(device) for device in self.devices] def _get_devices(self): result = subprocess.run("adb devices", shell=True, stdout=subprocess.PIPE, text=True) lines = result.stdout.splitlines()[1:] # 跳过第一行标题 return [line.split('\t')[0] for line in lines if line.strip()] def run_on_all(self, func, *args, **kwargs): from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: futures = [ executor.submit(func, controller, *args, **kwargs) for controller in self.controllers ] return [f.result() for f in futures]4.2 结合OCR提升测试可靠性
对于动态变化的UI元素,可以集成OCR技术:
import pytesseract from PIL import Image class OCREnhancedTester(ADBController): def get_text_from_screen(self, region=None): # 截屏并保存 self.run_adb("shell screencap -p /sdcard/temp.png") self.run_adb("pull /sdcard/temp.png ./temp.png") # 处理图像 img = Image.open("./temp.png") if region: img = img.crop(region) # (left, top, right, bottom) # OCR识别 text = pytesseract.image_to_string(img, lang='chi_sim+eng') return text.strip() def wait_for_text(self, target_text, timeout=10, interval=1): start = time.time() while time.time() - start < timeout: current_text = self.get_text_from_screen() if target_text in current_text: return True time.sleep(interval) return False4.3 性能监控与优化
自动化测试不仅要关注功能,还要监测性能表现:
class PerformanceMonitor(ADBController): def get_cpu_usage(self, package_name): cmd = f"shell top -n 1 | grep {package_name}" result = self.run_adb(cmd) if result: parts = result.split() return float(parts[8]) # CPU使用百分比 return 0 def get_memory_usage(self, package_name): cmd = f"shell dumpsys meminfo {package_name} | grep TOTAL" result = self.run_adb(cmd) if result: return int(result.split()[1]) # KB return 0 def monitor_performance(self, package_name, duration=60, interval=5): data = [] end_time = time.time() + duration while time.time() < end_time: cpu = self.get_cpu_usage(package_name) memory = self.get_memory_usage(package_name) timestamp = datetime.now().strftime("%H:%M:%S") data.append({ 'time': timestamp, 'cpu': cpu, 'memory': memory }) time.sleep(interval) return data掌握这些技术后,你会发现自动刷视频只是ADB应用的冰山一角。真正的价值在于将这些技术应用到App功能测试、兼容性测试和性能测试等专业领域,为开发高质量移动应用提供可靠保障。