测试和关卡
一次改动要过的东西:后端测试、前端测试、类型检查,再加几道关卡。关卡管的是测试管不到的事——发出去的东西里有没有私人信息、密钥、旧名字。
本页 5 节
测试
后端:
.venv/bin/python -m pytest
四千多条,整套要十几分钟。看退出码和最后一行的「N passed」,别只看过滤过的几行输出。
前端(网页后台在 webui_frontend/):
npm test
npm run build
npm run build 先做类型检查再构建。前端测试至少跑三遍:偶发的失败藏在单次运行里。
测试名用中文写出行为和预期(比如「他已经回了,不撤,补一条星号正字」),数据全部是合成的。
关卡
每道关卡只管一件事,提交前都要过:
- 隐私:
scripts/privacy_gate.py source。发出去的东西和源码里不能有任何真人的私人信息(编号、邮箱、真名、聊天原话)、真实用户数据和真实路径。要查哪些私人标识,写在仓库外的一个文件里,用环境变量AERIA_PRIVACY_OWNER_IDENTIFIERS_FILE指过去;这个文件本身不进仓库。 - 密钥:
scripts/secret_gate.py source。源码树和暂存区里不能有密钥。 - 旧名字:
scripts/brand_residue.py。旧产品名每出现一次都要有归类,归不进去的就是违规。 - 界面源码:
scripts/ui_source_gates.py和scripts/ui_truth_lint.py。前一个是两条纯字符串规则;后一个查屏幕上印的数字是不是真读出来的——写死的0是一个断言,「没读到」不是0。
发版本时还有两道:scripts/audit_artifact.py 查发出去的包里有没有源码、密钥、私人数据;scripts/release_wiring_check.py 核对几份构建信息一字不差。
修一个 bug 的顺序
- 先确定地复现,拿到真实的失败输出;
- 找根因:不用重试、加等待、放宽超时去盖住它;
- 先写一条测试,确认它在改之前的代码上是红的(在临时的工作区里撤掉修复跑一遍);
- 修;
- 整套跑一遍,看退出码;
- 看用户真正会看到的东西:改了界面就截图,浅色深色、宽屏手机都看。
对应的代码
- 关卡:
scripts/privacy_gate.py、scripts/secret_gate.py、scripts/brand_residue.py、scripts/ui_source_gates.py、scripts/ui_truth_lint.py;发版本时的scripts/audit_artifact.py、scripts/release_wiring_check.py。 - 关卡自己的测试:
tests/test_privacy_gate.py(比如「前端锁文件只指向官方源,不暴露构建机用的镜像」)。 - 官网的守卫:
tests/test_site.py(样式里不写死颜色、页面数据是真函数的最新导出)。
没做到的
- 持续集成的定义写好了(
.github/workflows/ci.yml:三个系统上跑后端测试,前端、桌面壳的测试和检查),但仓库还没放上 GitHub,一次都没跑过;现在全靠提交前在本机跑一遍。 - 完整测试里有几条要真的等(并发故障、九周历史回放),整套要十几分钟。