代码写完了但不敢上线?教你在本地搭一套自动化测试流水线

昨天晚上改了一个排序算法,自测了三遍觉得稳了,半夜上线——然后被群里截图艾特了四个小时。数据全乱,用户订单顺序颠倒了,要不是数据库有快照,今天已经在写离职邮件了。

这种感觉我太熟了。

本地跑得好好的,一上线就崩。改了别人的代码不敢测全量,手动点一遍核心功能就觉得”差不多了”。说句不好听的——纯靠手测上线,就是在赌命。

为什么我不信手测了

info

我之前在一个小团队,上线流程就三步:本地跑一下 → 还行 → 部署。听起来离谱对吧?但很多独立开发者和三五个人团队就是这么干的。直到有一次我改了一个工具函数,自以为人畜无害,结果炸了三个页面。

从那之后我开始认真搞自动化测试流水线。

从零搭一套 CI 其实没那么难

直接说吧,别自己搭 Jenkins,维护成本比你写业务代码还高。我用的是 GitHub Actions + Pytest,免费额度对个人项目绰绰有余。

一个最简的 GitHub Actions 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
name: CI
on: [push, pull_request]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install -r requirements.txt
- run: pytest tests/ --cov=src --cov-report=term

这个配置意味着什么?每次你 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 排查清单

  1. 检查有没有未处理的随机数或时间戳
  2. 检查多线程/异步的竞态条件
  3. 检查测试之间是否共享了可变全局状态
  4. 加 @pytest.mark.flaky(reruns=3) 临时绕过,但必须排期修

上线敢点确认了

说实话,搭完这套流水线之后,我最明显的感觉不是 Bug 变少了(确实少了),而是心理上踏实了。

以前上线前要盯着屏幕看部署日志,手心出汗。现在 CI 跑完绿了,我甚至敢边吃泡面边点发布。不是因为我自信,是因为我知道 CI 替我检查了一遍我不可能手测完的所有路径。

如果你现在还在纯手测上线,我建议花一个周末把 CI 搭起来。第一次配可能花点时间,但之后每次 Push 都在帮你省命。

你要不要也试试?