恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
AionUi aionrs(Aion CLI)E2E 测试用例全解:从 P0 基线路径到 P2 边界验证的设计与实践
首页
资讯中心
/
AionUi aionrs(Aion CLI)E2E 测试用例全解:从 P0 基线路径到 P2 边界验证的设计与实践
AionUi aionrs(Aion CLI)E2E 测试用例全解:从 P0 基线路径到 P2 边界验证的设计与实践
发布时间:2026/9/19 18:14:03
AionUi aionrsAion CLIE2E 测试用例全解从 P0 基线路径到 P2 边界验证的设计与实践【免费下载链接】AionUi免费、本地、开源的 24/7 全天候 Cowork 应用以及适用于 Gemini CLI、Claude Code、Codex、OpenCode、Qwen Code、Goose CLI、Auggie 等的 OpenClaw | 喜欢就点star吧项目地址: https://gitcode.com/iOfficeAI/AionUi导读本文基于 AionUi 开源仓库中的 aionrs E2E 测试用例设计文档tests/e2e/docs/chat-aionrs/test-cases.zh.md系统讲解针对 aionrsAion CLI对话功能设计的 15 个端到端测试用例涵盖用例编号规则、全局前置条件、五维测试矩阵关联文件夹 / 上传文件 / 模型 / 权限 / 对话中操作、SQL 级 DB 断言模板与清理约定。读完本文你将掌握如何为基于本地 CLI binary 的 AI Agent 对话功能编写可跳过、可断言、可清理的高质量 E2E 用例并理解 AionUi 中 guid 页 → 对话页的完整链路实现。1. 背景为什么需要一套独立的 aionrs E2E 用例AionUi 是一个本地优先的开源 AI 应用支持接入 Gemini CLI、Claude Code、Codex、Qwen Code、Goose CLI 等本地 CLI binary。其中aionrsAion CLI是一种以binary IPC方式驱动的 agent 后端用户在前端guid 页选择 agent、配置模型与权限随后在对话页与运行在本地进程中的 binary 交互。这类后端的 E2E 测试与普通 API 对话测试有本质差异依赖本地 binary 可用性binary 不存在时整套测试必须优雅跳过而不是失败依赖用户真实配置的 provider模型列表来自用户配置文件测试不能 hardcode 模型 ID涉及真实文件系统与进程生命周期关联文件夹、上传文件、停止进程、清理 DB 与临时目录都是用例的一部分权限模式影响交互行为default/auto_edit/yolo三档权限直接决定是否出现工具确认弹窗。为此设计文档以Gate 2 初稿的形式产出了一套编号为 TC-A-01 ~ TC-A-15 的完整用例矩阵并在仓库 tests/e2e/features/conversations/aionrs/ 目录下落地为 6 个 spec 文件。2. 用例结构编号规则、前置条件与五维矩阵2.1 用例编号规则P0 / P1 / P2优先级用例范围定位P0必测TC-A-01 ~ TC-A-05基线路径最小可用功能P1常规TC-A-06 ~ TC-A-12维度组合常用场景P2边界TC-A-13 ~ TC-A-15异常处理边界验证P0 保证能跑通P1 覆盖常用变体P2 守护异常不崩。从源码结构看这一分层与 spec 文件的划分一一对应basic-flow.e2e.ts承载 TC-A-01~03model-selection.e2e.ts承载 TC-A-04permission-modes.e2e.ts承载 TC-A-05/06mid-conversation-switch.e2e.ts承载 TC-A-07~09combo-scenarios.e2e.ts承载 TC-A-10~12edge-cases.e2e.ts承载 TC-A-13~15。2.2 全局前置条件所有 aionrs 测试用例共享三项前置条件缺一不可aionrs binary 可用通过ipcBridge.fs.findAionrsBinary.invoke()验证否则 skip 全部测试至少 1 个可用的非 Google Auth provider调用ipcBridge.mode.getModelConfig.invoke()获取用户配置的 provider 列表过滤掉platform包含gemini-with-google-auth的 providerAionCore 不支持 Google Auth验证至少 1 个 provider 包含apiKey且有可用model若无可用 providerskip 全部测试原因标记为No non-Google-Auth provider with apiKey configured。测试数据准备临时工作目录/tmp/e2e-aionrs-timestamp/。第二点在源码中有明确印证useAionrsModelSelection.ts 第 36-40 行对 provider 列表执行同样的过滤逻辑allProviders.filter((p) !p.platform?.toLowerCase().includes(gemini-with-google-auth))。测试前置条件与产品代码保持同一套过滤规则保证测试看到的模型列表与产品实际可选的模型列表一致。模型获取 helper由 engineer 实现位于 tests/e2e/helpers/chatAionrs.tsexport async function getAionrsTestModels(page: Page): Promise{ modelA: TProviderWithModel; // 第一个可用模型默认模型 modelB: TProviderWithModel | null; // 第二个可用模型若存在 };该 helper 还负责把原始 provider 数据规范化为测试友好的结构如apiKey/api_key双字段归一、model/models数组归一、useModel默认取第一个模型确保测试代码不依赖具体配置格式。2.3 五维测试维度维度可选值说明关联文件夹无 / 单 / 多atPath数组源码AionrsSendBox.tsx上传文件无 / 单 / 多uploadFile数组源码useSendBoxFiles.ts模型默认 / 自选从用户配置的 provider 列表选择ipcBridge.mode.getModelConfig.invoke()过滤 Google Auth权限default / auto_edit / yolo来源aionrs runtime capabilities对话中操作切换模型 / 切换权限 / 无对话页AionrsModelSelector/AgentModeSelector从实现看权限选项并非硬编码AionrsSendBox 通过useAionrsMessage的onConfigChanged回调接收 runtime capabilities 中的modes数组动态生成选项modeOptionsFromCapabilities同时保留default/auto_edit/yolo兜底列表。这意味着测试文档中权限来源aionrs runtime capabilities的描述与运行时行为一致。2.4 清理约定与截图要求命名模式所有测试对话命名为E2E-aionrs-timestamp-scenario便于统一清理与检索。清理顺序每个用例afterEach执行防止用例间数据污染停止 binary 进程ipcBridge.conversation.stopAgent.invoke(conversationId)删除 DB 记录DELETE FROM conversations WHERE name LIKE E2E-aionrs-%级联删除 messages删除临时目录fs.rm(/tmp/e2e-aionrs-*, { recursive: true })清理 sessionStoragesessionStorage.removeItem(aionrs_initial_message_*)sessionStorage.removeItem(aionrs_initial_processed_*)。其中 sessionStorage 清理对应 guid 页 → 对话页的初始消息接力机制AionrsSendBox 在 AionrsSendBox.tsx 中读取aionrs_initial_message_${conversation_id}发送成功后写入aionrs_initial_processed_${conversation_id}标记避免重复发送。测试清理这两项是保证下一条用例能重新从 guid 页带消息跳转的前提。截图要求每个用例最少 3 张——guid 页选择 agent 后显示输入框 配置项对话页首条消息发送后显示用户消息 AI 回复流式中对话完成后显示最终消息列表 DB 断言通过。3. P0 基线用例TC-A-01 ~ TC-A-053.1 TC-A-01最小可用路径验证无附件 默认模型 default 权限的最小对话流程是整个套件的试金石。维度组合关联文件夹无上传文件无模型默认modelA权限default对话中操作无。操作步骤打开应用导航至 guid 页/#/guid选择 aionrs agent点击[data-agent-backendaionrs]确认权限选择器默认值为defaultAgentModeSelector默认值输入测试消息Hello, aionrs! Please list files in current directory.点击发送按钮等待跳转至对话页URL 匹配/conversation/aionrs/*等待 AI 回复流式完成轮询 DBmessages.statusfinish超时 60s。DB 断言点对应文档附录 B 的查询模板-- 1. 验证 conversation 创建 SELECT id, name, type, model, status, json_extract(extra, $.sessionMode) as mode FROM conversations WHERE name LIKE E2E-aionrs-% AND id ?; -- 期望: typeaionrs, modedefault, statusfinished -- 2. 验证用户消息 SELECT id, type, position, content, status FROM messages WHERE conversation_id ? AND position right; -- 期望: typetext, positionright, json_extract(content, $.content) 包含 Hello, aionrs! -- 3. 验证 AI 回复 SELECT id, type, position, status, created_at FROM messages WHERE conversation_id ? AND position left AND type text; -- 期望: 至少 1 条, statusfinish, created_at 用户消息 created_at -- 4. 验证消息顺序 SELECT COUNT(*) FROM messages WHERE conversation_id ?; -- 期望: ≥ 2用户 AI清理义务conversation 名E2E-aionrs-timestamp-minimal-pathtemp dir/tmp/e2e-aionrs-timestamp-tc-a-01/workspacesessionStorage 键aionrs_initial_message_${conversationId}与aionrs_initial_processed_${conversationId}。截图数 3。对应实现见 basic-flow.e2e.ts 中的TC-A-01: should complete minimal conversation with no attachments。3.2 TC-A-02关联单个文件夹验证关联文件夹后消息内容包含文件夹引用即attachedDirs正确写入用户消息。前置准备mkdir -p /tmp/e2e-aionrs-timestamp/test-folder/ echo sample content /tmp/e2e-aionrs-timestamp/test-folder/sample.txt关键步骤从文件树选择test-folder/触发emitter.emit(aionrs.selected.file, [{ path, name, isFile: false }])确认 guid 页显示文件夹 Tagdata-testidfolder-tag-0发送消息What files are in the attached folder?。DB 断言点-- 1. 验证用户消息包含文件夹引用 SELECT json_extract(content, $.attachedDirs) as dirs FROM messages WHERE conversation_id ? AND position right; -- 期望: dirs 是 JSON 数组, 包含 {path: .../test-folder, name: test-folder, isFile: false} -- 2. 验证消息内容 SELECT json_extract(content, $.content) as text FROM messages WHERE conversation_id ? AND position right; -- 期望: text 包含 What files are in the attached folder?实现佐证文件夹 Tag 的渲染与 testid 生成位于 AionrsSendBox.tsx其中folderIndex atPath.filter((v) typeof v ! string !v.isFile).indexOf(item)计算文件夹序号data-testid{\aionrs-folder-tag-${folderIndex}}文件预览卡片同理使用aionrs-file-tag-${index}。文档中提到的data-testidfolder-tag-0 是测试对实现 testid 的引用实际以源码为准。3.3 TC-A-03上传单个文件验证上传文件后binary 接收files参数。前置准备echo Test file content for aionrs E2E /tmp/e2e-test-file.txt关键步骤WebUI 端使用input typefile选择文件Desktop 端调用ipcBridge.dialog.showOpen()选择文件。确认文件预览卡片显示data-testidfile-card-0后发送What is the content of the attached file?。DB 断言点-- 1. 验证用户消息包含文件引用 SELECT json_extract(content, $.attachedFiles) as files FROM messages WHERE conversation_id ? AND position right; -- 期望: files 是 JSON 数组, 包含 /tmp/e2e-test-file.txt -- 2. 验证 AI 回复提到文件内容 SELECT json_extract(content, $.content) as text FROM messages WHERE conversation_id ? AND position left AND type text; -- 期望: text 包含 Test file content 或文件名 e2e-test-file.txt实现佐证发送消息时文件通过collectChatFileRefs(uploadFile, atPath)收集为ChatFileRef[]并随ipcBridge.conversation.sendMessage.invoke({ input, conversation_id, files, sessions })传递AionrsSendBox.tsx由后端在发送边缘将每个 ChatFileRef 解析为绝对路径并注入[[AION_FILES]]标记。因此测试断言attachedFiles包含绝对路径/tmp/e2e-test-file.txt是符合设计意图的。3.4 TC-A-04使用第二个模型验证在 guid 页选择非默认模型后DB 正确记录模型 ID。前置条件getAionrsTestModels(page)返回{ modelA, modelB }若modelB nullskip 此用例原因Only 1 model available, skipping guid page model selection test。关键步骤在 guid 页打开模型选择器GuidModelSelector仅当isGeminiModetrue可见选择modelB不 hardcode 具体模型 ID发送What model are you using?。DB 断言点SELECT model, json_extract(extra, $.model.useModel) as extra_model FROM conversations WHERE id ?; -- 期望: extra_model modelB.useModel SELECT status FROM conversations WHERE id ?; -- 期望: statusfinished SELECT COUNT(*) FROM messages WHERE conversation_id ? AND position left; -- 期望: ≥ 1实现佐证guid 页模型选择器的可见性由isGeminiMode控制即PROVIDER_BASED_AGENTS.has(agentSelection.selectedAssistantBackend)GuidPage.tsx。备注若 guid 页模型选择器未启用isGeminiMode为 false此用例改为在对话页切换模型见 TC-A-07。3.5 TC-A-05使用 yolo 权限验证yolo 模式下工具调用自动批准无确认弹窗。关键步骤打开权限选择器AgentModeSelectordata-testidagent-mode-selector-aionrs选择yololabel: YOLO发送Please create a file named test.txt with content E2E test.验证无确认弹窗出现等待工具执行完成轮询 DBmessages.typetool_group且statusSuccess。DB 断言点-- 1. 验证权限模式持久化 SELECT json_extract(extra, $.sessionMode) as mode FROM conversations WHERE id ?; -- 期望: modeyolo -- 2. 验证工具调用记录 SELECT type, json_extract(content, $[0].status) as tool_status FROM messages WHERE conversation_id ? AND type tool_group; -- 期望: 至少 1 条, tool_status IN (Success, Executing, Error) -- 注意: yolo 模式不应出现 Confirming 状态 -- 3. 验证无确认弹窗前端逻辑验证 -- E2E 层page.waitForSelector(.confirmation-dialog, { timeout: 2000 }) 应超时证明无弹窗4. P1 常规组合用例TC-A-06 ~ TC-A-124.1 TC-A-06使用 auto_edit 权限验证auto_edit 模式下 edit/info 工具自动批准exec 工具仍需确认——这是对权限语义最精细的验证。操作步骤选择auto_editlabel: Auto-Accept Edits发送Please read the file ./README.md and summarize it.触发 info 工具等待执行完成无确认弹窗发送第二条消息Now run command ls -la.触发 exec 工具验证出现确认弹窗ConversationChatConfirm显示点击 Yes, Allow Once 批准等待命令执行完成。DB 断言点SELECT json_extract(content, $[0].name) as tool_name, json_extract(content, $[0].status) as tool_status FROM messages WHERE conversation_id ? AND type tool_group; -- 期望: -- - info 类工具: status 直接从 Executing → Success跳过 Confirming -- - exec 类工具: status 经历 Confirming → Executing → Success需用户确认截图数4比基线多 1 张确认弹窗截图。4.2 TC-A-07对话中切换模型验证对话中切换模型后DBconversations.extra.model更新为新模型 ID。操作步骤按 TC-A-01 创建对话modelA→ 等待首条回复完成 → 点击对话页模型选择器AionrsModelSelectordata-testidaionrs-model-selector→ 选择modelB→ 轮询 DBconversations.extra.model更新 → 发送第二条消息What model are you using now?。DB 断言点SELECT json_extract(extra, $.model.useModel) as current_model FROM conversations WHERE id ?; -- 期望: current_model modelB.useModel SELECT COUNT(*) FROM messages WHERE conversation_id ?; -- 期望: ≥ 4用户消息1 AI回复1 用户消息2 AI回复2实现佐证AionrsModelSelector.tsx 使用${providerId}::${modelName}复合 ID 将扁平模型列表映射回 providermodel选择后调用handleSelectModel(provider, modelName)模型切换状态经useAionrsModelSelection的handleSelectModel回调onSelectModel返回 true 才更新current_model持久化。备注根据设计文档中议题 1的决策此用例只验证 DB 字段更新不验证 binary 内部 sessionId 变化。4.3 TC-A-08 / TC-A-09对话中切换权限这两个用例验证权限切换后工具确认行为立即变化是权限档位动态生效的证明。TC-A-08default → auto_edit先以 default 权限发送 edit 类消息 →验证出现确认弹窗→ 取消No→ 切换为auto_edit→ 重新发送相同消息 →验证无确认弹窗。TC-A-09auto_edit → yolo先以 auto_edit 发送Please run command pwd.exec 工具→验证出现确认弹窗→ 取消 → 切换yolo→ 重新发送 →验证无确认弹窗yolo 自动批准所有工具。DB 断言点以 TC-A-08 为例-- 1. 验证权限切换后 DB 更新 SELECT json_extract(extra, $.sessionMode) as mode FROM conversations WHERE id ?; -- 期望: modeauto_edit -- 2. 验证第二次工具调用无 Confirming 状态取最新一条 SELECT json_extract(content, $[0].status) as tool_status, created_at FROM messages WHERE conversation_id ? AND type tool_group ORDER BY created_at DESC LIMIT 1; -- 期望: tool_status Executing 或 Success跳过 Confirming -- 3. 验证第一次工具调用被取消取最早一条 SELECT json_extract(content, $[0].status) as tool_status, created_at FROM messages WHERE conversation_id ? AND type tool_group ORDER BY created_at ASC LIMIT 1; -- 期望: tool_status Canceled截图数TC-A-08 为 5 张2 张确认弹窗第一次出现 第二次未出现TC-A-09 为 4 张。4.4 TC-A-10 / TC-A-11 / TC-A-12多维度组合场景这三个用例验证维度交叉时的附件完整传递。TC-A-10关联文件夹 上传文件 非默认模型 auto_editmkdir -p /tmp/e2e-aionrs-timestamp/folder-a/ echo content A /tmp/e2e-aionrs-timestamp/folder-a/file-a.txt echo content B /tmp/e2e-test-file-b.txt发送Compare the content of the attached folder and file.断言dirs包含folder-a、files包含e2e-test-file-b.txt、extra.model.useModel为第二个模型 ID、sessionModeauto_edit。TC-A-11上传多个文件创建/tmp/e2e-file-1.txt、/tmp/e2e-file-2.txt、/tmp/e2e-file-3.txt三个文件批量上传断言attachedFiles数组长度 3AI 回复提及 3 或 three。TC-A-12关联多个文件夹创建folder-x/与folder-y/并各含一个文件依次从文件树选择断言dirs数组长度 2、包含folder-x与folder-yAI 回复提及x.txt与y.txt。对应实现见 combo-scenarios.e2e.ts其中 TC-A-10/12 在只有 1 个模型时同样以test.skip优雅降级Need at least 2 models for this test。5. P2 边界用例TC-A-13 ~ TC-A-155.1 TC-A-13Binary 不可达时跳过测试验证E2E 测试前的 binary 检查机制生效。通过设置process.env.AION_CLI_PATH /dev/null模拟 binary 不可用运行测试后断言测试框架输出test.skip()标记控制台输出 skip 原因aionrs binary not found, skipping E2E testsCI 报告显示 skipped非 failed。实现参考对应 spec 中的beforeAll钩子// tests/e2e/setup/aionrs.setup.ts export async function checkAionrsBinary(): Promiseboolean { try { const binary await ipcBridge.fs.findAionrsBinary.invoke(); return binary ! null; } catch { return false; } } // tests/e2e/specs/chat-aionrs/*.spec.ts test.beforeAll(async () { const hasBinary await checkAionrsBinary(); if (!hasBinary) { test.skip(aionrs binary not found, skipping E2E tests); } });实际实现中edge-cases.e2e.ts 与各 spec 文件在beforeAll中除 binary 检查外还会校验是否存在 aionrs 兼容的 provider否则test.skip(true, No aionrs-compatible provider found, skipping E2E tests)——把依赖外部环境的用例从失败降级为跳过是本地 binary 型 E2E 的通用最佳实践。5.2 TC-A-14超大文件上传限制验证前端文件大小限制机制。创建 100MB 文件dd if/dev/zero of/tmp/e2e-large-file.bin bs1M count100尝试上传后断言前端显示错误提示Toast / Message 组件文件预览卡片不显示发送按钮可用但消息体不包含该文件DB 无记录消息未发送。备注若前端未实现大小限制需确认FileService.processDroppedFiles()逻辑此用例改为验证 binary 层错误处理——这种实现优先、备选方案兜底的写法避免了用例因实现偏差而僵死。5.3 TC-A-15关联不存在的文件夹验证文件系统异常处理。通过手动触发选择事件模拟不存在的路径emitter.emit(aionrs.selected.file, [ { path: /tmp/e2e-nonexistent-folder/, name: e2e-nonexistent-folder, isFile: false }, ]);DB 断言点-- 1. 验证用户消息记录文件夹引用即使路径不存在 SELECT json_extract(content, $.attachedDirs) as dirs FROM messages WHERE conversation_id ? AND position right; -- 期望: dirs 包含 /tmp/e2e-nonexistent-folder/ -- 2. 验证 AI 回复提示错误 SELECT json_extract(content, $.content) as text FROM messages WHERE conversation_id ? AND position left AND type text; -- 期望: text 包含 not found 或 does not exist 或类似错误提示 -- 3. 验证对话状态 SELECT status FROM conversations WHERE id ?; -- 期望: statusfinished非 error因为是用户输入错误而非系统错误第三点是整份文档中最值得注意的断言设计用户输入错误不应把对话标记为 error而应正常结束finished——这区分了用户输入导致的业务异常与系统故障是语义化断言的高阶用法。6. 未覆盖场景明确不测什么同样是设计根据设计文档中议题 3的决策以下场景本轮 E2E明确不覆盖并记录理由工具确认中途切换权限弹窗确认中切换 yolo 的行为未定义E2E 不应固化不确定行为流式输出中途切换模型当前 turn 是否中断/继续/使用新模型未定义跨对话/跨进程权限持久化always allow 重启后是否记住本轮只测同一对话内切换生效并发对话场景暂缓至后续 Gate需 Playwright 多标签页 进程监控的复杂编排。这条负面清单的价值在于它划定了当前测试的信任边界避免测试断言了未定义的行为而变成测试驱动实现的隐性约束。7. 测试数据矩阵与实现优先级7.1 用例汇总矩阵用例 ID关联文件夹上传文件模型权限对话中操作优先级截图数TC-A-01无无默认default无P03TC-A-02单无默认default无P03TC-A-03无单默认default无P03TC-A-04无无第二个default无P03TC-A-05无无默认yolo无P03TC-A-06无无默认auto_edit无P14TC-A-07无无默认→第二个default切换模型P14TC-A-08无无默认default→auto_edit切换权限P15TC-A-09无无默认auto_edit→yolo切换权限P14TC-A-10单单第二个auto_edit无P14TC-A-11无多3个默认default无P13TC-A-12多2个无默认default无P13TC-A-13N/AN/AN/AN/AN/AP21TC-A-14无超大默认default无P22TC-A-15不存在无默认default无P23统计P0 5 个基线路径、P1 7 个常规组合 对话中操作、P2 3 个边界验证总计 15 个用例总截图数 50 张。7.2 分阶段落地建议Phase 1P0 必测TC-A-01最小路径优先实现验证端到端基础流程→ TC-A-02/03附件传递→ TC-A-04模型选择→ TC-A-05权限档位Phase 2P1 常规覆盖TC-A-06完整权限档位覆盖→ TC-A-07/08/09对话中动态切换→ TC-A-10/11/12维度交叉Phase 3P2 边界收尾TC-A-13CI 跳过机制→ TC-A-14/15健壮性验证。8. 下一步流程Gate 2 → Gate 3设计文档明确了后续交付路径chat-aionrs-engineerreview 用例设计并评估工作量 →team-lead批准后进入 Gate 3实现→ engineer 实现完成后designer 产出implementation-mapping.zh.mdTC ID → 文件:行号:函数名 映射。这一设计-评审-实现-映射的闭环保证了测试用例与源码实现可双向追溯。附录 A关键源码参考文件关键位置说明GuidPage.tsxisGeminiModeguid 页模型选择器可见性AionrsSendBox.tsxatPath状态关联文件夹数组AionrsSendBox.tsxsendMessage.invoke发送消息传递files参数AionrsSendBox.tsx初始消息接力guid 页消息经 sessionStorage 注入对话页useAionrsModelSelection.ts过滤 Google Auth测试与产品共用同一过滤规则AionrsModelSelector.tsx复合 ID 映射对话页模型切换chatAionrs.tsprovider 归一化E2E 测试模型获取 helperbasic-flow.e2e.tsTC-A-01~03P0 基线实现combo-scenarios.e2e.tsTC-A-10~12组合场景实现edge-cases.e2e.tsTC-A-13~15边界场景实现附录 BDB 断言查询模板以下为整套用例共用的 SQL 模板覆盖对话、消息、工具调用、思考四类断言以及统一的 E2E 数据清理-- 查询对话基本信息 SELECT id, name, type, model, status, json_extract(extra, $.sessionMode) as mode, json_extract(extra, $.model.useModel) as extra_model, json_extract(extra, $.lastTokenUsage.totalTokens) as tokens FROM conversations WHERE name LIKE E2E-aionrs-%; -- 查询消息列表 SELECT id, msg_id, type, position, status, json_extract(content, $.content) as text, json_extract(content, $.attachedFiles) as files, json_extract(content, $.attachedDirs) as dirs, created_at FROM messages WHERE conversation_id ? ORDER BY created_at ASC; -- 查询工具调用 SELECT json_extract(content, $[0].name) as tool_name, json_extract(content, $[0].status) as tool_status, json_extract(content, $[0].callId) as call_id, created_at FROM messages WHERE conversation_id ? AND type tool_group ORDER BY created_at ASC; -- 查询思考消息 SELECT json_extract(content, $.content) as thinking_text, json_extract(content, $.duration) as duration_ms, json_extract(content, $.status) as thinking_status FROM messages WHERE conversation_id ? AND type thinking; -- 清理所有 E2E 数据 DELETE FROM conversations WHERE name LIKE E2E-aionrs-%;结语这套 15 用例的 aionrs E2E 设计给出了一条可复用的范式用维度矩阵穷举输入组合用 SQL 断言锁定持久化语义用 skip 机制容忍环境依赖用清理约定保证可重复运行用负面清单划定信任边界。对于任何本地 binary 用户配置 文件系统交互型 AI 应用的测试设计它都是一份值得对照的模板而其设计文档test-cases.zh.md与 tests/e2e/features/conversations/aionrs/ 下的落地实现则展示了设计先行、实现映射的完整工程闭环。【免费下载链接】AionUi免费、本地、开源的 24/7 全天候 Cowork 应用以及适用于 Gemini CLI、Claude Code、Codex、OpenCode、Qwen Code、Goose CLI、Auggie 等的 OpenClaw | 喜欢就点star吧项目地址: https://gitcode.com/iOfficeAI/AionUi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考