news 2026/11/5 18:44:30

Open-AutoGLM在自动化测试中的应用:模拟用户操作解放双手

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Open-AutoGLM在自动化测试中的应用:模拟用户操作解放双手

Open-AutoGLM在自动化测试中的应用:模拟用户操作解放双手

1. 引言:当自动化测试遇见AI智能体

在移动应用开发的生命周期中,自动化测试是保证产品质量、提升发布效率的关键环节。然而,传统的自动化测试脚本编写复杂、维护成本高,且难以应对频繁变化的UI界面。测试工程师常常需要花费大量时间编写和调试脚本,以模拟用户的点击、滑动和输入操作。

想象一下,如果测试脚本能像人一样“看懂”屏幕,理解应用界面的布局和元素,然后自主决定下一步该做什么——这听起来像是科幻场景,但Open-AutoGLM正将这一愿景变为现实。作为智谱AI开源的手机端AI Agent框架,它通过视觉语言模型(VLM)理解屏幕内容,并结合ADB自动操控设备,实现了用自然语言指令驱动测试流程的革命性突破。

本文将深入探讨如何利用Open-AutoGLM框架,将AI智能体技术融入自动化测试工作流,实现“动口不动手”的智能测试新范式。

2. Open-AutoGLM:AI驱动的测试执行引擎

2.1 从“脚本驱动”到“意图驱动”的范式转变

传统的自动化测试依赖于预先编写的脚本,这些脚本通常基于UI元素的ID、XPath或坐标进行定位和操作。当应用界面发生变化时,即使是一个按钮位置的微小调整,也可能导致整个测试脚本失效,需要人工重新定位和修改。

Open-AutoGLM引入了一种全新的“意图驱动”测试模式:

  • 自然语言描述测试场景:测试人员只需用日常语言描述测试步骤,如“打开应用,登录测试账号,进入个人中心修改头像”
  • AI自主理解与执行:框架通过视觉语言模型实时分析屏幕内容,理解当前界面状态和可操作元素
  • 动态路径规划:AI根据测试目标自动规划操作序列,无需预先定义每一步的具体坐标或元素定位器
  • 自适应界面变化:即使UI布局更新,只要语义功能不变,AI仍能识别并执行相应操作

这种转变大幅降低了测试脚本的编写和维护成本,让测试人员能够更专注于测试用例的设计而非实现细节。

2.2 核心技术架构解析

Open-AutoGLM的自动化测试能力建立在三个核心组件之上:

视觉感知层:通过ADB实时获取设备屏幕截图,作为AI“眼睛”的输入源。与传统OCR技术不同,VLM模型能够理解图像中的语义关系,而不仅仅是识别文字。

意图理解与规划层:这是框架的核心智能部分。AutoGLM-Phone模型同时接收用户指令(测试场景描述)和当前屏幕图像,通过多模态融合理解,输出结构化的操作指令。

动作执行层:将AI规划的操作转化为具体的ADB命令,包括:

  • adb shell input tap x y:模拟点击操作
  • adb shell input swipe x1 y1 x2 y2:模拟滑动操作
  • adb shell input text “内容”:模拟文本输入
  • adb shell input keyevent KEYCODE_HOME:模拟按键操作
# Open-AutoGLM内部的动作转换示例(概念代码) def execute_ai_plan(plan): """ 将AI规划的动作转换为ADB命令并执行 """ for action in plan: if action.type == "tap": # 点击指定坐标 adb_command = f"shell input tap {action.x} {action.y}" elif action.type == "swipe": # 从起点滑动到终点 adb_command = f"shell input swipe {action.x1} {action.y1} {action.x2} {action.y2}" elif action.type == "input": # 输入文本 adb_command = f'shell input text "{action.text}"' # 执行ADB命令 subprocess.run(f"adb -s {device_id} {adb_command}", shell=True)

2.3 在测试场景中的独特优势

跨应用流程测试:传统测试框架通常局限于单个应用内部,而Open-AutoGLM可以无缝衔接不同应用的操作。例如,测试“从微信分享图片到朋友圈”这样的跨应用场景变得非常简单。

异常处理与恢复:当测试过程中出现意外弹窗或错误提示时,AI能够识别这些异常状态并采取相应措施,如关闭弹窗、重试操作或记录错误。

探索性测试支持:测试人员可以给出模糊的探索指令,如“浏览应用的所有主要功能页面”,AI会自主探索并记录发现的问题。

3. 搭建AI自动化测试环境

3.1 环境准备与设备连接

要开始使用Open-AutoGLM进行自动化测试,需要搭建一个包含云端AI服务和本地控制端的混合架构。

云端服务部署(模型推理端)

由于视觉语言模型对计算资源要求较高,建议将模型部署在具备GPU的云服务器上:

# 在云服务器上启动vLLM服务 python -m vllm.entrypoints.openai.api_server \ --model THUDM/autoglm-phone-9b \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.9 \ --max-model-len 8192 \ --port 8800

本地控制端配置(测试执行端)

在测试工程师的本地电脑上配置控制环境:

# 克隆Open-AutoGLM仓库 git clone https://github.com/zai-org/Open-AutoGLM cd Open-AutoGLM # 创建虚拟环境(推荐) python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Linux/macOS: source venv/bin/activate # 安装依赖 pip install -r requirements.txt pip install -e .

测试设备准备

  1. 安卓设备要求:Android 7.0及以上版本的真实手机或模拟器
  2. 开启开发者选项:设置 → 关于手机 → 连续点击“版本号”7次
  3. 启用USB调试:开发者选项 → 开启“USB调试”
  4. 安装ADB Keyboard:用于通过ADB直接输入文本,绕过部分应用对虚拟键盘的限制

3.2 连接测试设备

USB连接方式(稳定性最佳)

# 查看已连接设备 adb devices # 预期输出 List of devices attached emulator-5554 device

WiFi连接方式(适合无线测试环境)

# 首次需要通过USB连接启用TCP/IP模式 adb tcpip 5555 # 获取设备IP地址 adb shell ip addr show wlan0 | grep "inet " | awk '{print $2}' | cut -d/ -f1 # 通过WiFi连接(假设设备IP为192.168.1.100) adb connect 192.168.1.100:5555

3.3 编写第一个AI驱动的测试用例

让我们从一个简单的测试场景开始:测试某电商应用的搜索功能。

传统脚本方式 vs AI驱动方式对比

传统基于Appium的测试脚本:

# 传统方式:需要精确的元素定位 from appium import webdriver desired_caps = { 'platformName': 'Android', 'deviceName': 'emulator-5554', 'appPackage': 'com.example.shopping', 'appActivity': '.MainActivity' } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 定位搜索框并输入 search_box = driver.find_element_by_id('com.example.shopping:id/search_box') search_box.click() search_box.send_keys('智能手机') # 定位搜索按钮并点击 search_button = driver.find_element_by_id('com.example.shopping:id/search_button') search_button.click()

AI驱动的方式:

# AI驱动方式:只需描述测试意图 from phone_agent.agent import PhoneAgent # 初始化AI代理 agent = PhoneAgent( device_id="emulator-5554", base_url="http://your-server-ip:8800/v1", model="autoglm-phone-9b" ) # 执行测试用例 - 用自然语言描述测试步骤 test_result = agent.execute_task( "打开购物应用,在搜索框输入'智能手机',然后点击搜索按钮" ) # 验证测试结果 if test_result["status"] == "success": print("测试用例执行成功") # 可以进一步验证搜索结果页面是否正确显示 else: print(f"测试执行失败: {test_result['error']}")

复杂测试场景示例

对于更复杂的测试流程,AI驱动的优势更加明显:

# 测试完整的用户注册流程 test_scenarios = [ "打开应用,点击右下角的'我的'标签进入个人中心", "点击'注册新账号'按钮", "在手机号输入框填写13800138000", "点击获取验证码按钮", "在验证码输入框填写123456", "设置密码为Test123456", "再次确认密码为Test123456", "勾选用户协议复选框", "点击立即注册按钮", "验证是否显示注册成功提示" ] for i, scenario in enumerate(test_scenarios, 1): print(f"执行步骤 {i}: {scenario}") result = agent.execute_task(scenario) if result["status"] != "success": print(f"步骤 {i} 执行失败,测试终止") break # 可选:添加等待时间或验证点 time.sleep(1)

4. 高级测试应用场景与实践

4.1 跨应用流程测试

在实际用户场景中,很多操作涉及多个应用间的协作。Open-AutoGLM能够无缝处理这类跨应用测试。

示例:测试社交分享功能

# 测试从相册选择图片分享到社交媒体的完整流程 cross_app_test = [ "打开相机应用,拍摄一张照片", "返回桌面,打开相册应用", "找到刚才拍摄的照片并点击选中", "点击分享按钮", "在分享弹窗中选择微信应用", "选择分享到朋友圈", "输入分享文案'AI自动化测试拍摄的照片'", "点击发表按钮", "返回到微信朋友圈,确认照片已成功发布" ] # 执行跨应用测试 for step in cross_app_test: result = agent.execute_task(step) if not result["success"]: print(f"跨应用测试在步骤'{step}'失败") # 可以在这里添加失败处理逻辑,如截图保存 agent.take_screenshot(f"error_step_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png") break

4.2 探索性测试与异常发现

传统自动化测试只能验证预设的测试用例,而AI驱动的测试可以进行探索性测试,主动发现未预料到的问题。

class ExploratoryTester: def __init__(self, agent): self.agent = agent self.visited_screens = set() self.issues_found = [] def explore_application(self, start_instruction="打开应用"): """ 探索应用的所有主要功能 """ # 执行初始指令 self.agent.execute_task(start_instruction) current_screen = self.agent.get_current_screen_description() # 开始探索循环 for _ in range(50): # 限制探索步数 if current_screen in self.visited_screens: # 如果回到已访问的界面,尝试其他操作 action = "尝试点击一个之前没点过的按钮" else: self.visited_screens.add(current_screen) action = "探索当前页面的主要功能" result = self.agent.execute_task(action) # 检查是否有异常 if self._detect_anomaly(result): self.issues_found.append({ "screen": current_screen, "action": action, "issue": result.get("anomaly_description", "未知异常") }) # 获取新的屏幕状态 current_screen = self.agent.get_current_screen_description() # 随机决定是否返回或继续 if random.random() < 0.2: # 20%概率返回 self.agent.execute_task("点击返回按钮") def _detect_anomaly(self, result): """ 检测执行结果中的异常 """ if result["status"] == "error": return True # 可以添加更多异常检测逻辑 # 如:检测崩溃、无响应、UI错乱等 return False # 使用探索性测试 tester = ExploratoryTester(agent) tester.explore_application("打开待测试的应用") print(f"发现 {len(tester.issues_found)} 个问题") for issue in tester.issues_found: print(f"- 在界面'{issue['screen']}'执行'{issue['action']}'时:{issue['issue']}")

4.3 兼容性测试自动化

应用需要在不同设备、不同分辨率上保持一致的体验。Open-AutoGLM可以配合多设备管理,实现批量兼容性测试。

class CompatibilityTestSuite: def __init__(self, device_list): """ 初始化多设备测试套件 device_list: 设备ID列表 """ self.devices = [] for device_id in device_list: agent = PhoneAgent( device_id=device_id, base_url="http://your-server-ip:8800/v1", model="autoglm-phone-9b" ) self.devices.append({ "id": device_id, "agent": agent, "results": [] }) def run_test_on_all_devices(self, test_case): """ 在所有设备上并行运行测试用例 """ import concurrent.futures def run_on_device(device_info): try: result = device_info["agent"].execute_task(test_case) device_info["results"].append({ "test_case": test_case, "result": result, "timestamp": datetime.now() }) return device_info["id"], result["status"] except Exception as e: return device_info["id"], f"error: {str(e)}" # 使用线程池并行执行 with concurrent.futures.ThreadPoolExecutor(max_workers=len(self.devices)) as executor: futures = [executor.submit(run_on_device, device) for device in self.devices] for future in concurrent.futures.as_completed(futures): device_id, status = future.result() print(f"设备 {device_id}: 测试状态 - {status}") def generate_compatibility_report(self): """ 生成兼容性测试报告 """ report = { "total_devices": len(self.devices), "test_cases": set(), "results_by_device": {} } for device in self.devices: device_id = device["id"] report["results_by_device"][device_id] = { "total_tests": len(device["results"]), "passed": 0, "failed": 0, "details": [] } for test_result in device["results"]: report["test_cases"].add(test_result["test_case"]) if test_result["result"]["status"] == "success": report["results_by_device"][device_id]["passed"] += 1 else: report["results_by_device"][device_id]["failed"] += 1 report["results_by_device"][device_id]["details"].append(test_result) return report # 执行兼容性测试 devices = ["device_1", "device_2", "device_3"] # 实际设备ID test_suite = CompatibilityTestSuite(devices) test_cases = [ "打开应用,验证主页面加载正常", "点击登录按钮,进入登录页面", "在搜索框输入'test'并搜索", "向下滑动浏览内容", "点击第一个商品查看详情" ] for test_case in test_cases: print(f"\n执行测试用例: {test_case}") test_suite.run_test_on_all_devices(test_case) # 生成报告 report = test_suite.generate_compatibility_report() print(f"\n兼容性测试报告:") print(f"测试设备数: {report['total_devices']}") print(f"测试用例数: {len(report['test_cases'])}") for device_id, result in report['results_by_device'].items(): print(f"{device_id}: 通过 {result['passed']}/{result['total_tests']}")

4.4 性能测试集成

结合性能监控工具,Open-AutoGLM可以在执行功能测试的同时收集性能数据。

class PerformanceAwareTester: def __init__(self, agent, device_id): self.agent = agent self.device_id = device_id self.performance_data = [] def execute_with_performance_monitoring(self, instruction): """ 执行指令并监控性能指标 """ import time # 开始监控 start_time = time.time() cpu_before = self._get_cpu_usage() memory_before = self._get_memory_usage() # 执行AI指令 result = self.agent.execute_task(instruction) # 结束监控 end_time = time.time() cpu_after = self._get_cpu_usage() memory_after = self._get_memory_usage() # 记录性能数据 perf_record = { "instruction": instruction, "execution_time": end_time - start_time, "cpu_usage_change": cpu_after - cpu_before, "memory_usage_change": memory_after - memory_before, "timestamp": datetime.now(), "success": result["status"] == "success" } self.performance_data.append(perf_record) return result def _get_cpu_usage(self): """获取当前CPU使用率""" # 通过ADB获取设备CPU信息 import subprocess cmd = f"adb -s {self.device_id} shell top -n 1 | grep {self.package_name}" result = subprocess.run(cmd, shell=True, capture_output=True, text=True) # 解析CPU使用率 # 这里简化处理,实际需要根据top输出格式解析 return 0.0 def _get_memory_usage(self): """获取当前内存使用量""" # 通过ADB获取设备内存信息 import subprocess cmd = f"adb -s {self.device_id} shell dumpsys meminfo {self.package_name}" result = subprocess.run(cmd, shell=True, capture_output=True, text=True) # 解析内存使用量 # 这里简化处理,实际需要根据dumpsys输出格式解析 return 0 def generate_performance_report(self): """生成性能测试报告""" if not self.performance_data: return "无性能数据" report = { "total_operations": len(self.performance_data), "average_execution_time": sum(p["execution_time"] for p in self.performance_data) / len(self.performance_data), "success_rate": sum(1 for p in self.performance_data if p["success"]) / len(self.performance_data) * 100, "detailed_records": self.performance_data } return report # 使用性能感知的测试 perf_tester = PerformanceAwareTester(agent, "emulator-5554") # 执行一系列操作并监控性能 operations = [ "冷启动应用", "浏览首页10秒", "进入搜索页面", "搜索'电子产品'", "查看商品详情页", "加入购物车", "进入结算页面" ] for op in operations: print(f"执行操作: {op}") result = perf_tester.execute_with_performance_monitoring(op) print(f"结果: {result['status']}, 耗时: {perf_tester.performance_data[-1]['execution_time']:.2f}秒") # 分析性能数据 report = perf_tester.generate_performance_report() print(f"\n性能测试报告:") print(f"总操作数: {report['total_operations']}") print(f"平均执行时间: {report['average_execution_time']:.2f}秒") print(f"成功率: {report['success_rate']:.1f}%")

5. 测试框架集成与最佳实践

5.1 与现有测试框架的集成

Open-AutoGLM可以轻松集成到现有的测试框架中,如pytest、unittest等,作为传统测试方法的补充。

pytest集成示例

# test_ai_driven.py import pytest from phone_agent.agent import PhoneAgent @pytest.fixture(scope="session") def ai_agent(): """创建AI代理fixture""" agent = PhoneAgent( device_id="emulator-5554", base_url="http://localhost:8800/v1", model="autoglm-phone-9b" ) yield agent # 测试结束后清理 agent.cleanup() class TestShoppingApp: """电商应用测试类""" def test_search_functionality(self, ai_agent): """测试搜索功能""" result = ai_agent.execute_task( "打开购物应用,在顶部搜索框输入'无线耳机',点击搜索按钮" ) assert result["status"] == "success" assert "search" in result.get("screen_description", "").lower() def test_add_to_cart(self, ai_agent): """测试加入购物车流程""" # 先搜索商品 ai_agent.execute_task("搜索'智能手机'") # 点击第一个商品 ai_agent.execute_task("点击第一个商品进入详情页") # 加入购物车 result = ai_agent.execute_task("点击加入购物车按钮") assert result["status"] == "success" # 可以添加更多断言,如验证购物车数量变化 @pytest.mark.parametrize("category", ["手机", "电脑", "家电", "服饰"]) def test_category_browsing(self, ai_agent, category): """参数化测试:浏览不同商品分类""" result = ai_agent.execute_task( f"打开购物应用,进入{category}分类,向下滑动浏览商品" ) assert result["status"] == "success" # 运行测试 # pytest test_ai_driven.py -v

5.2 测试数据管理与参数化

结合数据驱动测试理念,将测试数据与AI指令分离,提高测试用例的可维护性。

import yaml class DataDrivenAITester: def __init__(self, agent, test_data_file): self.agent = agent with open(test_data_file, 'r', encoding='utf-8') as f: self.test_data = yaml.safe_load(f) def run_test_suite(self, suite_name): """运行指定的测试套件""" suite = self.test_data.get(suite_name) if not suite: raise ValueError(f"测试套件 '{suite_name}' 不存在") results = [] for test_case in suite["test_cases"]: print(f"\n执行测试用例: {test_case['name']}") # 执行前置条件 for precondition in test_case.get("preconditions", []): self.agent.execute_task(precondition) # 执行主要测试步骤 test_result = { "name": test_case["name"], "steps": [], "status": "passed" } for step in test_case["steps"]: step_result = self.agent.execute_task(step["instruction"]) test_result["steps"].append({ "instruction": step["instruction"], "result": step_result, "expected": step.get("expected") }) # 验证预期结果 if step.get("expected"): if not self._verify_expectation(step_result, step["expected"]): test_result["status"] = "failed" test_result["failure_step"] = step["instruction"] break # 执行清理操作 for cleanup in test_case.get("cleanup", []): self.agent.execute_task(cleanup) results.append(test_result) return results def _verify_expectation(self, actual_result, expected): """验证实际结果是否符合预期""" # 这里可以根据需要实现各种验证逻辑 if "screen_contains" in expected: return expected["screen_contains"] in actual_result.get("screen_description", "") return True # YAML测试数据文件示例 (test_cases.yaml) """ login_suite: name: "用户登录测试套件" test_cases: - name: "正常登录测试" preconditions: - "清除应用数据重新打开" steps: - instruction: "点击登录按钮" expected: screen_contains: "登录页面" - instruction: "在用户名输入框输入testuser" - instruction: "在密码输入框输入password123" - instruction: "点击登录按钮" expected: screen_contains: "首页" cleanup: - "退出登录" - name: "错误密码登录测试" preconditions: - "清除应用数据重新打开" steps: - instruction: "点击登录按钮" - instruction: "在用户名输入框输入testuser" - instruction: "在密码输入框输入wrongpassword" - instruction: "点击登录按钮" expected: screen_contains: "密码错误" """ # 使用数据驱动测试 tester = DataDrivenAITester(agent, "test_cases.yaml") results = tester.run_test_suite("login_suite") for result in results: print(f"{result['name']}: {result['status']}") if result['status'] == 'failed': print(f" 失败步骤: {result.get('failure_step')}")

5.3 测试报告与结果分析

生成详细的测试报告,包括截图、日志和性能数据,便于问题分析和追溯。

import json from datetime import datetime from pathlib import Path class TestReporter: def __init__(self, report_dir="test_reports"): self.report_dir = Path(report_dir) self.report_dir.mkdir(exist_ok=True) self.test_session = { "start_time": datetime.now().isoformat(), "test_cases": [], "summary": { "total": 0, "passed": 0, "failed": 0, "duration": 0 } } def start_test_case(self, name, description=""): """开始记录一个测试用例""" test_case = { "name": name, "description": description, "start_time": datetime.now().isoformat(), "steps": [], "status": "running", "screenshots": [] } self.test_session["test_cases"].append(test_case) return len(self.test_session["test_cases"]) - 1 # 返回用例索引 def record_step(self, test_case_index, instruction, result, screenshot_path=None): """记录测试步骤""" test_case = self.test_session["test_cases"][test_case_index] step_record = { "instruction": instruction, "timestamp": datetime.now().isoformat(), "result_status": result.get("status", "unknown"), "screen_description": result.get("screen_description", ""), "ai_confidence": result.get("confidence", 0) } test_case["steps"].append(step_record) # 保存截图 if screenshot_path: screenshot_info = { "path": str(screenshot_path), "step_index": len(test_case["steps"]) - 1, "timestamp": datetime.now().isoformat() } test_case["screenshots"].append(screenshot_info) def end_test_case(self, test_case_index, status, error_message=""): """结束测试用例记录""" test_case = self.test_session["test_cases"][test_case_index] test_case["status"] = status test_case["end_time"] = datetime.now().isoformat() test_case["error_message"] = error_message if status == "failed" else "" # 更新摘要统计 self.test_session["summary"]["total"] += 1 if status == "passed": self.test_session["summary"]["passed"] += 1 else: self.test_session["summary"]["failed"] += 1 def generate_report(self): """生成测试报告""" self.test_session["end_time"] = datetime.now().isoformat() # 计算总时长 start = datetime.fromisoformat(self.test_session["start_time"]) end = datetime.fromisoformat(self.test_session["end_time"]) self.test_session["summary"]["duration"] = (end - start).total_seconds() # 保存JSON报告 report_file = self.report_dir / f"test_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" with open(report_file, 'w', encoding='utf-8') as f: json.dump(self.test_session, f, ensure_ascii=False, indent=2) # 生成HTML摘要报告 self._generate_html_summary(report_file) return report_file def _generate_html_summary(self, json_report_path): """生成HTML格式的测试报告摘要""" html_content = f""" <!DOCTYPE html> <html> <head> <title>AI自动化测试报告</title> <style> body {{ font-family: Arial, sans-serif; margin: 40px; }} .summary {{ background: #f5f5f5; padding: 20px; border-radius: 5px; }} .passed {{ color: green; }} .failed {{ color: red; }} .test-case {{ margin: 20px 0; padding: 15px; border: 1px solid #ddd; }} .steps {{ margin-left: 20px; }} .step {{ margin: 5px 0; }} </style> </head> <body> <h1>AI自动化测试报告</h1> <div class="summary"> <h2>测试摘要</h2> <p>开始时间: {self.test_session['start_time']}</p> <p>结束时间: {self.test_session['end_time']}</p> <p>总用时: {self.test_session['summary']['duration']:.1f}秒</p> <p>测试用例总数: {self.test_session['summary']['total']}</p> <p class="passed">通过: {self.test_session['summary']['passed']}</p> <p class="failed">失败: {self.test_session['summary']['failed']}</p> <p>通过率: {self.test_session['summary']['passed']/self.test_session['summary']['total']*100:.1f}%</p> </div> <h2>详细测试结果</h2> """ for i, test_case in enumerate(self.test_session["test_cases"]): status_class = "passed" if test_case["status"] == "passed" else "failed" html_content += f""" <div class="test-case"> <h3>测试用例 {i+1}: {test_case['name']} <span class="{status_class}">({test_case['status'].upper()})</span> </h3> <p>{test_case.get('description', '')}</p> <div class="steps"> <h4>执行步骤:</h4> """ for j, step in enumerate(test_case["steps"]): html_content += f""" <div class="step"> <strong>步骤 {j+1}:</strong> {step['instruction']}<br> <em>结果:</em> {step['result_status']} | <em>AI置信度:</em> {step.get('ai_confidence', 0):.2f} </div> """ html_content += """ </div> </div> """ html_content += """ </body> </html> """ html_file = self.report_dir / "test_summary.html" with open(html_file, 'w', encoding='utf-8') as f: f.write(html_content) print(f"HTML报告已生成: {html_file}") # 使用测试报告器 reporter = TestReporter() # 在测试过程中记录 test_case_id = reporter.start_test_case("用户登录测试", "测试用户登录功能是否正常") try: # 执行测试步骤 result1 = agent.execute_task("打开应用") reporter.record_step(test_case_id, "打开应用", result1, "screenshot1.png") result2 = agent.execute_task("点击登录按钮") reporter.record_step(test_case_id, "点击登录按钮", result2, "screenshot2.png") # ... 更多测试步骤 reporter.end_test_case(test_case_id, "passed") except Exception as e: reporter.end_test_case(test_case_id, "failed", str(e)) # 生成最终报告 report_file = reporter.generate_report() print(f"测试报告已保存至: {report_file}")

5.4 最佳实践建议

环境配置建议

  1. 使用专用测试设备:避免使用个人主力机,防止测试过程中的误操作影响正常使用
  2. 配置稳定的网络环境:WiFi连接时确保网络稳定,避免ADB连接中断
  3. 定期更新ADB驱动:保持ADB工具为最新版本,避免兼容性问题
  4. 设置设备常亮:在开发者选项中关闭屏幕自动休眠,防止测试中断

测试设计建议

  1. 从简单场景开始:先验证基本功能,再逐步增加复杂度
  2. 添加足够的等待时间:在关键操作间添加适当的等待,确保界面加载完成
  3. 实现失败重试机制:对于不稳定的操作,添加自动重试逻辑
  4. 结合传统定位方式:对于关键验证点,可以结合传统元素定位方式提高准确性

维护建议

  1. 定期更新模型:关注Open-AutoGLM的版本更新,及时升级以获得更好的识别准确率
  2. 建立测试用例库:将成功的测试用例保存为模板,便于复用
  3. 监控AI置信度:关注AI执行每个步骤的置信度分数,低置信度时考虑人工验证
  4. 收集反馈数据:将AI识别错误的案例收集起来,可用于后续模型优化

6. 总结

Open-AutoGLM为自动化测试领域带来了革命性的变化,将测试从“脚本驱动”转变为“意图驱动”。通过自然语言描述测试场景,AI能够自主理解界面、规划操作路径并执行测试步骤,大幅降低了测试脚本的编写和维护成本。

6.1 核心价值总结

提升测试效率:测试人员可以用自然语言快速描述测试用例,无需编写复杂的定位脚本和逻辑判断。

增强测试覆盖:AI能够处理更复杂的用户交互场景,包括跨应用操作、异常情况处理等传统自动化难以覆盖的场景。

降低维护成本:当应用界面发生变化时,只要语义功能不变,AI通常能够自适应新的UI布局,减少脚本维护工作。

支持探索性测试:AI可以自主探索应用功能,发现预设测试用例之外的问题。

6.2 适用场景

回归测试:快速验证核心功能在每次迭代后是否正常工作。

兼容性测试:在多设备、多分辨率上并行执行相同的测试场景。

用户体验测试:模拟真实用户的操作路径,发现交互设计问题。

探索性测试:在没有明确测试用例的情况下,让AI自主探索应用功能。

6.3 未来展望

随着视觉语言模型技术的不断进步,AI驱动的自动化测试将变得更加智能和可靠。未来的发展方向可能包括:

  • 多模态测试验证:不仅执行操作,还能验证屏幕内容是否符合预期,如文字内容、图像显示等
  • 自适应测试优化:AI能够根据历史测试结果自动优化测试策略,提高测试效率
  • 跨平台测试支持:从安卓扩展到iOS、Web等其他平台
  • 测试用例自动生成:根据应用的功能描述自动生成测试场景

Open-AutoGLM为测试自动化打开了一扇新的大门。虽然目前仍有一些局限性,如对复杂动态界面的识别准确率、执行速度等,但其代表的“意图驱动”测试理念无疑是未来的发展方向。对于希望提升测试效率、降低维护成本的团队来说,现在正是开始探索和实践AI驱动自动化测试的好时机。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 18:44:06

2026年答辩前一天AI率89%?3步紧急降AI方案

2026年答辩前一天AI率89%&#xff1f;3步紧急降AI方案 答辩前一天晚上跑了一遍检测&#xff0c;AI率89%。 盯着屏幕上的数字发了两分钟呆。论文是用DeepSeek辅助整理的资料和大纲&#xff0c;正文自己写的&#xff0c;但现在解释这些没用&#xff0c;数字摆在那里。明天下午两…

作者头像 李华
网站建设 2026/10/28 20:27:02

NifSkope:开源3D模型编辑工具的技术架构突破与游戏开发效率革命

NifSkope&#xff1a;开源3D模型编辑工具的技术架构突破与游戏开发效率革命 【免费下载链接】nifskope A git repository for nifskope. 项目地址: https://gitcode.com/gh_mirrors/ni/nifskope NifSkope是一款专注于NIF格式的开源3D模型编辑工具&#xff0c;通过创新的…

作者头像 李华
网站建设 2026/10/5 1:34:04

伏羲天气预报保姆级教程:output.nc中lat/lon坐标系与WGS84标准对齐方法

伏羲天气预报保姆级教程&#xff1a;output.nc中lat/lon坐标系与WGS84标准对齐方法 重要提示&#xff1a;本文基于复旦大学开发的FuXi中期气象大模型&#xff0c;专注于解决天气预报输出数据中的坐标系对齐问题&#xff0c;确保气象数据在不同系统间的兼容性和准确性。 1. 为什…

作者头像 李华
网站建设 2026/10/5 1:35:33

MicroPython测试 ESP32-S3 + 8MB PSRAM + ST7789 屏幕

1.开发板&#xff1a;ESP32-S3 WROOM-1-N8R82.屏幕&#xff1a;ST7789 按下列代码里的GPIO接线&#xff1a;import machine import time import framebuf import math import gc# 硬件配置 PIN_SCL 9 PIN_SDA 8 PIN_CS 5 PIN_DC 6 PIN_RST 7 PIN_BL 4SCREEN_W 240…

作者头像 李华
网站建设 2026/10/5 1:35:50

Vue2项目实战:用AntV X6打造可拖拽流程图编辑器(附完整代码)

Vue2项目实战&#xff1a;用AntV X6打造可拖拽流程图编辑器&#xff08;附完整代码&#xff09; 最近在重构一个内部审批系统&#xff0c;产品经理提了个需求&#xff1a;需要一个能让业务人员自己画流程图的模块。这可不是简单的静态展示&#xff0c;用户得能拖拽节点、自由连…

作者头像 李华