凌晨两点,流水线又红了。
本地跑过。CI 挂。重跑一次,过了。再跑,又挂。人开始怀疑人生,怀疑测试,怀疑网络。最后发现,某个同事下午往共享测试库里塞了一条脏数据,主键冲突,顺序一变,全乱。
自动化测试最怕的不是断言写错。是环境不讲道理。
环境不是机器 是状态
很多人把测试环境当成一台机器。IP、账号、密码,给你,你去跑。但机器只是壳。真正的环境是状态:数据库里有什么数据,配置中心推了什么开关,缓存里躺着谁的 session,第三方 mock 服务现在返回超时还是成功。
状态会漂。漂得悄无声息。
今天上午十点,测试环境是干净的。下午三点,某条用例写了脏数据没清。晚上八点,另一个团队跑回归,踩到同一条记录。第二天早上,开发说,我本地没问题啊。
麻烦在于,环境治理不是搭一套 Docker Compose 就结束了。它更像持续打扫一个公共厨房。你可以规定谁用完谁洗,但总有人偷偷把锅泡在水池里。

有些团队试图用“专属环境”解决。每个人一套,或者每个分支一套。听着很爽。代价也直接:云账单涨,维护脚本翻倍,镜像版本分裂。更隐蔽的代价是,没人再关心环境怎么修。坏了就重建。重建久了,连怎么修都不知道。
另一些团队走共享环境。快,省,但脏。用例之间互相踩。A 用例删了 B 用例依赖的配置。C 用例改了系统时间。D 用例把限流打开,后面全超时。
说白了,这是隔离级别和成本的拉扯。没有银弹。只有取舍。
被数据咬过的人才知道脏
测试数据是环境治理里最容易被低估的部分。
配置可以代码化。服务可以容器化。数据呢?很多团队还在用“从生产抽一份,脱敏后导入”。第一次好用。第二次开始,量太大,导入慢。第三次,有人手工改了几条,没人知道。第四次,schema 变了,导入脚本崩了。
然后出现经典场景:本地能过,CI 挂了。查半天,是测试库里的订单状态和生产快照对不上。用例假设订单是待支付,实际库里那笔订单已经发货。
解决方向不复杂,但执行很烦。要么每条用例自建数据,跑完删。要么用数据工厂,按需生成。要么在事务里跑,回滚。要么给环境做快照,跑前恢复。
每种都有坑。
自建数据慢。数据工厂要维护。事务回滚不覆盖异步消息和缓存。快照恢复在容器时代快,在传统虚机里慢得想砸键盘。
我的偏见是:别追求绝对干净,追求可预期。用例不怕环境里有脏数据,怕的是不知道有什么脏数据。给数据打标签,给环境加版本,给清理加 TTL。比喊口号有用。

有个小案例。一个团队做支付回归,老在半夜挂。排查发现,不是代码问题。是定时任务在凌晨跑批,把测试账户余额改了。用例断言余额不变,当然挂。后来他们把环境按时间窗口隔离,跑批期间不跑那组用例。没多高深。但省了两个人每周三个晚上的救火。
这就是环境治理。不性感,但救命。
把环境当代码 但别当信仰

基础设施即代码,听起来是正解。Terraform、Ansible、Helm、Kustomize,把环境声明出来。改配置走 PR,环境重建可复制。
方向对。但别走极端。
我见过把测试环境完全 IaC 化之后,改一个超时时间要等半小时流水线的。也见过为了“不可变基础设施”,每次测试都重建全套依赖,结果测试跑 40 分钟,开发直接绕过 CI。
治理的目标是让测试可信,不是让运维炫技。
务实做法:核心依赖用 IaC 管住,边缘配置留逃生通道。数据库 schema 用迁移脚本,别手工改。服务版本用镜像 tag 锁定,别用 latest。环境变量从配置中心拉,但允许本地覆盖。密钥不进 Git,用临时凭证。
还有一点常被忽略:环境要有主人。没主人的环境,三天就成垃圾场。有主人,才有人回滚,有人清理,有人对“为什么这个开关是开的”负责。
清理不是收尾 是主流程
大多数团队的清理逻辑写在用例末尾。跑完删数据,关服务,释放资源。看起来合理。
但用例会失败。失败会中断。中断后,清理不执行。脏状态留下。下一条用例踩雷。然后大家开始重跑。重跑治百病,也掩盖百病。
更稳的做法是把清理做成独立阶段。不管用例成功失败,都触发。用标签标记资源,按 TTL 回收。环境创建时就写好过期时间。到点自动删。别指望人记得。
CI 里可以加一步:跑前检查环境健康度。数据库连接、缓存、mock 服务、配置版本。不健康就重建,别硬跑。跑后收集环境日志,标记异常。时间久了,你能看出哪些环境是惯犯。
成本也要算。测试环境不是免费的。云上闲置的 namespace、没删的负载均衡、忘关的数据库,都在烧钱。给环境加成本标签,按团队分摊。不是为了罚款,是为了让浪费可见。
权限同样。谁能改共享环境?谁能删数据库?谁能推配置?如果所有人都是 admin,环境治理就是一句空话。至少把生产配置和测试配置分开。至少让删除操作有审计。
最后回到那条红色的流水线
自动化测试中的环境治理,说到底是在对抗熵增。代码可以 review,环境不会自己 review。它只会慢慢变脏,直到某天全员重跑。
别想着一次性治理完。选一个最痛的点。比如测试数据清理。比如环境健康检查。比如共享环境的变更审计。做小,做慢,做成习惯。
等哪天流水线红了,大家第一反应不是“重跑一下”,而是“查环境”,这事就成了。
凌晨两点的问题,不该每天凌晨两点再发生一次。