UI 自动化:生产环境 UI 巡检系统怎么设计

生产环境 UI 巡检和测试环境回归,表面上都在点页面,实际上是两套完全不同的系统设计题。

回归更关注:

  • 覆盖率
  • 变更验证
  • 多路径组合

而生产巡检更关注:

  • 是否低侵入
  • 是否高信号
  • 是否低噪声
  • 是否能在失败后快速给出方向

如果把测试环境一整套 UI 回归直接搬去线上,通常只会得到两个结果:

  • 巡检对线上形成扰动
  • 大量告警没有决策价值

所以 UI 巡检的思路一直需要保持克制。不是不能测更多,而是必须先想清楚:哪些路径值得在生产环境里长期、自动、无人值守地验证

一、怎么选择生产巡检路径

通常只保留三类路径。

1. 登录链路

这是最典型、最有信号的入口。很多线上故障,用户第一感知就是“系统进不去了”。

2. 核心页面可达性

例如:

  • 首页
  • 核心列表页
  • 任务详情页

这些页面代表用户最核心的入口是否还正常。

3. 极少量轻量操作

如果业务要求必须验证写路径,我只会保留:

  • 可回收
  • 可标记
  • 不污染真实业务

的轻量动作,例如创建巡检专用测试对象然后立刻回收。

二、哪些场景绝对不应该进高频生产巡检

通常会避免把这些放进高频 UI 巡检:

  • 超长提交流程
  • 会占用稀缺资源的操作
  • 会触发真实下游任务的动作
  • 强依赖第三方页面稳定性的复杂路径
  • 会引发真实通知、消息、审批的流程

这类路径不是不能验证,而是不适合高频、自动、无人值守地在生产环境执行。

三、在真实系统里怎么选工具

如果是浏览器化巡检,通常会在两个方向里选:

  • Playwright: 已有成熟 UI 自动化资产时优先复用
  • chromedp: 巡检服务本身是 Go 系统,更偏浏览器探针时更合适

外围一般再配:

  • Jenkins 或平台定时任务
  • 截图存储
  • 企业微信 / 邮件通知
  • 结果入库

这里的一个核心原则是:巡检系统应该更像探针服务,而不是把整套测试框架扔到生产上

四、一个真实巡检任务链路会怎么走

以“后台登录 + 首页打开 + 核心列表页加载成功”为例,通常会这样设计:

  1. 打开登录页
  2. 等待用户名、密码输入框可见
  3. 输入巡检专用账号
  4. 点击登录
  5. 等待首页关键元素加载
  6. 跳转核心列表页
  7. 等待关键表格或主按钮出现
  8. 保存截图、URL、加载耗时
  9. 回写结果到巡检服务

为什么到这里就收手,不再继续点更多:

  • 这条路径已经足够验证“用户能不能进入并使用核心界面”
  • 再往后每增加一步,扰动和噪声都会明显上升

五、我为什么特别强调“低侵入”

UI 巡检最大的风险,不是跑不稳,而是它自己成为线上噪声源。

典型问题包括:

  • 用真实账号触发异常提醒
  • 创建测试对象污染运营数据
  • 大量打开页面导致后台日志和监控被污染
  • 高频巡检给核心系统增加额外浏览器流量

所以通常会做这些约束:

  • 使用专用巡检账号
  • 使用专用测试对象或带明显 probe 标识的数据
  • 写操作必须可回收
  • 高频任务只走登录和只读链路
  • 对探针频率做上限控制

如果做不到这些,我宁可少测一点,也不会为了“覆盖看起来更全”去碰高风险链路。

六、降噪为什么是生产巡检的核心能力

线上巡检最怕的不是漏掉一次单点失败,而是所有人都被一堆没有价值的消息吵麻木。

常见噪声来源包括:

  • CDN 短时抖动
  • 静态资源偶发加载慢
  • 登录验证偶发波动
  • 浏览器启动偶发慢
  • 某个第三方前端资源偶发超时
  • 某次发布后的短时缓存不一致

所以通常会做:

1. 单次失败自动重试

尤其是登录页和首页加载失败,先做一次短间隔重试。

2. 连续失败再升级

不是第一下红了就高优先级打人,而是连续两次或三次失败后再升级。

3. 保留首失败和重试后的截图

这样可以快速判断:

  • 是短时白屏
  • 是跳登录页失败
  • 还是页面结构已经异常

4. 和接口巡检做联合判断

如果 UI 和接口都失败,优先级会更高;如果 UI 失败但接口健康,通常更像前端或静态资源问题。

七、怎么表达巡检结果,才有值班价值

我不希望巡检结果只剩一句“任务失败”。至少应该带上:

  • 探针名称
  • 环境
  • 当前页面 URL
  • 失败步骤
  • 页面截图
  • 最近一次成功时间
  • 本次耗时
  • 重试结果

如果还有余力,会再保留:

  • 浏览器 console error 摘要
  • 页面主请求失败摘要
  • trace 或简化版操作链路

这样值班的人收到消息后,能在几十秒内判断问题方向,而不是先去平台里盲找。

八、一个更接近现场的失败场景

比如某次巡检在“登录成功后进入首页”这一步失败。没有留痕的系统只会告诉你“case failed”。但更成熟的系统应该能告诉你:

  • 登录页已经提交成功
  • 当前 URL 仍然停留在 /login
  • 页面截图显示顶部有“系统繁忙,请稍后再试”
  • 控制台出现一个认证请求 502
  • 重试一次后成功

这几条信息一出来,你几乎就能判断:

  • 不是账号密码错误
  • 更像后端认证或网关短时波动
  • 不是页面结构性失效
  • 当前更适合作为观察告警,而不是立刻升级成业务故障

这才是巡检真正有价值的地方。

九、为什么 UI 巡检更适合和接口巡检配合

UI 巡检不适合被单独当成万能方案。更合理的组合是:

  • 接口巡检负责业务可用性信号
  • UI 巡检负责用户入口和核心页面信号

例如:

  • 接口健康,但 UI 白屏,说明前端或静态资源有问题
  • UI 能开,但接口探针失败,说明页面可能只是壳子还活着
  • UI 和接口都失败,说明更可能是核心业务或基础设施故障

两者结合,线上判断才更准确。

十、如果把巡检做成系统,怎么分层

更倾向把它做成:

1
2
3
4
5
6
probe/
├── scheduler/ # 定时任务与频率控制
├── browser-worker/ # Playwright / chromedp执行器
├── artifact/ # 截图与trace
├── classifier/ # 失败分类
└── notifier/ # 告警与升级

这里最关键的是:

  • browser-worker 不做业务判断,只做探针执行
  • classifier 做失败归因
  • notifier 决定怎么告警

这样后续想增加更多探针、更多降噪规则和更多通知渠道时,系统不会迅速失控。

十一、怎么判断这套 UI 巡检设计对了

我主要看这些结果:

  • 是否能更早发现“用户进不去”的问题
  • 是否不会频繁污染线上业务
  • 是否把消息控制在可持续消费的范围内
  • 是否失败后能快速定位是登录、跳转、资源加载还是页面本身异常
  • 是否和接口巡检形成互补,而不是互相打架

如果这些都没有实现,那这套巡检大概率只是把测试脚本搬上了生产,并没有真正形成线上探针系统。

十二、结语

生产环境 UI 巡检系统的重点,从来不是跑更多页面,而是把最关键的用户路径压缩成低侵入、高信号、能快速指向故障方向的浏览器探针系统。真正成熟的 UI 巡检不是“脚本更长”,而是“动作更克制、信号更可靠、分类更清晰、定位更直接”。

本章延伸阅读