基于LLM的智能测试框架testzeus-hercules:从Gherkin到自动化执行
2026/7/6 9:39:30 网站建设 项目流程

1. 项目概述:当LLM成为你的全能测试工程师

如果你和我一样,在软件测试领域摸爬滚打了十几年,从Selenium的脚本维护地狱,到Pytest的框架封装,再到面对现代Web应用频繁的UI变更、复杂的业务逻辑和跨平台需求,你一定会对“测试维护成本”这个词深恶痛绝。每一次产品迭代,都可能意味着成百上千行自动化测试脚本的失效,测试工程师不是在写脚本,就是在修脚本。直到我遇到了testzeus-hercules,这个号称“世界上第一个开源测试智能体”的家伙,它让我第一次觉得,让大语言模型(LLM)来当我的“全能测试工程师”,或许不再是天方夜谭。

简单来说,testzeus-hercules 是一个基于LLM驱动的自动化测试框架。它的核心思想非常直接:你不需要再编写和维护那些脆弱的、基于CSS选择器的UI自动化代码。你只需要用人类和机器都能理解的Gherkin语言(就是Given-When-Then那种)写下你的测试场景,比如“给定我在Salesforce登录页面,当我输入用户名和密码并点击登录,那么我应该看到仪表盘”。然后,把这份“需求文档”扔给Hercules,它就能像一个真正的测试工程师一样,理解你的意图,打开浏览器,找到对应的元素,执行操作,并验证结果。整个过程,你一行代码都不用写。

这听起来有点像早期的“录制回放”工具,但本质完全不同。Hercules背后是一个由多个智能体(Agent)组成的“大脑”。它有一个规划智能体(Planner Agent)负责拆解你的Gherkin步骤,理解每一步要做什么;还有一个浏览器导航智能体(Browser Navigation Agent),它装备了一整套“感官”和“动作”工具,比如get_dom_with_content_type(感知页面状态)、click(点击)、enter_text(输入文本)。LLM负责在这些工具之间做决策和调度,比如判断当前页面哪个按钮才是真正的“登录”按钮。这意味着它具备了一定的容错和自适应能力,面对一些微小的UI变化(比如按钮颜色变了,或者多了一个无关的div),它可能依然能完成任务,而不像传统脚本那样立刻崩溃。

这个项目解决的痛点非常明确:降低自动化测试的编写和维护门槛,提升测试脚本的健壮性和可读性,并能够覆盖UI、API、安全、无障碍访问(Accessibility)和视觉验证等多种测试类型。它特别适合测试那些变化频繁、逻辑复杂的B端应用(比如Salesforce、SAP等),也适合希望快速建立自动化测试能力但又缺乏资深自动化测试工程师的团队。当然,对于我这样的老手,它更像一个不知疲倦的初级测试执行工程师,我可以把重复性的、标准化的E2E测试交给它,自己则专注于更复杂的测试策略设计和探索性测试。

2. 核心架构与工作原理拆解:多智能体如何协同“思考”与“执行”

要真正用好Hercules,不能只停留在“黑盒”使用层面。理解其内部如何运作,能帮助我们在遇到问题时快速定位,甚至进行定制化扩展。它的架构核心是建立在AutoGen这个多智能体框架之上的,这是一种非常巧妙的设计。

2.1 多智能体分工协作模型

Hercules目前主要设计了两个核心智能体,它们各司其职,通过对话和工具调用来完成测试任务。

规划智能体(Planner Agent)是这个测试团队的“项目经理”或“测试分析师”。它的唯一任务就是理解你输入的Gherkin场景文件。当它拿到一个像“成功创建Salesforce新客户”这样的场景时,它不会直接去操作浏览器。相反,它会进行任务分解和规划。例如,它会将“Given I am on the Salesforce login page”分解为更底层的指令序列:可能先需要“打开浏览器”,然后“导航到salesforce.com/login”,最后“等待页面加载完成并确认到达登录页”。这个规划过程会生成一个详细的、可执行的步骤列表,并交给下一个智能体。

浏览器导航智能体(Browser Navigation Agent)则是团队的“一线执行工程师”。它接收来自规划智能体的具体指令,并拥有调用所有“工具”的权限。它的工具箱非常丰富:

  • 感知类工具(Sensing Tools):用于获取当前环境状态。例如,geturl工具告诉它当前在哪个网址;get_dom_with_content_type是它的“眼睛”,可以按需获取页面的DOM结构(可以是纯文本、仅交互元素或全部内容);input_fields能快速列出页面上所有可交互的输入框和按钮。
  • 动作类工具(Action Tools):用于与环境交互。例如,click工具点击指定元素;enter_text在输入框填入文本;openurl打开新页面。

这两个智能体之间会进行多轮对话。例如,导航智能体执行了“打开登录页”后,可能会用感知工具告诉规划智能体“当前页面标题是‘Salesforce登录’”。规划智能体据此判断“打开登录页”步骤已完成,然后发出下一条指令:“在用户名输入框中输入‘user@example.com’”。这个过程模拟了人类测试执行时的观察-思考-行动循环。

2.2 DOM蒸馏:让LLM“看”得更清楚

这是Hercules设计中一个极其关键且聪明的优化点,直接关系到测试的稳定性和LLM API调用的成本。一个现代网页的完整DOM(文档对象模型)可能包含成千上万个节点,充斥着大量与当前测试任务无关的样式、脚本和广告元素。如果直接把完整的、嘈杂的HTML扔给LLM,不仅会消耗大量Tokens(增加成本),还会让LLM困惑,难以找到关键元素。

Hercules的解决方案是DOM蒸馏(DOM Distillation)。它不会把原始HTML传给LLM,而是先对其进行“提纯”。这个过程会注入一个自定义属性(比如md)到每个DOM元素,作为唯一标识,然后根据任务类型,提取出最相关的部分:

  • 纯文本模式(Text Only):当任务只是读取信息(如验证提示消息)时,只提取页面上的可见文本,过滤掉所有HTML标签和属性。这就像给LLM一份干净的文本文档。
  • 输入字段模式(Input Fields):当任务涉及表单填写时,只提取所有可交互的元素(input, button, select, textarea等)及其关键属性(id, name, placeholder等)。这极大地简化了LLM需要处理的信息。
  • 全部内容模式(All Content):当需要全面了解页面结构时,提取所有元素,但依然是在一个结构化的、精简过的JSON格式中,比原始HTML简洁得多。

更重要的是,Hercules优先使用无障碍访问树(Accessibility Tree)而非原始DOM作为蒸馏的源头。无障碍树本就是为屏幕阅读器等辅助技术设计的,它天然地更关注于页面的语义结构和可交互性,过滤掉了大量纯装饰性的元素。这使得蒸馏后的结果更贴近“用户实际感知到的页面”,从而让LLM的决策更准确。

2.3 工具库与函数调用:智能体的“肌肉”与“反射”

智能体的能力完全由其可用的工具决定。Hercules的工具设计遵循“原子化”和“描述性”原则。每个工具都是一个独立的Python函数,使用@tool装饰器标记,并附有清晰的名称和描述。例如,click工具的描述会明确说明它用于“点击一个由CSS选择器指定的元素”。当规划智能体决定要执行一个点击操作时,它会生成一个符合LLM函数调用规范的请求,导航智能体接收到后,就会调用对应的click函数。

LLM(如GPT-4o)的强大之处在于,它能根据当前页面蒸馏后的描述和工具的功能描述,动态生成合适的CSS选择器。它可能不会用#loginBtn这样脆弱的ID选择器,而是生成像button:has-text('Log In')[data-testid='submit-button']这样更具语义和鲁棒性的选择器。即使UI微调导致ID变化,只要按钮文本或测试属性没变,测试依然能通过。

实操心得:理解工具调用的开销每一次工具调用(如获取DOM、点击)都意味着一次LLM的推理和一次API调用。因此,编写Gherkin场景时,应尽量保持步骤的原子性和清晰度。一个模糊的步骤可能导致智能体进行多次不必要的感知-决策循环,增加成本和执行时间。好的Gherkin应该像给一个新手测试员写检查单一样,指令明确、无歧义。

3. 从零开始实战:搭建你的第一个Hercules测试环境

理论讲得再多,不如亲手跑一遍。下面我将带你从零开始,用最常用的PyPI安装方式,搭建一个Hercules测试环境,并运行你的第一个测试用例。我会假设你是在一个干净的Linux/macOS开发环境或Windows WSL2下操作。

3.1 环境准备与安装

首先,确保你的系统已安装Python 3.11或更高版本。强烈建议使用虚拟环境来隔离依赖。

# 1. 创建并激活虚拟环境 python3.11 -m venv hercules-env source hercules-env/bin/activate # Windows: hercules-env\Scripts\activate # 2. 通过PyPI安装testzeus-hercules pip install testzeus-hercules

安装过程会拉取Hercules核心包及其依赖,包括AutoGen、Playwright等。接下来,需要安装Playwright所需的浏览器二进制文件。这一步是必须的,因为Hercules底层依靠Playwright来控制浏览器。

# 3. 安装Playwright浏览器(Chromium, Firefox, WebKit) playwright install --with-deps chromium # 通常只需Chromium即可

--with-deps参数会同时安装浏览器运行所需的一些系统依赖库,在Linux上尤其重要。

3.2 项目结构与配置文件初始化

Hercules需要一个清晰的项目目录结构来存放测试用例、测试数据和输出结果。我们手动创建这个结构,这比使用--project-base参数更直观,便于理解文件流向。

# 4. 创建项目目录结构 mkdir -p my_hercules_project/{gherkin_files,input,output,log_files,proofs,test_data} cd my_hercules_project

关键目录说明:

  • input/: 存放你的Gherkin格式(.feature)测试用例文件。
  • test_data/: 存放测试用例可能用到的外部数据文件,如CSV、JSON。
  • output/: Hercules运行后生成的JUnit XML格式测试报告和HTML报告。
  • proofs/:非常重要的目录,存放测试执行的“证据”,包括每一步的截图、录屏和网络日志。这是Hercules“精确断言”理念的体现,任何测试失败你都有可视化证据回溯。
  • log_files/: 存放详细的JSON格式日志,包括智能体之间的对话(chat_messages.json),用于深度调试。

接下来,配置LLM。Hercules默认使用OpenAI的GPT-4o模型,你需要准备一个API Key。创建一个配置文件:

# 5. 创建并编辑环境变量配置文件 cp $(python -c "import testzeus_hercules; import os; print(os.path.dirname(testzeus_hercules.__file__))")/../.env-example .env

编辑.env文件,至少设置以下关键变量:

# .env 文件内容示例 LLM_MODEL=gpt-4o LLM_MODEL_API_KEY=sk-your-openai-api-key-here # 浏览器运行模式,调试时可设为false看到浏览器界面 HEADLESS=true # 是否录制视频,建议开启用于回溯 RECORD_VIDEO=true # 是否截图 TAKE_SCREENSHOTS=true

注意事项:LLM模型的选择与成本虽然GPT-4o效果最好,但它的API调用成本也最高。对于简单的测试场景,可以尝试使用gpt-4o-mini(但注意官方文档提示它仅适用于子智能体)。如果追求低成本或数据隐私,可以配置agents_llm_config.json文件来使用本地部署的Ollama(需70B以上参数模型)或通过LiteLLM代理连接其他模型(如Anthropic Claude Haiku)。初次体验建议先用GPT-4o,以确保功能正常。

3.3 编写并运行第一个Gherkin测试用例

现在,让我们创建一个最简单的测试用例,验证Hercules的基本工作流。在input/目录下创建一个google_search.feature文件。

# input/google_search.feature Feature: Google Search Basic Functionality Scenario: User can search by keyword and see results Given I open the URL "https://www.google.com" When I enter text "testzeus hercules" in the search box And I press the "Google Search" button Then I should see text containing "Hercules" on the page

这个用例描述了:打开谷歌首页,在搜索框输入“testzeus hercules”,点击搜索按钮,然后验证结果页面是否包含“Hercules”这个词。

运行这个测试!在项目根目录(my_hercules_project)下执行:

# 6. 运行Hercules testzeus-hercules --input-file input/google_search.feature --output-path output --test-data-path test_data

第一次运行可能会稍慢,因为需要初始化智能体和加载模型。如果一切正常,你将看到终端开始滚动日志,一个Chromium浏览器(无头模式)会在后台启动并自动执行上述步骤。执行完成后,查看输出:

  • output/google_search.feature_result.xml: JUnit格式报告,可用于集成到Jenkins、GitLab CI等CI/CD平台。
  • output/google_search.feature_result.html: 更友好的HTML报告,展示了每个步骤的执行结果(通过/失败)。
  • proofs/目录下会生成以场景命名的文件夹,里面包含了整个操作过程的视频(.webm格式)以及每个关键步骤的截图。
  • log_files/chat_messages.json: 这个文件最有价值,它完整记录了规划智能体和导航智能体之间的对话、思考过程和工具调用记录。如果测试失败,这是你排查问题的第一手资料。

3.4 Docker部署:更适合CI/CD的规模化运行

对于希望在持续集成流水线中运行Hercules的团队,Docker是更干净、更一致的选择。Hercules提供了官方Docker镜像。

# 1. 拉取镜像 docker pull testzeus/hercules:latest # 2. 准备宿主机目录结构(与之前相同) mkdir -p hercules_docker/{input,output,test_data,proofs,log_files} # 将你的 .env 和 .feature 文件放入对应目录 cp .env hercules_docker/ cp input/google_search.feature hercules_docker/input/ # 3. 运行Docker容器 docker run --env-file=hercules_docker/.env \ -v $(pwd)/hercules_docker/input:/testzeus-hercules/opt/input \ -v $(pwd)/hercules_docker/output:/testzeus-hercules/opt/output \ -v $(pwd)/hercules_docker/test_data:/testzeus-hercules/opt/test_data \ -v $(pwd)/hercules_docker/proofs:/testzeus-hercules/opt/proofs \ -v $(pwd)/hercules_docker/log_files:/testzeus-hercules/opt/log_files \ --rm -it testzeus/hercules:latest

Docker模式会自动使用/testzeus-hercules/opt作为内部的项目根目录,因此我们通过-v参数将本地目录挂载进去。运行后,所有产出物都会出现在你本地的hercules_docker相应子目录下。

避坑指南:Docker中的浏览器与CDP连接默认情况下,Docker容器内的Hercules使用纯无头(headless)浏览器,无法显示界面。如果你需要连接到一个有界面的浏览器进行调试,或者使用BrowserStack、LambdaTest等云测平台,就需要配置CDP_ENDPOINT_URL环境变量。例如,连接到一个本地正在运行的、开启了远程调试端口的Chrome实例:CDP_ENDPOINT_URL=ws://localhost:9222/devtools/browser/...。这在调试复杂交互问题时非常有用。

4. 高级功能与定制化:超越基础UI自动化

Hercules不仅仅是一个UI点击工具。它的“多智能体”和“工具扩展”架构,使其能够轻松集成更复杂的测试类型和自定义逻辑。

4.1 集成安全与无障碍测试

这是Hercules宣称的“全能测试”能力的重要体现。它通过集成外部工具来实现非功能测试的自动化。

安全测试(集成Nuclei):Nuclei是一个强大的漏洞扫描工具。Hercules可以在执行UI流程的过程中或之后,调用Nuclei对当前应用进行安全扫描。你只需要在Gherkin步骤中引入相应的步骤,例如When I run a security scan for OWASP Top 10 vulnerabilities(这需要你预先定义好对应的工具或步骤)。扫描结果会生成报告,并与功能测试报告整合。这对于在CI流水线中快速进行基础安全检测非常有用。

无障碍测试(Accessibility Testing):Hercules内置了对WCAG(Web内容无障碍指南)标准的支持。你可以在.env文件中配置要检查的标准级别(如WCAG 2.1 AA),然后在Gherkin场景中加入验证步骤,例如Then the page should be accessible according to WCAG 2.1 AA。Hercules会使用类似axe-core的引擎(集成在工具中)对页面进行分析,并报告违反无障碍准则的问题,比如图片缺少alt文本、颜色对比度不足等。这对于需要满足合规性要求的项目至关重要。

4.2 Hypermind:注入自定义Python逻辑的“超脑”

这是Hercules最强大的扩展能力之一。当内置的原子化工具无法满足某些复杂操作时(比如处理一个自定义的图表组件、执行特定的数据计算、调用内部API),你可以通过Hypermind功能直接注入Python代码。

其原理是,Hercules启动了一个安全的、多租户的Python沙箱。你可以在opt/scripts/目录下编写自己的Python函数,然后在Gherkin步骤中直接调用它。这个沙箱函数能获得完整的Playwrightpage对象、浏览器上下文等,几乎拥有和原生Hercules工具一样的能力。

实战示例:处理一个动态过滤的复杂表格假设你的应用有一个产品列表,用户可以通过一个复杂的、包含多个下拉框和输入框的筛选器来过滤产品。用标准的Gherkin步骤描述会非常冗长且脆弱。这时,可以编写一个Hypermind脚本。

  1. 创建Python脚本(opt/scripts/filter_products.py):
import asyncio import json from typing import Dict, Any async def apply_advanced_filter(category: str, price_range: str, in_stock: bool) -> Dict[str, Any]: """ 应用高级筛选器到产品列表。 Args: category: 产品类别,如 'Electronics' price_range: 价格区间,如 '100-500' in_stock: 是否仅显示有库存 Returns: 包含筛选状态和结果数量的字典。 """ # `page` 对象由Hercules沙箱自动注入 logger.info(f"开始应用筛选: category={category}, price_range={price_range}, in_stock={in_stock}") # 1. 选择类别 await page.select_option('select#product-category', value=category) # 2. 填写价格区间(假设是两个输入框) min_price, max_price = price_range.split('-') await page.fill('input#price-min', min_price) await page.fill('input#price-max', max_price) # 3. 勾选“仅显示有库存”复选框 if in_stock: await page.check('input#in-stock-only') # 4. 点击应用按钮 await page.click('button#apply-filter') await page.wait_for_selector('.product-item', state='visible', timeout=10000) # 5. 计算筛选后的产品数量 product_count = await page.locator('.product-item').count() logger.info(f"筛选完成,找到 {product_count} 个产品") return { "status": "success", "filter_applied": {"category": category, "price_range": price_range, "in_stock": in_stock}, "products_found": product_count }
  1. 在Gherkin中调用
Feature: Product Catalog Filtering Scenario: Filter products using custom Hypermind script Given I am logged in as an admin user And I navigate to the product management page When I execute the hypermind script "filter_products.py" with parameters category as "Electronics", price_range as "100-500", in_stock as true Then the script execution status should be "success" And I should see more than 5 products listed

通过When I execute the hypermind script ...这个特殊的Gherkin步骤,Hercules会定位并执行你定义的apply_advanced_filter函数,并将返回值用于后续的断言。这极大地扩展了测试场景的边界,让你能用代码解决任何复杂交互。

安全警告:Hypermind沙箱权限Hercules的沙箱支持多租户隔离模式(Executor, Data, API, Restricted)。在.env中通过SANDBOX_TENANT_ID配置。默认的executor_agent模式权限很高,可以导入requests,pandas等库。在生产环境中,对于不受信任的脚本,应使用更严格的restricted模式,限制网络访问和文件系统操作。

4.3 MCP集成:连接外部工具与数据源

模型上下文协议(Model Context Protocol, MCP)是另一个前沿特性。它允许Hercules的智能体与外部服务器通信,从而获取额外的工具或数据。例如,你可以通过MCP连接到一个数据库服务器,那么Hercules就获得了直接执行SQL查询的工具;或者连接到一个邮件服务器,从而在测试中读取验证码邮件。

配置MCP需要在项目根目录创建mcp_servers.json文件,并在.env中启用。这为Hercules融入你现有的技术生态(如内部API、CRM系统、监控平台)打开了大门,使其真正成为一个中心化的自动化工作流执行引擎。

5. 实战中的挑战、调优与问题排查

在实际项目中大规模应用Hercules,你会遇到一些典型挑战。下面是我踩过的一些坑以及总结的调优经验。

5.1 挑战一:测试稳定性与“脆弱的”LLM决策

尽管DOM蒸馏和智能工具调用提高了稳定性,但LLM毕竟不是人类,它的决策可能受到页面内容微小变化或提示词(Prompt)设计的影响。测试偶尔会失败,不是因为功能坏了,而是因为LLM“理解”错了。

解决方案与调优技巧:

  1. 优化Gherkin步骤描述:描述要具体、唯一。避免使用“点击那个按钮”,而要用“点击文本为‘提交订单’的按钮”或“点击ID为‘submit-order-btn’的按钮”。可以结合页面元素的>问题现象可能原因排查步骤与解决方案测试启动失败,提示LLM连接错误1. API Key错误或过期。
    2. 网络问题。
    3. 所选模型在当前区域不可用。1. 检查.env中的LLM_MODEL_API_KEY
    2. 运行curl命令测试OpenAI API连通性。
    3. 尝试更换模型或API端点(LLM_MODEL_BASE_URL)。浏览器无法启动或白屏1. Playwright浏览器未正确安装。
    2. Docker中缺少显示驱动(无头模式则无此问题)。
    3. 代理或防火墙阻止。1. 重新运行playwright install chromium --with-deps
    2. 在Docker中确保使用HEADLESS=true,或正确配置CDP_ENDPOINT_URL连接外部浏览器。
    3. 检查系统代理设置。智能体卡在某个步骤,不断重复或报“找不到元素”1. 页面加载慢,元素未出现。
    2. DOM蒸馏失败,关键元素被过滤。
    3. LLM生成的CSS选择器不准确。1. 查看proofs/中该步骤的截图,确认页面状态。
    2. 检查log_files/chat_messages.json,看智能体“看到”的DOM是什么,是否缺少目标元素。
    3. 在Gherkin步骤中提供更精确的元素描述,或为元素添加>测试通过,但实际功能有问题(误报)1. 断言过于宽松。
    2. LLM错误地“认为”它看到了预期文本。1. 强化断言,使用更精确的文本匹配或元素存在性检查。
    2. 在Then步骤中,使用I should see the exact text "..."而非... text containing ...
    3. 结合Hypermind脚本,在关键步骤后添加自定义的JavaScript验证逻辑。执行速度异常缓慢1. LLM响应慢。
    2. 页面本身响应慢。
    3. 使用了all_content等重型蒸馏模式。1. 检查LLM服务的状态和延迟。
    2. 在.env中设置PAGE_LOAD_TIMEOUT等超时参数。
    3. 分析日志,看哪一步耗时最长,优化该步骤的描述或改用更轻量的工具。Docker中测试失败,但本地成功1. Docker容器资源(CPU/内存)不足。
    2. 容器与宿主机时间不同步。
    3. 挂载的目录权限问题。1. 为Docker容器分配更多资源。
    2. 确保容器使用宿主机的时区-e TZ=Asia/Shanghai
    3. 检查proofslog_files目录是否被成功写入。

    5.4 与现有测试框架的融合策略

    你不需要一夜之间用Hercules替换掉所有的Selenium或Playwright脚本。一个更稳妥的策略是渐进式引入

    1. 新功能测试:为新开发的功能直接编写Gherkin用例,用Hercules实现自动化。这避免了为旧框架编写和维护新脚本。
    2. 复杂业务流程测试:将那些最令测试工程师头疼的、涉及多个页面和复杂状态的端到端业务流程,用Hercules重构。它的意图驱动特性在这里优势明显。
    3. 作为现有脚本的补充:在CI流水线中,可以先运行快速的单元测试和API测试,然后让Hercules执行一组关键的、高价值的E2E场景测试,作为发布前的最终验收门禁。
    4. 测试数据生成与准备:利用Hercules的Hypermind能力,编写脚本登录后台,创建测试所需的复杂数据(如配置一个完整的营销活动),作为传统测试数据准备方式的有力补充。

    从我个人的实战经验来看,Hercules代表了测试自动化向“意图驱动”和“自适应”方向迈进的重要一步。它不能解决所有问题,比如对极度动态、图形化(Canvas)或客户端渲染极其复杂的单页应用,其稳定性仍有待观察。但它确实将我们从无穷无尽的定位器维护中解放出来了一大步,让测试工程师能更专注于设计测试场景和验证业务逻辑,而不是调试div#id > ul:nth-child(3) > li是否还能用。它的开源特性也意味着社区可以不断为其添加新的工具和适配器,生态会越来越丰富。如果你正在为现代Web应用的测试维护成本而苦恼,花上半天时间体验一下Hercules,它很可能会改变你对自动化测试的认知。

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

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

立即咨询