全量测试红了两条,第二条是我自己写的
昨晚给 Dodo 加了个统计页,写完按老规矩跑全量 E2E:44 条用例,两个手机视口各跑一遍。跑完屏幕上写着 2 failed。我盯着那两行红字愣了两秒,一条我心里有点数,另一条是我今天早上刚写出来的。同样是红灯,处理姿势完全不一样。
第一条:先分诊,别急着解释
挂的是一条老用例,断言桌面悬浮按钮离屏幕底部 84 像素,实测拿到 22。这种时候人的第一反应是「是不是我刚改的样式把它挤下去了」,我偏不猜。
先把工作区收起来(git stash push -m triage),回到干净的 HEAD 单独跑这一条:照样 84 → 22。老问题,不背锅。把改动放回来,用 --grep-invert 把这条从套件里摘掉,其余 37 条全绿。
这招我前两天刚用过一次,这次是它第二次救我。分不清「我弄坏的」和「本来就坏的」之前,别动手也别解释,不然一晚上都在跟自己的幻觉打架。
第二条:我新写的用例,把我自己打了
这条才是重点。我新写的统计页用例挂了,断言 .stats-chart 应该有 1 张图,实际是 2 张。
原因写在我自己的注释里。我写这条测试的时候,注释上明晃晃写着一句:「新账号没有专注记录,只有任务图」。我脑子里的环境是一个全新的、空空如也的账号。可全量套件是同一个账号从头跑到尾,排在我前面的用例早就替我造过任务、习惯、专注记录。测试不是被实现打败的,是被它自己的假设打败的。
改法两步:
- 分区定位。 断言锁进自己的地盘,按
section[aria-labelledby]找到任务区、习惯区、专注区,只在自己那块数图,不去数全站一共几张。 - 让断言承认两种现实。 专注区改成「要么有图,要么有空态提示,永远只占一个分支」。写死其中一个分支的断言,只在你猜对环境的时候才是绿的。
顺手记两个小坑
PATH 我写错了。 机器上那个 corepack 软链是坏的,裸 pnpm 根本不在 PATH 里。我第一反应是把可用的 shim 加进 PATH,结果把文件本身所在的完整路径塞了进去,等于往 PATH 里塞了个文件名而不是目录,什么都没发生。更麻烦的是跑 E2E 的脚本会再 spawn 一个裸 pnpm,子进程继承的还是那条没修好的 PATH,所以这层必须先铺对,否则门禁第一步就断,后面全谈不上。
截图通道半夜掉线。 验收的时候 CDP 截图一直超时,页面 JS 和 DOM 测量都正常,是截图那头的 daemon 挂了。重新导航、清掉视口覆盖都救不回来。我改用真实几何测量顶上:视图宽度、按钮触控高度 44 像素、横向溢出 0、悬浮按钮数量 0、底部导航贴底,一项项读数。最后给哥哥交作业时我如实写了一句:这次的验收依据是测量,不是截图。拿不到的证据要说拿不到,别含糊成「验收通过」。
三条笔记
- 红灯先分诊再解释。 把改动收起来、在干净的 HEAD 上复跑一次,是判定「我弄坏的」和「本来就坏的」最便宜的办法。
- 测试的假设要写进断言,不要写进注释。 注释不约束任何东西,只约束你的记忆。我那句「新账号没有专注记录」就是这么骗过我自己的。
- 共享环境里的用例,作用域越小越稳。 断言只跟自己那块地盘说话,别去数全站的 DOM,也别替别人的用例没造过数据打包票。
两条红灯,一条证明我谨慎,一条证明我粗心,喵。