2026年8月3日 星期一 赛博日记

生成时间:2026-08-03 23:50 (Asia/Shanghai)

核心工作

💻 Claude Code 工作记录

今日共 17 个会话(Claude 13 个 / Cursor 4 个,365 条消息),主要围绕 APP 冒烟测试执行架构重构 展开。

🧪 APP 冒烟测试执行流重构:Skill 驱动步级裁判

  • 时间:全天(11:12 起)
  • 项目Administrator/.claude/projects
  • 消息数:647(主会话)
  • 状态:✅ 完成,148 个测试用例全量回归通过

核心改造内容

  1. 步级协议落地:复用 electron.py 内置的 YSB_STEP_JUDGE_SYNC 同步钩子,将主循环从 for 遍历重写为 while 可控索引结构,支持 retry_current(续跑当前步)和 restart_all(整条重跑)两种流转模式。单进程保状态 + 逐步判,避免了每步重启进程的开销。

  2. 独立裁判模块:新建 runtime/phone_agent/step_judge.py,封装证据落盘、Verdict 解析、决策封顶及 stdout 切片逻辑。针对 __init__.py 重依赖导致单测崩溃的问题,采用 importlib.util.spec_from_file_location 按绝对路径隔离加载,完成 23 项单元测试。

  3. 执行引擎重写:重构 run_app_batch.py 执行链路,剔除旧版 _parse_app_case_resultrun_with_step_retry,全面接入步级裁判累积机制。

  4. 无人值守门禁适配:在 gate.py 注入 step_judge.mode=auto 强制配置,开发 Auto Daemon 守护线程解决 Git Commit Hook 等无交互场景下的自动轮询裁判。

关键经验

  • 钩子复用 » 进程重建:系统已内置同步等待机制,单进程顺序执行天然保持 UI 状态连续性
  • Python 包初始化依赖陷阱:__init__.py 中的重型依赖会污染单测环境,纯逻辑应抽离为独立模块
  • 非原子文件写入需鲁棒设计:裁判轮询必须校验 JSON 完整性,防止读到截断数据

🔍 三版冒烟架构对比调研(PC/Gate/App)

通过对比分析 PC 版、Gate 版、App 版冒烟测试执行链路的职责分层:

  • App 版底层已通过 _case_tasks 实现步骤化切片,但缺乏独立的 Skill 层逐步规划闭环
  • PC 版侧重批量任务流水线控制,Gate 版侧重提交前门禁拦截
  • 三者均呈现"策略(Skill)-执行(Script)-反馈(Judgment)“分层特征
  • 结论:App 版重构方向明确——补全顶层 Skill 渐进式规划节点 + 后置条件判断器

📦 TAPD 测试用例生成与门禁执行(Cursor)

  • 时间:10:51
  • 项目d/code/ysbpro
  • 消息数:50

完成「积分补贴按钮」功能 12 条测试用例(TC001~TC012),覆盖前端 snapUp.pointsUseButton 与后端 submitOrderDetail.pointsUseButton。执行 P0 冒烟门禁未通过(exit code 10,通过率 0%),根因:

  • 动作脚本中全角逗号引发 SyntaxError,触发裁判熔断
  • 搜索词未匹配积分活动商品,UI 无法定位

教训:自动化指令中严禁全角标点;测试选例需与当前环境商品配置对齐。

🐛 图片上传持久化问题修复(Cursor)

  • 时间:12:04
  • 项目e/code/ysbaiautotest

排查用例图片上传二次运行失败:DB 中附件名已动态变更(如 partImg_xxx.png),但用例脚本仍硬编码引用旧文件名 8.png。同时发现误用 Click 替代 Upload API。已推送修复。

📦 Electron 打包后 Python 插件丢失修复(Cursor)

  • 时间:14:48
  • 项目e/code/ysbaiautotest
  • 版本:v1.1.11 → v1.1.12

两个关键 Bug:

  1. 构建脚本遗漏prepare-python-bundle.cjs 未将 utils/ 目录打包,导致前置条件插件在打包版中消失。补全 copyPreconditionUtilsSources() 方法修复。
  2. 嵌入式 Python 路径陷阱:Windows 嵌入式 Python 的 ._pth 机制会完全忽略 PYTHONPATH 环境变量,加上 cwd 偏移导致 ImportError。改用 runpy 执行 + 显式 sys.path.append() 修复。

核心教训:嵌入式 Python 环境变量不可靠,必须通过 sys.path.insert() 显式注册模块路径,且主进程和子脚本层均应保留兜底逻辑。

📱 APP 执行器替换为 Cursor 驱动 Appium MCP(Cursor)

  • 时间:17:06
  • 项目d/code/p0-smoke-cursor
  • 消息数:316

将 PhoneAgent 替换为 Cursor + Appium MCP 架构:

  • 新建 appium_cursor_executor.py 替代 electron.py/PhoneAgent,保留 APP_SMOKE_EXECUTOR=phone_agent 回滚开关
  • 修复 Windows npx 缓存竞争问题:改用本地预装(~1165 个包),MCP 配置直接指向本地 node 入口
  • 开发三级弹窗拦截模块 app_popup_dismiss.py:白名单文案匹配 → 启发式 DOM 定位 → KEYCODE_BACK 兜底

⚠️ API 凭据认证异常(多次会话)

多个会话出现 403 AccessDenied / 403 invalid api-key 错误,涉及模型 Qwen3.8-MaxQwen3.7-MaxQwen3.6-Plus 均无权限。最终降级至 qwen3.6-flash 恢复连通。累计约 8 个短会话用于排查此问题。

教训:配置层应采用主备模型降级策略,初始化阶段加入模型可用性探测与自动回退。

思考与备忘

  • 步级裁判架构是今日最大产出:将冒烟测试从"整用例丢给 Agent"升级为"Skill 逐步规划 + 单步执行 + 逐帧判断"模式,显著提升调试效率和断言准确性。后续需合入主仓 runtime/ 分支。
  • 嵌入式环境的路径管理是个深坑:Windows 嵌入式 Python 的 ._pth 机制完全绕过标准环境变量,这类平台差异问题在开发机上根本无法复现。需要在目标环境建立标准化的冒烟检查。
  • 门禁 Auto Daemon 性能待验证:无人值守模式下每步需远程裁判决策,整体耗时必然上升,需压测并预留降级方案。
  • API 凭据管理需要规范化:一天内 8 个会话浪费在凭据问题上,应建立自动化的密钥有效性巡检。

今日摘要

全天聚焦 APP 冒烟测试架构升级,完成从架构调研 → 步级裁判重构 → 执行器替换(Appium MCP)→ 周边工具链修复(TAPD 用例、图片上传、Electron 打包)的完整闭环。核心成果是 Skill 驱动的步级裁判系统,148 个测试零破坏回归。同时踩了嵌入式 Python 路径、全角标点熔断、npx 缓存竞争等多个硬核坑,均有完整修复方案落地。

📊 自动化统计

  • 捕获 Memory 数:0(今日 memory/2026-08-03.md 不存在)
  • 笔记更新数:0(note-gen-sync 下无最近修改的 .md 文件)
  • Todoist 完成任务数:N/A(本次 cron 环境无 Todoist 工具访问权限)
  • Claude Code 会话数:17(Claude 13 / Cursor 4,共 365 条消息)
  • Claude Code 主会话消息数峰值:647(步级裁判重构)