2026年07月01日 赛博日记
生成时间:2026-07-01 23:55:01
📝 今日概要
技术突破日——一口气修复了 AI 自动化测试框架的 3 个核心 Bug,重构了用例入库体系(弃 CSV、统一环境规则、引入 AST 解析),并新建执行记录表实现完整的历史追踪。从底层数据结构到上层展示逻辑,完成了一次全链路治理。
🔍 核心技术进展
1. AI 裁判系统三大 Bug 围剿 claude_2026-07-01
- 用例跳过误判:
detectExecutionCaseSkip在整段 stdout 扫关键词不区分运行是否已通过,导致success=true的用例被标 ⏭️。修复方案:新增stdoutIndicatesRunSucceeded()前置检查,跳过判定仅在!executionSuccess时触发,并解除webBuAggregateRunSucceeded与isExecutionCaseSkipped的循环依赖(3dc45ec) - APP 裁判卡片丢失:
hasLiveRunOutput()在有实时日志时拦截了所有testcase:stepJudge事件。步级裁判往往在进程结束后才返回,卡片永远不显示。修复:移除拦截,裁判卡片始终插入消息流 - 卡片顺序错乱 + 悬浮:裁判异步返回时 push 到列表末尾,步骤 3 执行时步骤 1 的裁判才到。新建
stepJudgeMessageInsert.ts,将裁判卡片插入到对应步骤日志正后方,去重 + 不触发滚底(b981955)
2. 用例入库体系全面重构 claude_2026-07-01
- 移除 CSV 双入口:删除
测试用例列表.csv(656KB),注释--from-csv分支,以代码扫描为唯一数据源 - AST 替代文本解析:
_get_marker_block手写解析在多行@parametrize处断链,至少 13 个 Android 用例 marker 漏读。改用ast.parse读取 decorator,彻底解决 - 统一环境规则:新增
common/case_env.py,入库(多环境)与回写(单环境)共用resolve_case_environments()/resolve_runtime_environment(),消除两套独立实现的漂移风险 - 清理脏数据 54 条:新增
prune_stale_cases(),DB 与代码扫描完全对齐(648 = 648)
3. 执行记录表 + 重试语义统一 claude_2026-07-01
- 新建
test_execution_record表(id、test_case_id、ai_case_id、case_type、run_at、exec_result、created_at) - 重试规则:首次失败写一条 FAIL(不重复),重试成功覆盖为 PASS,执行记录与主表
exec_result在同一stage_outcome()中同步更新 - 确认三端生效:PC/Android 直接 import,iOS 经
loader.py动态加载(补修父包注册)
4. 自动化日报表格化 claude_2026-07-01
- 切换企微 webhook 到
markdown_v2,支持表格渲染 - 执行概览 3 行表替代 ~10 行引用块,覆盖范围统一表按 APP/PC 分组
- 「查看失败日志」→「查看记录详情」,疑似 bug 数加粗强调
5. PC 端 chromedriver 缓存修复 claude_2026-07-01
- 新版 webdriver-manager 解压到
chromedriver-win64/,旧查找逻辑只扫chromedriver.exe和chromedriver-win32/ - 补全缓存路径 + 项目内 fallback + 网络异常容错(
2d4fc37)
💡 深度洞察与经验教训
- 洞察:双数据源是系统性 bug 的温床。CSV 导入与代码扫描各自维护一套环境判定逻辑,差异静默积累,最终以「RC 服大量 NULL」的症状爆发。根治方式不是修 CSV,而是砍掉一个入口——单一数据源原则在测试基础设施中同样适用
- 洞察:入库(源码解析)与回写(运行时 marker)使用两套独立实现,是一个违反 DRY 的经典反模式。今天的
case_env.py统一是正确方向,但三端 marker 命名仍不统一(Androidtest_RCvs iOSnot_testvs PC 无标签默认),长期应收敛 - 教训:
hasLiveRunOutput()拦截裁判事件是一个典型的守卫条件放错位置的问题——为避免 UI 重复展示而加的 guard,副作用比解决的问题更大。加 guard 前必须考虑异步时序:裁判回调与实时日志的生命周期是否重叠 - 教训:手写文本解析 decorator 注定脆弱。Python AST 标准库一行
ast.parse()就能拿到完整的 decorator 列表,不应该用正则/字符串扫描去对抗语言语法
🚀 未来行动设想
- 统一三端 marker 命名(全部收敛到
test_RC/test_ONLY/test_ALL),消除 PC/iOS 的历史包袱 - 为
test_execution_record建立定时统计看板,替代从主表updated_at近似的方式 - 考虑
test_ALL一次执行同时更新双环境记录,减少「RC 跑了但测试服没更新」的认知偏差 - 为
prune_stale_cases()加定时调度(如每周一次),防止脏数据再次积累
📊 自动化统计
- 捕获 Memory 数:4
- 笔记更新数:0