2026-07-06 赛博日记

生成时间:2026-07-06 23:58

📝 今日概要

自动化测试大面积失败并完成系统性修复:Android 端口泄漏、PC Token 失效、隐私弹窗用例稳定性问题全部解决,代码已合并到 main 分支。

🔍 核心技术进展

Android 自动化测试修复

  • 端口泄漏根因定位(来源:Claude Code 会话)
    • 失败截图新建 session 且从不 quit() → 每次失败泄漏一个 82xx 端口
    • Appium 服务停止不清理 adb forward → 端口永久占用
    • 未配置固定 systemPort → 完全依赖 8200–8299 自动分配
    • 全局 capabilities 被原地修改 → noReset=True 污染后续用例
  • 修复措施(来源:memory/2026-07-06.md + claude 会话)
    • 修改 conftest.py:失败截图改为 try/finally 确保 quit()
    • keep_login fixture 改为 yield + finally: driver.quit()
    • 新增 cleanup_adb_forwards() 函数,session 开始/结束时清理 adb forward
    • create_android_driver 使用 dict 副本避免污染全局
    • 新增 check_adb_device_ready() 预检设备授权状态
    • 调整 session 超时配置:35 → 120 秒

Android 环境切换机制调研(来源:Claude Code 会话)

  • 两层环境含义
    • 脚本层:run.batENV=TEST 只标记跑哪套用例、DB 回写、报告归档
    • App 层:通过 change_app_environment() 在登录前置用例中 UI 切换环境
  • 切换流程
    1. 进入「我的消息」
    2. 连点右上角 9 次打开隐藏调试入口
    3. 再进「我的消息」→ 点关于我们 Logo
    4. 选择目标环境文案
    5. activate_app 重启 App 使配置生效
  • 后续用例保持环境
    • 登录用例用 android_driver_factory(清数据重装)
    • 后续用例用 android_driver_keep_loginnoReset=True

PC Token 失效排查(来源:Claude Code 会话 + memory)

  • 现象
    • 134 条用例仅 33 通过,101 失败 + 29 错误
    • 大批量失败截图在登录页
    • 错误信息:AssertionError: 无法正常进入页面
  • 根因
    • 硬编码 Token 过期(测试服 Token 会失效)
    • 跑机残留 TOKEN 环境变量(调试时写入 Windows 用户变量)
  • 解决
    • 清 Windows 用户变量 TOKEN
    • 换有效 token 并单条用例验证

隐私弹窗用例稳定性加固(来源:Claude Code 会话)

  • 问题
    • check_protocol 固定 sleep 10 秒 → session 空闲期间可能被 --session-override 清掉
    • check_dialog 超时仅 2 秒 → 批量跑时 UI 更慢易失败
    • session 中途失效 → InvalidSessionIdException
  • 修复
    • check_protocol 去掉 sleep,改为主动等待弹窗
    • check_dialog 超时从 2 → 10 秒
    • 每条用例结束后 force-stop UiAutomator2
    • 创建 driver 失败重试 1 次
    • InvalidSessionId 等错误跳过失败截图

✅ 今日待办完成

(Todoist 工具不可用,暂无记录)

💡 深度洞察与经验教训

洞察

  • 资源泄漏的隐蔽性:端口泄漏不是"业务需要 100 个并发进程",而是多次跑测累积的 adb forward 未清理
  • 两步验证的重要性:本地 MCP 探索 + pytest 验证能区分"UI 改版"和"环境不稳定"
  • session 生命周期with 上下文能保证正常结束时的 quit(),但异常中断、强杀、fixture 已建 driver 但用例未进 with 等场景仍会泄漏

教训

  • 失败截图是高危操作:失败时再建 session 必须保证 driver.quit(),否则端口永久泄漏
  • adb kill-server 的副作用:清端口时会重置 USB 调试信任关系,需重新在手机上授权
  • 全局配置污染default_option = ANDROID_CAPABILITIES 直接修改会永久改全局 dict,应用 dict() 副本
  • Appium 服务停止不等于清理appium_service.stop() 不会移除 adb forward,需手动执行 adb forward --remove-all
  • PC Token 硬编码陷阱:测试服 Token 会过期,需定期更新或改用动态获取

🚀 未来行动设想

  • 恢复 PC 动态登录取 Token(避免硬编码过期)
  • 固定 systemPort 或 session 级递增,便于排查
  • 跑机首次跑测前执行 adb kill-server && adb start-server 确保端口清空
  • 考虑将 Todoist 任务同步到 memory,实现更完整的记录

📊 自动化统计

  • 捕获 Memory 数:1 条
  • Claude Code 工作记录:183 条消息
  • 笔记更新数:0 条(其他 .md 文件不在最近 24 小时修改)
  • Todoist 完成任务数:0(工具不可用)