代码写完了但不敢上线?教你在本地搭一套自动化测试流水线
昨天晚上改了一个排序算法,自测了三遍觉得稳了,半夜上线——然后被群里截图艾特了四个小时。数据全乱,用户订单顺序颠倒了,要不是数据库有快照,今天已经在写离职邮件了。
这种感觉我太熟了。
本地跑得好好的,一上线就崩。改了别人的代码不敢测全量,手动点一遍核心功能就觉得”差不多了”。说句不好听的——纯靠手测上线,就是在赌命。
为什么我不信手测了
info
我之前在一个小团队,上线流程就三步:本地跑一下 → 还行 → 部署。听起来离谱对吧?但很多独立开发者和三五个人团队就是这么干的。直到有一次我改了一个工具函数,自以为人畜无害,结果炸了三个页面。
从那之后我开始认真搞自动化测试流水线。
从零搭一套 CI 其实没那么难
直接说吧,别自己搭 Jenkins,维护成本比你写业务代码还高。我用的是 GitHub Actions + Pytest,免费额度对个人项目绰绰有余。
一个最简的 GitHub Actions 配置
1 | name: CI |
这个配置意味着什么?每次你 git push,GitHub 自动拉代码、装依赖、跑测试、出覆盖率报告。跑不过就标红,合不进主分支。
我第一次配完推上去,看着那排绿色勾勾,说实话有点爽。
不是所有代码都要写测试
这是很多人踩的坑——想一口气覆盖所有代码,写了一堆无意义的测试,然后嫌累放弃了。
warning
我现在的策略很简单:
- 必须测:核心业务逻辑、数据处理、对外 API、涉及钱的任何操作
- 选择性测:工具函数、格式化逻辑(写个快测就行)
- 不测:UI 样式、第三方 SDK 的调用(反正是别人的锅)
info
三个坑,踩了才懂
第一,测试环境依赖冲突。本地能用,CI 上缺库。最后发现是 requirements.txt 没更新,CI 装的是旧版本。后来我加了 pip freeze > requirements.txt 到发布流程里,从此没出过这种问题。
第二,超时。有个测试调了外部 API,网络波动就挂了。CI 跑了三分钟断了,我还以为是代码写崩了。解决方案:mock 外部依赖,把网络调用从测试里隔离出去。
第三,Flaky Test。最恶心的一种。十次跑九次过,一次不过,查了半天找不到原因。后来发现是多线程竞争导致的时间差问题。Flaky Test 不修等于没有测试——它会让你不再信任 CI 结果。
我的 Flaky Test 排查清单
- 检查有没有未处理的随机数或时间戳
- 检查多线程/异步的竞态条件
- 检查测试之间是否共享了可变全局状态
- 加
@pytest.mark.flaky(reruns=3)临时绕过,但必须排期修
上线敢点确认了
说实话,搭完这套流水线之后,我最明显的感觉不是 Bug 变少了(确实少了),而是心理上踏实了。
以前上线前要盯着屏幕看部署日志,手心出汗。现在 CI 跑完绿了,我甚至敢边吃泡面边点发布。不是因为我自信,是因为我知道 CI 替我检查了一遍我不可能手测完的所有路径。
如果你现在还在纯手测上线,我建议花一个周末把 CI 搭起来。第一次配可能花点时间,但之后每次 Push 都在帮你省命。
你要不要也试试?