为什么我这个刚升技术组长的“老油条”,开始疯狂推测试工具?

CtrlV艺术家
2025-12-13 20:50
阅读 304

大家好,我是阿哲,坐标北京,每天通勤一小时(对,就是那种早上七点挤进地铁、晚上九点才出公司楼的节奏)。工作快五年了,上个月刚被“提拔”为技术组长——说白了就是背锅位提前锁定,工资涨得还没我MacBook风扇转得快。

最近除了带两个新人、和产品经理Battle需求边界、半夜被运维叫醒处理线上告警之外,我还干了一件让团队“怨声载道”的事:强制推行自动化测试工具链
是的,你没听错。上周五晚上十点半,我还在群里@所有人:“明天晨会前,把单元测试覆盖率提到70%,不然双11大促出了问题,咱们一起在工位上过年。”

今天写这篇《为什么测试工具?》不是为了装X,而是想掏心窝子聊聊:一个曾经觉得“能跑就行”的糙码农,是怎么被现实毒打到跪着求测试工具救命的。


事情还得从去年双11说起

去年我们搞了一个“智能推荐弹窗”功能,产品经理画了个巨复杂的用户路径图,说什么“千人千面+实时行为触发”。我带着俩兄弟吭哧吭哧干了三周,代码写得那叫一个“优雅”——用了最新版的React Hook + 自研状态管理,连TypeScript泛型都玩出了花。

上线前三天,测试同学跑过来一脸懵:“阿哲,你们这个弹窗在iOS Safari下不显示,安卓微信里点关闭按钮会闪退,还有……用户如果快速连续点击三次,页面直接白屏。”

我当时内心OS:“这特么是前端能控制的?浏览器兼容性问题找我??”

但嘴上还是笑着说:“好的好的,马上修。”
结果呢?修一个Bug引出三个新Bug。最后上线前夜,我和测试、运维、产品四个人围在会议室,一边喝冰美式一边手动点一百种组合场景。凌晨三点,我盯着Chrome DevTools里那个诡异的Uncaught TypeError: Cannot read property 'xxx' of undefined,真的想砸电脑。

那一刻我悟了:靠人肉点点点,迟早被点死。


被领导“逼”着学测试工具

升组长后,老大找我谈话:“阿哲啊,你们组上次事故,根因分析写了八页PPT,但核心就一条——缺乏自动化回归。”
他顿了顿,递给我一本书:《测试驱动开发:ByExample》(Kent Beck写的,经典中的经典)。

说实话,我以前觉得TDD是“学院派玩意儿”,业务迭代这么快,哪有时间先写测试再写逻辑?但那次事故后,我翻开了这本书,越看越脸红。书里那句“测试不是成本,而是保险”直接戳中我。

再加上最近我在偷偷学AI(别问,问就是怕被时代淘汰),发现连大模型都在用大量测试集验证输出稳定性——靠谱的系统,从来不是靠“祈祷”上线的。

于是,我决定:必须给团队上测试工具链!


选型踩坑实录:从Jest到Cypress,再到Playwright

一开始我想当然地选了Jest——毕竟React生态标配嘛。写了几百行describe/it,覆盖率报表也漂亮了。结果呢?全是“假阳性”

比如这段“看似完美”的测试:

// user.service.test.ts
test('should return user data', async () => {
  const mockUser = { id: 1, name: 'Alice' };
  jest.spyOn(api, 'fetchUser').mockResolvedValue(mockUser);
  
  const result = await getUser(1);
  expect(result).toEqual(mockUser); // ✅ Pass!
});

看起来没问题?但实际线上因为网络超时、token过期、后端字段变更……各种边缘情况根本没覆盖。单元测试只测了“理想世界”,而现实是地狱模式。

后来我们引入了集成测试,试了Cypress。配置倒是简单,但遇到几个痛点:

  • 在CI/CD里跑太慢(每次要启动浏览器)
  • 对Shadow DOM支持差(我们用了Web Components)
  • 并行执行不稳定,经常因为端口冲突挂掉

最后咬牙切齿换成了 Playwright。虽然学习曲线陡了点,但它有三大杀招:

  1. 跨浏览器支持(Chromium/Firefox/WebKit一键切换)
  2. 自动等待机制(再也不用cy.wait(2000)这种玄学代码)
  3. 录制回放 + 代码生成(新人也能快速上手)

现在我们的CI流程长这样:

# .github/workflows/test.yml
- name: Run E2E Tests
  run: npx playwright test --project=chromium --project=firefox
- name: Upload Coverage
  run: npx nyc report --reporter=lcov && codecov

真实效果:从“救火队员”到“睡安稳觉”

推行三个月后,数据说话:

指标 推行前 推行后 变化
线上P0事故/月 2.3 0.4 ↓82%
回归测试耗时 4h/人/次 20min(自动) ↓92%
新人上手速度 2周 3天

最爽的是上周五——产品经理临时加了个“节日皮肤”需求,要求两小时内上线。我直接说:“改吧,改完跑一遍Playwright,通过就发。”

结果?25分钟搞定,零人工干预。
我甚至准时下班去吃了顿火锅(在北京,这简直是奢望)。


血泪教训 & 最佳实践

踩了这么多坑,总结几条真心话:

  1. 别追求100%覆盖率
    我见过团队为了冲90%覆盖率,给console.log都写测试。关键路径覆盖 > 数字游戏。我们定的标准是:核心业务链路(如支付、登录)必须100%覆盖,UI组件>70%,工具函数>50%。

  2. 测试也要Code Review
    测试代码烂,等于埋雷。我们现在PR必须包含对应测试,且测试逻辑要清晰可读。比如:

    // ❌ 别这么写
    test('works', () => { ... })
    
    // ✅ 这样写
    test('should disable submit button when form is invalid', () => { ... })
    
  3. 和测试同学结对编程
    别把测试当“对立面”!我们每周和QA开一次“测试用例共建会”,他们提场景,我们写自动化脚本。信任感拉满,甩锅大会变协作现场。

  4. 工具链要轻量、易维护
    别一上来就搞TestNG+Jenkins+Allure全家桶。我们从一个playwright.config.ts开始,逐步加报告、加截图、加视频录制。小步快跑,别想一口吃成胖子。


最后:测试工具不是银弹,但它是你的安全网

我知道,很多兄弟会觉得:“需求都做不完,哪有空写测试?”
我也经历过那个阶段——Deadline压顶时,谁不想注释掉所有测试直接merge?

但现实很残酷:省下的那点时间,迟早以十倍代价还回来。

就像我那本翻烂了的《测试驱动开发》,扉页上写着:“你不是在写测试,你是在定义系统应该做什么。

现在,每当我看到CI绿灯亮起,心里就踏实一分。
不是因为代码多牛,而是因为我知道——哪怕半夜报警响起,我也大概率不用爬起来修。

(当然,如果运维又乱动生产配置,那另说 😏)


如果你也在经历“人肉测试地狱”,不妨试试从一个小工具开始。
别等线上炸了才想起测试的好。

对了,最近我在用Playwright + AI生成测试用例(比如用LLM解析PRD自动生成E2E脚本),效果还挺魔幻……下次有机会再分享!


技术分享不易,点赞关注不迷路。
我是阿哲,一个终于学会“先写测试再写bug”的普通技术组长。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝