news 2026/6/22 23:23:21

AI驱动自动化测试:从视觉感知到LLM决策的智能体构建实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI驱动自动化测试:从视觉感知到LLM决策的智能体构建实践

1. 项目概述:从“人肉”到“智能”的测试范式跃迁

如果你还在为每天重复点击按钮、填写表单、验证数据而焦头烂额,或者你的团队正被海量的回归测试用例压得喘不过气,那么是时候停下来思考一下了。我们正处在一个由AI驱动的效率革命浪潮中,而软件测试这个传统上高度依赖人力的领域,恰恰是AI能够大展拳脚、释放巨大价值的核心战场。这个项目要探讨的,就是如何将AI技术深度融入自动化测试流程,构建一个能够“思考”、会“学习”、能“适应”的智能测试系统。它解决的不仅仅是“把手工操作变成脚本”的问题,更是要解决传统自动化测试脚本脆弱、维护成本高、无法应对UI频繁变更和业务逻辑复杂多变的根本痛点。

简单来说,这不再是简单的“录制-回放”或者基于固定坐标的点击。我们谈论的是一种更高级的自动化:测试脚本能够像有经验的测试工程师一样,“看懂”界面上的元素,理解业务操作的意图,甚至在遇到未预料到的弹窗或流程分支时,能够自主决策下一步该怎么做。这听起来或许有些未来感,但得益于计算机视觉(CV)、自然语言处理(NLP)以及大语言模型(LLM)技术的飞速发展和开源化,构建这样的智能测试体(AI Agent)已经具备了坚实的技术基础和丰富的工具生态。无论你是测试开发工程师、质量保障负责人,还是对提升研发效能感兴趣的开发者,理解并实践AI驱动的自动化测试,都将成为你在数字化竞争中保持领先的关键技能。

2. 智能自动化测试的核心设计思路与技术选型

传统的自动化测试,无论是基于Selenium、Appium的UI自动化,还是基于RestAssured、Pytest的接口自动化,其核心逻辑都是“预期-断言”。我们预先编写好脚本,明确每一步操作和每一个验证点,脚本则忠实地执行并比对结果。这套模式在稳定、变更缓慢的系统上运行良好,但面对如今敏捷开发、快速迭代、UI组件库频繁升级的现状,其弊端日益凸显:一个按钮的IDXPath变了,整个测试套件可能大面积失败,维护成本急剧上升。

AI赋能的自动化测试,其设计思路从“基于坐标或固定定位符的指令执行”,转向了“基于视觉与语义理解的意图执行”。它的核心目标是让测试脚本具备一定的感知、理解和决策能力。整个系统的设计通常包含以下几个关键层次:

2.1 感知层:从“盲人摸象”到“眼见为实”

这是智能测试的“眼睛”。传统自动化通过DOM树或UI层级结构来定位元素,一旦结构变化就“失明”。AI测试的感知层主要依靠计算机视觉(CV)。

  • 技术核心:使用开源CV库(如OpenCV)或专用SDK,对应用界面进行实时截图和分析。
  • 关键能力
    • 元素检测与识别:识别界面上的按钮、输入框、下拉列表、图标等元素,并标注其位置(边界框)。这不再依赖IDXPath,而是基于元素的视觉特征。
    • 光学字符识别(OCR):读取界面上的文本信息,用于后续的验证和决策。例如,识别错误提示框中的文字内容。
    • 图像相似度匹配:判断当前界面是否与预期的某个状态(如登录成功后的主页)相似。
  • 工具选型考量:对于通用场景,OpenCV+自定义模型是一个灵活但需要一定开发量的选择。如果想快速上手,可以考虑集成Tesseract(OCR)以及一些基于深度学习的预训练目标检测模型(如YOLO系列),或者使用已经封装了这些能力的测试框架扩展。

2.2 理解与决策层:从“机械执行”到“意图驱动”

这是智能测试的“大脑”。感知层看到了元素,但“点击哪个按钮”、“输入什么内容”需要由大脑来决定。这里是大语言模型(LLM)发挥核心作用的地方。

  • 技术核心:利用LLM(如GPT-4、Claude 3、或开源的Llama 3、Qwen等)的自然语言理解能力。
  • 工作流程
    1. 场景描述:将测试用例用自然语言描述,例如:“作为已登录用户,将购物车中的第一件商品数量修改为2,然后结算。”
    2. 环境感知输入:将感知层获取的当前屏幕信息(如图像描述、识别出的元素列表及其位置、OCR读取的文本)结构化后输入给LLM。
    3. 意图解析与动作生成:LLM结合测试意图和当前屏幕状态,解析出下一步应该执行的具体操作。例如,输出:{“action”: “click”, “target”: “按钮,文字为‘修改数量’”, “reason”: “这是修改商品数量的入口”}{“action”: “input”, “target”: “输入框,旁边文字为‘数量’”, “value”: “2”}
  • 工具选型考量:选择LLM API(如OpenAI、Anthropic)可以获得强大的能力,但需考虑成本、网络延迟和数据隐私。对于内部系统测试,部署开源模型是更安全可控的选择。Spring AI这类项目提供了对多种AI模型服务的统一抽象,能让你的测试框架更容易切换底层模型,提升可维护性。

2.3 执行层:从“指令”到“动作”

这是智能测试的“手”。它接收决策层发出的标准化动作指令,并将其转化为对被测应用的实际操作。

  • 技术核心:与传统自动化测试框架结合。例如,对于Web应用,可以驱动Selenium WebDriver;对于桌面应用,可以使用PyAutoGUI或微软的Playwright(其本身也集成了部分AI能力,如get_by_text);对于移动应用,则驱动Appium。
  • 关键职责:将抽象的“点击某个按钮”指令,通过感知层提供的元素位置信息,转换为具体的鼠标点击坐标或基于视觉定位的自动化工具调用。

2.4 记忆与学习层:构建测试经验库

智能体不应该每次测试都从零开始。记忆层用于存储测试历史、成功的操作路径、以及遇到过的异常情况及其处理方式。

  • 技术实现:可以是一个简单的数据库(记录操作序列和截图),也可以是一个向量数据库(用于存储界面状态的嵌入向量,便于快速相似性检索)。当测试再次遇到相似界面时,可以直接从记忆库中召回成功的操作策略,提升效率。

实操心得:框架选型的平衡艺术完全从零搭建一个AI测试框架工程量巨大。更务实的策略是“增强现有框架”。例如,以PlaywrightSelenium为基础,为其增加“视觉定位”和“LLM决策”的能力。Playwright本身对异步操作和稳定性支持很好,社区活跃,是优秀的底层执行器选择。对于LLM集成,初期可以先用OpenAI API快速验证想法,待流程跑通后,再评估是否要本地部署LlamaQwen模型以控制成本和保障数据安全。

3. 核心环节实现:构建一个基础的视觉-语言驱动测试智能体

理论讲完了,我们来点实际的。我将以一个经典的Web应用测试场景——“在电商网站完成登录并搜索商品”为例,拆解如何用Python构建一个最小可行产品(MVP)级别的AI测试智能体。我们会用到Playwright作为执行器,OpenCV+EasyOCR(比Tesseract对中文场景更友好)作为视觉感知模块,OpenAI GPT-4 API作为决策大脑。

3.1 环境准备与依赖安装

首先,创建一个新的Python虚拟环境并安装核心依赖。这里我们不追求大而全的框架,而是用最直接的库组合。

# 创建并激活虚拟环境(以conda为例) conda create -n ai-test-agent python=3.10 conda activate ai-test-agent # 安装基础自动化与视觉库 pip install playwright opencv-python pillow numpy # 安装EasyOCR,这是识别中文效果较好的OCR库 pip install easyocr # 安装OpenAI官方库 pip install openai # 安装Playwright的浏览器驱动 playwright install chromium

3.2 构建视觉感知模块

这个模块负责“看”屏幕,并告诉我们屏幕上有什么。我们创建一个vision_module.py文件。

import cv2 import easyocr from PIL import ImageGrab import numpy as np from typing import List, Dict import json class VisionPerception: def __init__(self): # 初始化EasyOCR阅读器,支持中英文 self.reader = easyocr.Reader(['ch_sim', 'en']) # 加载一个预训练的YOLO模型用于通用元素检测(此处以加载OpenCV DNN模型为例,实际可使用更精确的模型) # 这里简化处理,实际项目中可能需要训练自定义的UI元素检测模型 self.net = None # 预留模型加载位置 def capture_screen(self, region=None): """捕获当前屏幕或指定区域""" screenshot = ImageGrab.grab(bbox=region) if region else ImageGrab.grab() screenshot_np = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR) return screenshot_np def extract_text_and_elements(self, screen_image): """从屏幕图像中提取文本和初步的元素位置信息""" # 1. 使用OCR提取所有文本及其位置 ocr_results = self.reader.readtext(screen_image) text_elements = [] for (bbox, text, prob) in ocr_results: (top_left, top_right, bottom_right, bottom_left) = bbox x_min, y_min = int(top_left[0]), int(top_left[1]) x_max, y_max = int(bottom_right[0]), int(bottom_right[1]) text_elements.append({ "type": "text", "text": text, "bbox": [x_min, y_min, x_max, y_max], "confidence": prob }) # 2. 简单的颜色和轮廓检测来识别按钮等元素(这是一个非常基础的示例) gray = cv2.cvtColor(screen_image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5,5), 0) edges = cv2.Canny(blurred, 50, 150) contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ui_elements = [] for cnt in contours: area = cv2.contourArea(cnt) if area > 500: # 过滤太小的轮廓 x, y, w, h = cv2.boundingRect(cnt) # 计算轮廓的中心点,近似作为可点击点 center_x, center_y = x + w//2, y + h//2 ui_elements.append({ "type": "ui_element", "description": "potential_button_or_input", "bbox": [x, y, x+w, y+h], "center": [center_x, center_y] }) return { "text_elements": text_elements, "ui_elements": ui_elements, "screen_size": screen_image.shape[:2] # (height, width) } def describe_screen(self, screen_info: Dict) -> str: """将视觉信息转化为自然语言描述,供LLM理解""" description = "当前屏幕信息:\n" description += f"屏幕尺寸:宽{screen_info['screen_size'][1]}像素,高{screen_info['screen_size'][0]}像素。\n" if screen_info['text_elements']: description += "识别到的文本内容有:\n" for item in screen_info['text_elements'][:10]: # 限制数量避免上下文过长 text = item['text'] bbox = item['bbox'] description += f" - 文字“{text}”,位于区域{bbox}。\n" if screen_info['ui_elements']: description += "识别到的可能交互元素(如按钮、输入框)有:\n" for item in screen_info['ui_elements'][:10]: center = item['center'] description += f" - 一个{item['description']},中心点大约在({center[0]}, {center[1]})。\n" return description

3.3 构建LLM决策模块

这个模块是智能体的大脑,它接收测试指令和屏幕描述,然后决定下一步做什么。创建llm_agent.py

import openai import json import os class LLMAgent: def __init__(self, api_key: str, model: str = "gpt-4-turbo"): openai.api_key = api_key self.model = model # 定义系统提示词,塑造AI的“测试专家”角色 self.system_prompt = """你是一个高级软件测试自动化助手。你的任务是根据用户给出的测试步骤(用自然语言描述)和当前屏幕的详细描述,决定下一步要执行的具体操作。 当前屏幕描述会包含识别出的文字和UI元素的大致位置。 你只能输出一个JSON对象,格式必须严格如下: { "action": "click" | "input" | "assert" | "scroll" | "wait" | "complete", "target_description": "对目标元素的文字描述,例如‘登录按钮’或‘用户名输入框’", "target_type": "text" | "ui_element", // 根据屏幕描述,指出目标是文本元素还是UI元素 "value": "仅当action为input时需要的输入值", "assert_expected": "仅当action为assert时,预期的文本内容", "reason": "简短解释为什么选择这个操作" } 如果任务已经完成,请将action设置为"complete"。 注意:目标描述应尽量与屏幕描述中识别出的文本或元素特征匹配。 """ def decide_next_action(self, test_step: str, screen_description: str) -> dict: """请求LLM决策下一步操作""" user_prompt = f""" 测试步骤:{test_step} {screen_description} 请根据以上信息,决定下一步自动化操作是什么。只输出JSON。 """ try: response = openai.ChatCompletion.create( model=self.model, messages=[ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": user_prompt} ], temperature=0.1, # 低随机性,保证决策稳定 max_tokens=500 ) result = response.choices[0].message.content # 清理响应,提取JSON部分 json_start = result.find('{') json_end = result.rfind('}') + 1 if json_start != -1 and json_end != 0: result = result[json_start:json_end] action_plan = json.loads(result) return action_plan except json.JSONDecodeError as e: print(f"LLM返回的不是有效JSON: {result}") return {"action": "wait", "reason": f"LLM响应解析失败: {e}"} except Exception as e: print(f"调用LLM API失败: {e}") return {"action": "wait", "reason": f"API调用失败: {e}"}

3.4 构建执行器模块

这个模块负责把LLM的决策转化为真实的操作。我们使用Playwright来驱动浏览器。创建executor.py

from playwright.sync_api import sync_playwright, Page import pyautogui # 作为视觉定位点击的备选方案 import time class ActionExecutor: def __init__(self, page: Page): self.page = page self.vision = VisionPerception() # 复用视觉模块进行精确定位 def execute_action(self, action_plan: dict, screen_info: dict): """执行LLM决策的动作""" action = action_plan.get('action') reason = action_plan.get('reason', '') print(f"准备执行: {action}, 原因: {reason}") if action == 'click': self._handle_click(action_plan, screen_info) elif action == 'input': self._handle_input(action_plan, screen_info) elif action == 'assert': self._handle_assert(action_plan, screen_info) elif action == 'scroll': self.page.mouse.wheel(0, 300) # 简单向下滚动 time.sleep(1) elif action == 'wait': time.sleep(2) # 简单等待 elif action == 'complete': print("测试步骤完成!") else: print(f"未知动作: {action}") def _handle_click(self, action_plan: dict, screen_info: dict): target_desc = action_plan['target_description'] target_type = action_plan.get('target_type', 'text') # 方法1:优先尝试用Playwright的文本定位(更稳定) if target_type == 'text' and 'text' in target_desc.lower(): try: # 尝试通过页面文本内容定位 self.page.get_by_text(target_desc, exact=False).first.click() print(f"成功通过文本点击: {target_desc}") return except Exception as e: print(f"文本定位点击失败: {e},尝试视觉定位") # 方法2:视觉定位(兜底方案) # 从screen_info的UI元素中寻找最匹配描述的元素 target_element = None for elem in screen_info['ui_elements']: # 这里可以加入更复杂的匹配逻辑,比如描述语义相似度计算 if target_desc in elem.get('description', ''): target_element = elem break if target_element: center_x, center_y = target_element['center'] # 使用pyautogui进行基于屏幕坐标的点击(需确保浏览器窗口位置固定) pyautogui.click(center_x, center_y) print(f"通过视觉定位点击坐标: ({center_x}, {center_y})") else: print(f"未找到匹配描述 '{target_desc}' 的可点击元素。") def _handle_input(self, action_plan: dict, screen_info: dict): target_desc = action_plan['target_description'] value = action_plan['value'] # 简化处理:直接向当前活动元素输入(实际应结合视觉定位) # 更优方案是先通过_handle_click定位到输入框 pyautogui.write(value) print(f"输入文本: {value}") def _handle_assert(self, action_plan: dict, screen_info: dict): expected_text = action_plan['assert_expected'] # 检查屏幕文本中是否包含预期文本 all_text = ' '.join([item['text'] for item in screen_info['text_elements']]) if expected_text in all_text: print(f"断言成功!找到预期文本: {expected_text}") else: print(f"断言失败!未找到预期文本: {expected_text}。当前文本内容: {all_text[:200]}...")

3.5 主流程串联

最后,我们创建一个主程序main.py来串联整个流程,完成“登录并搜索”的测试。

import os from vision_module import VisionPerception from llm_agent import LLMAgent from executor import ActionExecutor from playwright.sync_api import sync_playwright def main(): # 0. 配置 OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # 请设置你的环境变量 TEST_STEPS = [ "打开浏览器并导航到电商网站登录页(假设是 https://demo.test.com/login)", "在用户名输入框中输入 ‘test_user’", "在密码输入框中输入 ‘password123’", "点击‘登录’按钮", "等待页面跳转到首页", "在首页的搜索框中输入 ‘手机’ 并按下回车进行搜索", "验证搜索结果页面是否包含‘手机’相关商品" ] # 1. 初始化模块 vision = VisionPerception() llm_agent = LLMAgent(api_key=OPENAI_API_KEY) with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 非无头模式,便于观察 page = browser.new_page() executor = ActionExecutor(page) # 2. 执行第一步:导航 page.goto("https://demo.test.com/login") time.sleep(3) # 等待页面加载 # 3. 循环执行后续AI决策的步骤 for i, step in enumerate(TEST_STEPS[1:]): # 跳过第一步导航 print(f"\n=== 执行步骤 {i+2}: {step} ===") # a. 感知:捕获并分析当前屏幕 screen_img = vision.capture_screen() screen_info = vision.extract_text_and_elements(screen_img) screen_desc = vision.describe_screen(screen_info) # b. 决策:LLM决定下一步操作 action_plan = llm_agent.decide_next_action(step, screen_desc) print(f"AI决策: {action_plan}") # c. 执行:执行器执行动作 executor.execute_action(action_plan, screen_info) # d. 等待动作执行后的反应 time.sleep(2) # 简单检查是否完成 if action_plan.get('action') == 'complete': break print("\n测试流程执行完毕。") browser.close() if __name__ == "__main__": main()

注意事项:坐标与环境的强依赖性问题上述示例中,视觉定位点击依赖于屏幕坐标,这要求测试运行时浏览器窗口的位置和大小必须固定,否则坐标会偏移导致点击错误。这是视觉自动化初期的常见坑。更健壮的做法是:始终以当前捕获的屏幕图像为基准进行元素定位和坐标计算,避免使用绝对坐标。例如,每次点击前都重新截屏,在最新的截屏中找到目标元素并计算其相对于当前窗口的坐标,再进行点击。

4. 进阶策略与关键问题深度解析

实现一个能跑通的Demo只是第一步。要让AI测试智能体真正能在项目中可用、好用,还需要解决一系列工程化和可靠性问题。

4.1 提升视觉定位的精准度与鲁棒性

基础轮廓检测误检率高,无法区分按钮和图片。我们需要更专业的UI元素检测方案。

  • 方案一:使用预训练的通用目标检测模型。例如,使用在COCO数据集上预训练的YOLOv8,虽然它不是为UI设计,但可以检测出“人”、“汽车”等,我们可以将其微调(Fine-tune)来识别“按钮”、“输入框”、“图标”等UI组件。这需要收集和标注一批UI截图数据,工作量较大但效果最好。
  • 方案二:利用现有开源UI数据集和模型。学术界和工业界已经有了一些UI检测数据集,如RICO。可以寻找基于这些数据集训练的现成模型。
  • 方案三:结合多种定位策略(混合定位)。这是最实用的策略。优先级如下:
    1. 首选:Playwright/Selenium原生定位器。如果元素有稳定的id>{ "current_page": "登录页", "interactive_elements": [ {"role": "username_input", "located_near_text": ["用户名", "账号"], "type": "input"}, {"role": "password_input", "located_near_text": ["密码"], "type": "input", "is_password": true}, {"role": "login_button", "text": "登录", "type": "button"} ], "informational_texts": ["欢迎回来", "忘记密码?"] }这样能极大减少Token消耗,并提高LLM理解的准确性。
    2. 设计动作模板库:不要每次让LLM自由发挥生成动作JSON。而是定义好一个有限的动作集合(click,input_text,select_dropdown,scroll,wait_for_element...),让LLM的任务简化为“从动作库中选择一个,并填写必要的参数(如目标元素、输入值)”。这能显著提升决策的准确性和一致性。
    3. 使用小模型或本地模型处理重复决策:对于“找到登录按钮并点击”这类简单重复决策,可以训练一个小型的分类模型或规则引擎来处理,只在遇到复杂、未知的界面状态时才调用大模型(GPT-4等)。这能大幅降低API调用成本。

4.3 处理动态内容与异步加载

现代Web应用大量使用异步加载和动态渲染,元素不会立即出现。

  • 智能等待策略:执行器不能执行完点击就立刻截屏分析。需要实现“等待状态稳定”的逻辑。例如,连续两次截屏,如果UI结构(通过关键元素的哈希或特征对比)不再发生明显变化,则认为页面已稳定。
  • LLM参与状态判断:可以让LLM判断当前页面是否加载完成。提示词如:“根据以下屏幕描述,判断页面是否处于加载中的状态(如存在加载图标、骨架屏、主要内容区域空白),还是已经加载完成可供交互?”
  • 与Playwright等待机制结合:Playwright本身有强大的等待API(如page.wait_for_selector,page.wait_for_function)。我们的AI智能体可以先生成一个等待指令(如“等待直到出现包含‘搜索结果’的文本”),再由执行器调用对应的Playwright API。

4.4 构建测试经验记忆库

让智能体越测越“聪明”。

  • 记录成功轨迹:每次成功完成一个测试步骤,就将(屏幕状态特征向量,执行的成功操作)这对数据存储起来。屏幕状态特征向量可以通过对界面截图进行编码(如使用CNN模型提取特征)得到。
  • 实现相似性检索:当遇到新界面时,计算其与记忆库中状态的特征向量相似度。如果找到高度相似的过去状态,可以直接采用历史上成功的操作,无需再询问LLM,从而提速和降本。
  • 失败分析与自修复:当操作失败(如点击后无反应),记录失败场景。智能体可以尝试备选方案(如点击另一个相似元素),或将此失败案例提交给LLM分析原因,并将分析结果和解决方案存入记忆库。

5. 常见问题、排查技巧与落地实践建议

在实际部署和运行AI测试智能体的过程中,你会遇到各种各样的问题。下面是一些典型问题及其解决思路的实录。

5.1 AI决策不稳定,每次执行的动作可能不同

  • 问题现象:同样的测试步骤和屏幕状态,LLM偶尔会输出不同的动作指令。
  • 根因分析:LLM的生成具有随机性(由temperature参数控制)。即使temperature设得很低,在复杂或模糊的指令下也可能产生分歧。
  • 解决方案
    1. 降低Temperature:如示例中设置为0.1,甚至0.01,以最大化确定性。
    2. 优化提示词:提示词必须清晰、无歧义。明确指令输出格式,并使用“必须”、“只能”等强约束性词语。在系统提示词中提供更多例子(Few-shot Learning)。
    3. 后处理与验证:对LLM的输出增加一道验证逻辑。例如,如果LLM返回的动作是click,但目标描述在屏幕描述中根本不存在,则触发重试或降级处理(如改为wait并记录警告)。
    4. 投票机制:对于关键步骤,可以调用多次LLM(如3次),取多数票决定的动作,但这会增加成本。

5.2 执行速度慢,无法满足快速测试的需求

  • 问题现象:一次操作需要经历截屏、OCR、调用LLM API、执行动作等多个环节,耗时数秒甚至十几秒。
  • 根因分析:OCR和LLM API调用是主要瓶颈。网络延迟、大模型响应速度都会影响整体耗时。
  • 解决方案
    1. 并行与异步:将截屏、OCR识别等操作与上一次的动作执行并行起来。使用异步编程(asyncio)管理整个流程。
    2. 缓存与记忆化:对于静态或变化不大的页面区域,OCR结果可以缓存。充分利用记忆库,避免相同状态的重复决策。
    3. 模型轻量化:在测试环境部署轻量级的本地OCR模型和轻量级语言模型(如TinyLlama),用于处理大量简单、重复的决策,仅将复杂场景转发给云端大模型。
    4. 设定超时与降级:为LLM调用设定严格超时(如3秒)。超时后,自动降级到基于规则的后备策略。

5.3 对复杂交互(如拖拽、滑块、画布)束手无策

  • 问题现象:测试涉及拖拽进度条、在画布上绘图等操作,视觉定位和简单点击无法完成。
  • 根因分析:基础模型缺乏对这些连续、坐标精度要求高的操作的理解和规划能力。
  • 解决方案
    1. 动作原子化:将复杂操作拆解为LLM能理解的原子动作序列。例如,“将滑块从20%拖到80%”可以拆解为:a) 识别滑块元素和轨道;b) 计算目标位置坐标;c) 执行鼠标按下、移动、释放序列。LLM负责生成这个原子序列的计划。
    2. 专用模型或脚本:为特定的复杂交互编写专用的自动化函数。AI智能体的角色变为“识别出需要执行复杂交互的场景”,然后调用这些预设的专用函数来完成。例如,识别出这是一个“图片上传”区域,就调用upload_file()函数,而不是尝试去点击“选择文件”按钮。

5.4 如何将AI测试智能体融入现有CI/CD流水线?

  • 挑战:AI测试的不确定性和较长执行时间,与CI/CD要求的快速、稳定反馈相悖。
  • 落地建议
    1. 分层测试策略:不要用AI测试替代所有自动化测试。将其定位在UI冒烟测试核心业务流程的探索性测试。单元测试、接口测试、核心功能的传统自动化测试仍应作为基础和前置关卡。
    2. 非阻塞式集成:在CI流水线中,将AI测试任务设置为异步、非阻塞的。主流水线跑完单元和接口测试后即可合并代码,AI测试在后台运行,结果通过测试报告平台(如Allure)或即时通讯工具(如钉钉、企微)异步通知。
    3. 结果分析与反馈闭环:AI测试会产生大量执行日志、截图和决策记录。需要建立看板,重点关注通过率趋势新增的失败用例以及LLM决策的置信度。将频繁失败的场景反馈给开发,优化产品UI的可测试性(如增加测试属性>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 23:20:46

Vulhub实战:Struts2 S2-061漏洞复现与OGNL注入原理剖析

1. 项目概述:从靶场到原理的深度渗透最近在整理内部安全团队的技能矩阵时,我发现很多新人对Struts2这类经典框架漏洞的理解,还停留在“用工具跑一下POC”的层面。这其实很危险,因为知其然不知其所以然,一旦遇到WAF拦截…

作者头像 李华
网站建设 2026/6/22 23:18:27

基于双层优化与蒙特卡洛树搜索的LLM智能体自主进化框架

1. 项目概述:当LLM智能体需要“进化”时最近在折腾LLM智能体(Agent)的开发,一个绕不开的核心问题就是:如何让智能体在执行复杂任务时,不仅会调用工具,还能“学会”更好地使用工具?换…

作者头像 李华
网站建设 2026/6/22 23:16:22

OWASP Top 10 2021深度解析:Web应用安全风险与实战防御指南

1. 项目概述:从“破门而入”到“守门有方”如果你刚接触网络安全,或者是一名开发者,听到“OWASP”这个词可能会觉得有点陌生,但说到“SQL注入”、“跨站脚本(XSS)”,你大概率会心头一紧。OWASP&…

作者头像 李华
网站建设 2026/6/22 23:11:30

终极指南:如何用Better BibTeX插件提升Zotero文献管理效率

终极指南:如何用Better BibTeX插件提升Zotero文献管理效率 【免费下载链接】zotero-better-bibtex Make Zotero effective for us LaTeX holdouts 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-bibtex 作为LaTeX用户,你是否曾为文…

作者头像 李华
网站建设 2026/6/22 23:07:14

TWiLight Menu++:终极任天堂DS游戏启动器与复古游戏管理解决方案

TWiLight Menu:终极任天堂DS游戏启动器与复古游戏管理解决方案 【免费下载链接】TWiLightMenu DSi Menu replacement for DS/DSi/3DS/2DS 项目地址: https://gitcode.com/gh_mirrors/tw/TWiLightMenu TWiLight Menu 是一款功能强大的开源游戏启动器&#xff…

作者头像 李华
网站建设 2026/6/22 23:06:07

AI系统五层架构:从数据契约到智能体协同的工程化实践

1. 项目概述:一场被标题误读的行业集体行动“Meta新模型要来了,但Llama 4的锅谁来接?”——这个标题像一记重锤砸在AI圈的信息流里,瞬间引爆转发。但如果你真点进去看那篇所谓“1300多位作者的联合报告”,会发现它根本…

作者头像 李华