2026-05-19 赛博日记

生成时间:2026-05-19 23:58

📝 今日概要

今日核心工作聚焦于 ysbaiautotest 项目多个关键问题的修复与 LLM-api-test-tool 项目的重大改造,完成测试用例停止功能、Chrome 配置保存、用例负责人显示、Docker 部署优化以及 Electron 打包问题的解决;同时推动 Coupon API 改造计划的落地,包含解析器防循环、Tag 筛选、鉴权注入、LLM 分批生成和自修复能力的技术选型。

🔍 核心技术进展

ysbaiiautotest 项目

  1. 测试用例停止按钮修复

    • 问题:执行测试用例时点击停止按钮无法终断
    • 根因runningTestcaseProcess 仅在 Python 启动后赋值,步骤增强阶段停止会返回「没有正在运行的测试用例」;停止后 close 仍会等待步级裁判完成;前端 stopRunCase 未递增 currentExecutionId,导致 testcase:complete 覆盖停止状态
    • 解决:增加 testcaseRunSessionActive/testcaseRunAbortRequested 状态标记;增强阶段可停止;停止后跳过裁判等待并快速结束 IPC;停止时 currentExecutionId++runTasks 返回后若已停止则不再更新为成功/失败
  2. Chrome 配置路径保存清空问题修复

    • 问题:Chrome 可执行文件路径和用户数据目录保存后,再次打开会清空
    • 根因settings.service.ts 在加载配置时,若路径与旧版默认路径完全一致(如 C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe),会强制清空
    • 解决:删除「每次加载都清空」的逻辑;保存 Web 设置时对 Chrome 路径相关字段统一按字符串写入;更新设置时做字符串规范化
  3. Electron 打包快捷方式迁移(Squirrel → NSIS)

    • 问题:从 Squirrel 安装器切换到 NSIS 后,升级时桌面快捷方式指向旧版本,新快捷方式无法继承历史版本
    • 根因:不同安装器的快捷方式目标不同(Squirrel 指向 Update.exe --processStart,NSIS 直接指向 exe),升级时 NSIS 不会自动改写 Squirrel 创建的 .lnk
    • 解决:创建 build/installer.nsh 自定义安装脚本;在 customInstall 阶段删除桌面/开始菜单中名为「药师帮 AI 自动化测试」的旧快捷方式;对桌面快捷方式先调用 WinShell::UninstShortcut 解除固定,再删除;调用 SHChangeNotify 刷新桌面
  4. Electron 打包产物分发规范化

    • 澄清npm run package 产物是绿色文件夹(约 765 MB),适合本机自测;正式分发应用应使用 npm run make:bundle:win 生成的 NSIS 安装包
    • 问题:绿色文件夹发给别的电脑「不行」,多半是没整夹、没解压到本地、传不全或被安全软件拦截
    • 指导:正式分发请使用 NSIS 安装包;若必须发绿色目录,需整夹打包 zip、解压到本地磁盘运行,不要在压缩包里直接双击
  5. 用例负责人显示优化(中文映射 + 下拉选择)

    • 需求:用例负责人显示为中文(当前显示 TAPD userid),且支持下拉选择,存储仍用 userid
    • 实现
      • 使用 resources/userid.csv 映射文件(表头 userid/name
      • 后端 normalizeCaseOwnerToUserid 统一存 userid,界面显示中文名
      • 下拉选项来自 CSV 中的姓名 + 数据库已有负责人(去重)
      • 支持可选(首项为「不指定(可选)」)
    • Docker 部署修复:构建上下文改为仓库根目录,确保 resources/userid.csv 能被打包进镜像;运行时通过环境变量 TAPD_USERID_CSV=/app/resources/userid.csv 指定路径;未找到文件时打印警告日志

LLM-api-test-tool 项目

  1. Coupon API 改造计划(大型重构)

    • 背景:88 个 POST 接口,7 个 tag,253 个 schema,大量循环 $ref
    • 阻塞项:解析器 SwaggerParser._resolve_schema 遇循环 $ref 导致 RecursionError
    • 技术选型
      • 解析器修复:引入引用栈 + 深度上限(max_depth=8),遇到循环 $ref 时返回标记或部分信息
      • Tag 筛选:实现 TagFilter 组件,支持按 tag 筛选 endpoints
      • 鉴权注入:实现 CouponAuthInjector,支持 BaseInModelAuthappId/authCode/token)在请求体中注入
      • 路径参数:实现 PathParamResolver,替换 {version} 等路径参数(从 operation.description 提取默认值)
      • LLM 分批生成:按 tag 分组多次调用 LLM,合并结果并重编号,避免单次调用超时
      • Rule 模式 body 增强:基于 schema/example 生成请求体,替代占位 {}
      • 自修复能力:实现 CaseRepairer,失败用例根据 swagger 自修复
      • pytest 报告:添加 HTML 报告生成,失败用例可点击查看完整日志弹窗
  2. 前端体验优化

    • Base URL 配置:从 .env 改为前端配置,存储在 localStorage,页面刷新不丢失
    • 认证管理:从弹窗改为设置页,使用左右分栏布局,包含完整的 CRUD 功能(环境配置 Tab + 认证管理 Tab)
    • 页面背景统一白色:将暗色主题改为白色背景(.app-shell 背景从 radial-gradient 改为 #ffffff
  3. 合并推送 Skill

    • 自动化流程:创建 .claude/skills/merge-push.md,封装「检查变更 → 自动生成 commit 消息 → 暂存并提交 → 推送当前分支 → 合并到 dev/main → 推送 → 切回原分支 → 输出汇总报告」流程
    • 使用方式:在对话中输入 /merge-push 或说「合并推送」即可自动执行

💡 深度洞察与经验教训

  • 洞察:Docker 构建上下文很重要。如果配置文件在仓库根目录,但构建上下文只有子目录,会导致文件未打包。构建上下文应包含所有需要打包的文件。
  • 洞察:Electron 打包产物有 package(绿色文件夹)和 make(安装包)两种,前者适合本机自测,后者适合正式分发。不同安装器(Squirrel/NSIS)的快捷方式目标不同,升级时需要迁移旧快捷方式。
  • 洞察:Chrome 路径配置问题根因在「每次加载配置时,若路径与旧版默认路径完全一致,会强制清空」,而不是保存逻辑问题。这种「强制清空」逻辑容易误删用户自定义配置。
  • 教训:配置管理应避免「硬编码路径匹配后强制清空」的逻辑,应该用户填什么就存什么,启动时原样加载。必要时可以在加载时做规范化(如字符串 trim),但不应该凭空清空。
  • 教训:OpenAPI 解析器需要处理循环引用问题,引入引用栈和深度上限是有效方案,但需要权衡深度上限的值(太小可能导致解析不完整,太大可能导致栈溢出)。
  • 教训:大规模接口文档可以按 tag 或接口数分批处理,避免单次 LLM 调用超时或失败。分批后需要合并结果并重编号,保证用例 ID 连续。
  • 教训:鉴权注入逻辑使用 setdefault 无法覆盖占位值,应该直接覆盖。需要检查用例的 use_auth 标记,确保鉴权只注入到需要鉴权的用例中。

🚀 未来行动设想

  • 考虑将「合并推送」skill 推广到其他项目,提升开发效率
  • Docker 部署时,可以将配置文件通过 ConfigMap 或 Secret 管理,提升安全性
  • pytest 报告可以添加更多定制化选项,如失败截图、性能指标等
  • OpenAPI 解析器可以进一步优化,支持更多 OpenAPI 版本和特性
  • LLM 分批生成可以考虑并行化处理,提升生成速度

📊 自动化统计

  • 捕获 Memory 数:2(2026-05-19.md + claude_2026-05-19.md)
  • 笔记更新数:0(note-gen-sync 目录下最近24小时无 .md 文件更新)