ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

e2e Bug Bash 实战指南:并行 explore 章程、缺陷分流与复现测试验证

e2e Bug Bash 实战指南:并行 explore 章程、缺陷分流与复现测试验证 测试测试智能体人工智能浏览器控制CLI【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址https://gitcode.com/GitHub_Trending/e2e6/e2e点击查看免费下载导读本指南以仓库内技能文档 bug-bash.md 为核心讲解如何在 e2e 框架中组织一次完整的 Bug Bash把一次探索拆成多个并行的e2e explore章程charter每个章程针对一个区域、一种姿态最终通过“缺陷分流 复现测试”把每个候选缺陷证明为确认的 bug或驳回的误报。读完本文你将掌握从准备工作、章程规划、并行派出、结果合并、分流、验证到报告的七阶段完整流程并理解report_finding工具、run.explore报告结构与探索预算在 explore 源码 中的实现原理。什么是 Bug BashBug Bash 的定义很简洁同时发起多个e2e explore运行每个运行一个章程然后在验证阶段把每一个声称的缺陷改写成一个会因该缺陷而失败的复现测试。完整流程是规划章程Plan the charters并行派出Fan them out合并发现Merge the findings证明每个 bugProve each bug最终只报告确认的缺陷且每个缺陷都附带一个失败的复现测试。它既不是跑一遍测试套件也不是让一个 Agent 全应用乱逛一次 Bug Bash 是许多次目标明确的探索 一轮严格的证伪。第 1 步准备Prepare准备阶段决定整场 Bug Bash 的成败。文档列出以下关键点。1.1 配置与认证需要一个包含 target 和持有模型的 agent 的配置主题见 setup.md并为模型提供方配置好认证。配置中必须满足e2e explore的最低要求有 target、有带模型的 agent仅此即可。1.2 让应用同时服务多个探索者一次 Bug Bash 有多个探索者并发访问应用必须保证应用能同时服务多个会话启动一次、复用进程在 target 的app.command上设置reuseExisting: true或端口 0 自由分配把 URL 声明为端口0让每次运行自己启动应用并占用一个空闲端口。关键陷阱reuseExisting在设置了CI时会被忽略很多 Agent 沙箱都设了CI此时要么用端口0要么取消设置CI。一个固定端口如果既不复用、又被多个探索者抢占那么除第一个外的所有运行都会失败。自带技术栈的命令要格外小心如果app.command会拉起一整套栈例如一个随进程退出而创建/删除的数据库那么第一个结束的探索者就会把数据库从其余探索者脚下抽走。正确做法是你自己用配置里的命令和环境把栈启动一次然后用一个不声明 command的 Bug Bash 配置去探索下面会给出该配置。优先探索生产构建如果项目有生产构建用它。开发服务器首次访问某路由时才编译的行为会被探索者误读成死链。每个章程一个一次性工作区/用户用项目自己的 fixtures 或 seed 脚本播种数据并把每个账号声明为一个凭据命名为bb-slug。共享账号的探索者会把彼此的编辑报告成 bug。1.3 登录态与上下文约束从已保存的会话开始登录章程e2e explore --session name会先运行保存该会话的 setup 测试然后以登录状态探索详见 explore.md。注意如果 setup 通过输入密码登录此后探索的截图会被打码扣留用 cookie 或 API 调用登录则保留截图详见 writing-tests.md。每个拥有独立账号的章程都需要自己的 setup 和 session。把本地应用做不到的事写进 agent 的context没有 key 的集成、哪些是 seed 数据、绝不能点的东西付费运行、真实账号。还要加入第 5 步分流出的探索者盲区清单下面的配置里直接内置了一句示例不加这些盲区这类家族新标签页、无限滚动、懒加载图片等会霸占整份发现清单。1.4 对已部署站点的只读约束如果 Bug Bash 针对的是别人在用的线上站点则必须是只读的不注册、不登录、不提交URL 里不做注入形状的操作不发请求循环。注意WAF 拦截是防火墙在正常工作不是发现而且它可能跟随运行者的 IP 进入后面每一个章程。1.5 预算与引擎参数每个探索步骤需要 40 或更多的maxSteps和maxModelCalls按测试步骤调优的配置maxSteps: 15会让探索者饿死。注意这是每一步的预算与--max-steps计算一个章程的步数是两回事。移动端 target每个设备声明一个 target给每个探索者和验证者各自的 target主题见 setup.md。跳过--headed。在能录制的引擎上--video会为每个确认的 bug 留下一份可回放的录像。1.6 Bug Bash 专属配置文档给出一个典型的e2e.bugbash.config.ts。它通常不被纳入版本控制因为里面展开了项目配置并覆盖了 Bug Bash 所需的设置。把导入类型写成E2EConfig可以让shared.tests和shared.credentials在基础配置两者都不声明时依然能编译// e2e.bugbash.config.ts import type { E2EConfig } from e2e; import { web } from e2e-dev/web; import { gateway } from ai; import base from ./e2e.config.ts; const shared: E2EConfig base; // What the local app cannot do, plus the explorers blind spots (step 5s artifact bucket). const context Sign in with the credential the goal names. The local app sends no email and has no AI key. Never start a paid run or connect an integration. Not bugs: a link that opens a new tab leaves this one unchanged; accessible text splits around inline links, so judge copy by the rendered screen when a screenshot is available and never report split text alone as broken copy; an infinite-scroll Loading more sentinel loads when scrolled into view; images lazy-load, so scroll and wait before calling one blank.; const persona { model: gateway(openai/gpt-6-luna-fast), maxSteps: 40, maxModelCalls: 40, context }; export default { ...shared, // The projects tests, so a repro can use its setup tests sessions, plus the repro tests from step 6. tests: [shared.tests ?? tests/**/*.e2e.ts, tests/bugbash/**/*.e2e.ts].flat(), // The app already runs: no command. targets: [{ name: web, engine: web(), app: { url: http://127.0.0.1:3000 } }], retries: 0, reporters: [list], credentials: { ...shared.credentials, // The seed scripts password, from the environment rather than the file. bb-cart: { username: bb-cartexample.test, password: process.env.BUGBASH_PASSWORD ?? }, bb-account: { username: bb-accountexample.test, password: process.env.BUGBASH_PASSWORD ?? }, }, // The postures from step 2 as personas: same model and budgets, a different stance; each charter picks one with --agent (step 3). agents: { default: persona, skeptic: { ...persona, system: Distrust every number, date, count, and claim on screen; cross-check each against every other place it appears. }, fuzzer: { ...persona, system: At every input, run the goals input matrix before anything else, judging each entry before the next. Never take the happy path. }, }, } satisfies E2EConfig;配置要点tests合并了项目原有测试与tests/bugbash/**/*.e2e.ts这样复现测试可以复用项目 setup 测试保存的会话target 只声明url、不声明command因为应用已在第 1.2 节由你手动启动retries: 0探索是单次尝试重试模式无意义凭据密码来自环境变量而非文件process.env.BUGBASH_PASSWORD ?? 符合凭据不入库的规范setup.md第 2 步规划的姿态以 persona 形式落地skeptic怀疑一切数字与文案、fuzzer每个输入都先跑输入矩阵由每个章程用--agent挑选。启动前必须先把BUGBASH_PASSWORD设为 6 个或更多字符否则配置加载失败静态密码长度校验见 setup.md 中credentials的 6 code points 规则。之后对下面所有命令都传--config e2e.bugbash.config.ts并通过 MCP 传open_session {config: e2e.bugbash.config.ts}详见 mcp.md。第 2 步规划章程Plan charters一个章程就是一条e2e explore目标一个区域、一种姿态、一句话写明起始路由必要时写明凭据例如Sign in as credential bb-cart. Starting at /cart, ...。动手前先读路由、导航和表单如果是分支用git diff --stat对比基线。文档给出五种姿态的章程模板姿态章程形态First-time userStarting at /signup, sign up and complete onboarding like a first-time user; report anything confusing, broken, or inconsistentNumbers and copyStarting at /cart, change quantities and apply a coupon; check every price, total, and label against the rest of the pageEdge inputStarting at /settings/profile, submit each field empty, too long, with unicode and with leading spaces; report validation that is missing or wrongStateStarting at /projects, create, rename, and delete a project, reloading and going back after each; report state that is lost or staleError pathsStarting at /login, try a wrong password, an unknown account, and a locked account; report errors that are missing, misleading, or leak detail目标数量五到十个章程每个有自己的 slug。重叠是允许的——重复项会在第 4 步合并。每个姿态要匹配一个 persona上面配置中的 agent 定义在第 3 步按章程挑选普通 agent 会径直走过某页一个统计数字与另一页自相矛盾的现场而 skeptic 能抓住它。边缘输入类章程必须点名它的精确矩阵空值、300 字符字符串、unicode、前导空格、字面特殊字符否则它会把整个时间预算花在矩阵上而没判断出任何一条结果。第 3 步并行派出Fan out每个章程一条e2e explore命令配独立输出目录--output .e2e/bugbash/slug会写入report.json和results/--reporter list,markdown额外生成summary.md。注意 git 痕迹e2e init只忽略特定的.e2e/路径不会忽略.e2e/bugbash/。要么把它加进.gitignore要么结束后删除开始下一场 Bug Bash 前务必先删掉旧的。charters.txt及其下的日志归你所有其余是 runner 的输出只读。用shell 后台任务并行跑四个一批不要用 subagent。每行一个章程格式为slug|target|agent|charteragent 一栏填写 persona 名然后用xargs -0 -P是 GNU 和 BSD 扩展macOS 和 Linux 都有mkdir -p .e2e/bugbash cat .e2e/bugbash/charters.txt CHARTERS cart|web|skeptic|Starting at /cart, change quantities and apply a coupon; check every price, total, and label against the rest of the page account|web|fuzzer|Starting at /settings/profile, submit each field empty, a 300-character value, unicode, and leading spaces; report validation that is missing or wrong CHARTERS while IFS| read -r slug target agent charter; do [ -n $slug ] printf %s\0%s\0%s\0%s\0 $slug $target $agent $charter done .e2e/bugbash/charters.txt | xargs -0 -n 4 -P 4 sh -c \ npx e2e explore $4 --config e2e.bugbash.config.ts --target $2 --agent $3 --output .e2e/bugbash/$1 --max-steps 6 --video --reporter list,markdown /dev/null .e2e/bugbash/$1.log 21 _日志的摘要会打印AI成本和Duration。退出码1表示报告了 issues——无论哪种情况都要读日志退出码2和3是 setup 和环境问题修复后单独重跑那个章程即可。从源码看这些预算参数有明确的上下界STEP_BOUNDS为 1 到 12、默认 8TIMEOUT_BOUNDS为 180000 到 900000 毫秒、默认 600000见 explore/index.ts。一次探索在超预算、步数上限、时钟耗尽或连续三个失败/阻塞步骤后结束详见 explore.md 的一次运行做了什么。第 4 步合并Merge读取每个日志的Findings部分主题见 explore.mdsummary.md内容相同report.json中的完整记录在run.explore下。录像位于.e2e/bugbash/slug/results/下该 attempt 的video/目录。合并描述同一缺陷的发现同路径、同损坏行为。保留最清晰的重现步骤和所有命中它的章程。警告单独列表存放除非用户明确要求打磨项。一个值得警惕的场景某个章程填过密码、或其会话的 setup 填过密码则从那时起不再打印evidence行。但其录像不会被打码分享前要检查录像里有没有机密主题见 writing-tests.md 的 Sign-in sessions——一旦填充了 secret模型像素与断言截图会从此扣留只有browser.setCookies这类不填密码的登录方式能保留截图。合并环节的源码视角run.explore记录探索的状态机实现在 explore/state.tsExploreState持有 goal、budgets、steps、findings其快照就是报告中的run.explore。每条自由文本都被裁剪到 schema 规定的上限state.ts 顶部常量标题MAX_TITLE_CHARS 200指令MAX_INSTRUCTION_CHARS 2_000摘要MAX_SUMMARY_CHARS 4_000expected/actual 细节MAX_DETAIL_CHARS 2_000复现步骤最多MAX_REPRODUCTION_STEPS 20条、每条MAX_REPRODUCTION_CHARS 500路径MAX_PATH_CHARS 2_048run.explore记录结构如下见 explore.md{ goal: ..., budgets: { maxSteps: 8, timeoutMs: 600000 }, ended: finished | step-limit | time | stuck | aborted, summary: the closing assessment, steps: [{ index: 1, title: ..., instruction: ..., status: passed | failed | blocked | exhausted, summary: ..., errorCode: ..., startedAt: ..., durationMs: 0 }], findings: [{ id: uuid, index: 0, step: 1, kind: issue, severity: 4, title: ..., expected: ..., actual: ..., reproduction: [...], path: /cart, observationRevision: ..., artifactId: attempt id:artifact:2, reportedAt: ... }] }步骤仅在未通过时带errorCodefinding 仅在已知时带step、path、observationRevision、artifactId。artifactId指向 attempt 的artifacts中file为explore的证据截图。列表报告器会实时打印每条 finding格式为⚑ high issue Title (/path)并依据严重度着色见 list-explore.ts严重度词汇为 critical 5、high 4、medium 3、low 2、trivial 1。终局Findings区按issues 优先、严重度高者优先排列每条带路径、截图路径、expected vs actual 与复现步骤。第 5 步分流Triage在写任何测试之前先给每条发现分类。读源码来分类这是文档反复强调的纪律。分流桶如下桶标志结果Explorer artifact死了的target_blank链接其目标在弹窗捕获或直接导航时其实能打开、截图中完整呈现却被判为坏句的文案、没人滚动到的 Loading more 哨兵、懒加载的图片或嵌入用那条裁决它的检查驳回最先处理这个桶。目标从未打开的新标签页链接仍保留为候选Environment失败只因本地栈缺少某个 key、服务或限额邮件服务商、AI key、计费套餐驳回并点名变量或服务若应用以生产用户会看到的方式处理失败不当如暴露原始错误则另行记录Design代码、测试或文案表明该行为是有意为之驳回并引用出处Fixtureseed 数据缺少真实记录总有的字段驳回并点名字段Candidate以上都不是进入第 6 步验证注意分流必须先于写测试进行否则会把大量时间浪费在证明注定要驳回的 artifact 类误报上。第 6 步验证Verify一条 finding 只是模型的声称报告它之前必须证明每个候选。如果你的客户端能启动 subagent例如 Claude Code 的 Agent 或 Task 工具按区域各起一个带上日志打印的三到五条候选和这些步骤四个一批e2e mcp服务器默认 4 个会话上限见 mcp.md。每个 subagent 按 finding 回报confirmed 或 rejected、能读源码时的根因file:line格式、复现测试路径、以及它看到的失败。没有 subagent 就一个区域一个区域地验证。验证分四步把actual对照截图读一遍无截图看录像。证据与发现矛盾就在这里驳回。先处理 artifact 桶死链的目标必须真的打不开才算数有合法 href 但preventDefault阻止的仍是死链文案声称必须出现在渲染截图里。写复现测试跟随复现步骤、断言预期行为使它在今天失败、bug 修复后通过。放在配置testsglob 覆盖的目录下的bugbash/里默认即tests/bugbash/slug.e2e.ts——glob 匹配不到的文件永远不会被选中无论你往e2e run传什么路径。基于项目 fixtures 构建test.extendfixture、setup 测试的会话见 writing-tests.md。优先用screen动作和带精确值的expect对会变化的步骤用agent.act对只有判断力能确认的结果用agent.assert。测试加{ tags: [bugbash] }。从活应用拿精确 locator注册e2e mcp服务器后用 Bug Bash 配置open_session把会话 id 传给每次调用走一遍复现写 locator 前先用locate验证主题见 mcp.md。用完关闭会话。单独运行该文件npx e2e run tests/bugbash/slug.e2e.ts。只有它因编码了该 bug 的断言报出ASSERTION_FAILED才算确认。任何其他失败LOCATOR_NOT_FOUND、超时、setup 错误都说明测试写错了修好重跑。测试通过则说明 bug 没有复现驳回该发现、说明理由并把测试移出tests/bugbash/移到.e2e/bugbash/extra-tests/或提议作为回归测试。只有失败的复现测试可以留在这里。从实现看报告 finding是探索者独有的一枚工具report_finding常量FINDING_TOOL_NAME见 explore/executor.ts它只在e2e explore下挂载见 action-names.ts。而规划下一步的 planner 是以agent.extract步骤运行的一次结构化模型调用读取 goal、此前的步骤与当前屏幕用 schema 校验输出step | finish二选一的决策title 具体章程指令 / 收尾评估见 explore/plan.ts。复现测试要断言的预期行为恰好可以取自 finding 的reproduction步骤与expected字段——文档明确说把 finding 变成测试reproduction步骤就是agent.act()指令或screen.*动作expected就是断言。第 7 步报告Report报告以已确认的 bug 开头最严重的排最前。每个 bug 包含标题路径一行 expected vs actual已知时的根因步骤截图与录像路径复现测试发现它的章程之后按顺序是构成生产风险、标记为未验证的环境类候选→按原因分组environment、design、fixture、did not reproduce的驳回发现→警告。最后列出跑过的章程、它们的成本、以及没有章程覆盖到的区域。复现测试在 bug 修复前一直是失败的如果项目的testsglob 覆盖了tests/bugbash/其门禁运行要用npx e2e run --exclude-tag bugbash把它们排除或者让它们保持未提交。提议修复每个 bug复现测试变绿就是证明修复后它作为回归测试留在项目里并去掉bugbash标签。规则绝不把未验证的发现报告为 bug。探索者报告的不是确认的。一个章程一个区域。横跨整个应用的章程会在步数预算耗尽时什么都只蹭了一遍。应用为开发而自带的 seed 数据和测试账号不是 bug在 agent 的context里说明这一点。把项目的文件保持原样Bug Bash 配置、seed 脚本和复现测试在用户另有要求前保持未跟踪用户结束后停掉你启动的栈。小结Bug Bash 的关键心法预算饥饿是最大的隐性失败探索者每一步需要 40 以上的maxSteps/maxModelCalls与测试步骤的预算完全不同。上下文塑造探索者把本地做不到的事和探索者盲区写进context否则 artifact 家族会淹没发现。验证先于报告只有ASSERTION_FAILED于编码该 bug 的断言才叫确认通过就是驳回。复现测试是 bug 的载体它留在tests/bugbash/直到 bug 修复修复后升级为回归测试。这套流程把模型声称的缺陷严格降级为可证伪的工程事实而 e2e 提供的e2e explore、run.explore记录、report_finding工具与 MCP 会话正好构成了这条证据链的每一环。相关主题文档可继续阅读SKILL.md、explore.md、mcp.md、writing-tests.md 与 setup.md。赞分享测试测试智能体人工智能浏览器控制CLI【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址https://gitcode.com/GitHub_Trending/e2e6/e2e点击查看免费下载相关推荐Partytown 贡献指南本地开发、复现 Bug、编写 E2E 测试与集成验证全流程Partytown 贡献指南本地开发、复现 Bug、编写 E2E 测试与集成验证全流程 Partytown 是一个把高开销第三方脚本分析、广告、A/B 测试前端Positron E2E 测试失败复现与验证指南从诊断到修复的严谨执行流程Positron E2E 测试失败复现与验证指南从诊断到修复的严谨执行流程 导读 本指南基于 Positron 仓库中 debug e2e test 技能S开发工具代码编辑器数据科学Textual border CSS 类型完全指南16 种边框样式、CLI 预览与源码级解析Textual border CSS 类型完全指南16 种边框样式、CLI 预览与源码级解析 border 是 Textual 框架中定义边框样式的 CS前端UI组件异步编程上一篇Firebase Admin Python SDK 教程下一篇BabyAI安全考虑确保AI智能体可靠执行指令的最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进