ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

认证系统测试工程化:Convex + Better Auth 如何用三层防线兜住每一次登录

2026/8/21 15:59:09 拓冰建站 浏览量
认证系统测试工程化:Convex + Better Auth 如何用三层防线兜住每一次登录 认证系统测试工程化Convex Better Auth 如何用三层防线兜住每一次登录【免费下载链接】better-authConvex Better Auth 项目地址: https://gitcode.com/gh_mirrors/con/better-auth某个凌晨线上服务集体失联——所有用户被强制登出后台日志里挤满了会话校验失败。排查半天罪魁祸首只是一行改动会话刷新钩子把无会话的/get-session请求也当成了刷新时机JWT 被反复重置。这种边界 Bug 靠人肉点页面几乎测不出来而Convex Better Auth之所以敢把认证交给一个开源组件靠的是src/里密布的测试与 e2e/ 下的完整流水线——用测试工程化把正确变成可重复验证的结论。我们要解决什么认证测试的四个硬骨头链路太长认证涉及数据库、会话令牌、Cookie、跨域跳转Bug 藏在会话过期该返回什么JWT 在哪个接口刷新这类边界里环境太脆测试要连真实 Convex 后端密钥、环境变量稍不一致结果就不可复现数据太脏多次运行测试会留下脏数据互相污染回归太贵改一行逻辑可能悄悄破坏登录主流程等用户来报障才发现。分层破解让每层测试只回答一个问题第一层防线Vitest 毫秒级单测钉死边界条件逻辑细节不值得动用浏览器。项目在 vitest.config.ts 里把测试环境设为edge-runtime与认证代码真实运行的边缘运行时对齐让断言贴近生产行为。看 src/plugins/convex/index.test.ts 怎么测 JWT Cookie 刷新钩子它精确构造不同 path 与 session 上下文断言/update-session必须触发、无会话的/get-session绝不能触发——正是文章开头那场事故的反面用例。更妙的是npm test实际执行vitest run --typecheck单测与 TypeScript 类型检查一次跑完一道命令拿到双重保障。第二层防线convex-test 让组件在内存里真实读写纯单测碰不到组件与数据库交互这条路径而 src/test.ts 导出的register函数把 better-auth 组件注册进 convex-test 的内存实例register(t, betterAuth);配合 src/test/adapter-factory/ 下的认证流、字段重命名、插件表、额外字段等场景无外部依赖即可模拟真实读写路径快且稳。这层补上了第一层缺的数据库层也让第三层不用重复验证这类细节。第三层防线Playwright 验证完整用户旅程逻辑对不对由前两层负责体验通不通交给 E2E。e2e/tests/ 下的三个用例串起注册、登录、会话持久化任何一环断开都会立刻暴露。实战深挖一条命令复现注册→登出→登录看 e2e/tests/sign-in.spec.ts 如何走完整链路先生成一个带时间戳的唯一邮箱注册成功 → 登出 → 用同一凭证再登录最后断言页面上出现auth-authenticated状态。表单操作细节封装在 e2e/helpers/auth.ts用例本身只剩骨架。真正的工程功底在环境即代码上。跑npm run test:e2e时e2e/backendHarness.js 会按平台自动下载最新 Convex 本地后端二进制并拉起全新实例生成随机 admin keye2e/run-e2e-tests.sh 随即注入隔离的BETTER_AUTH_SECRET与测试标识并部署函数e2e/playwright.config.ts 再启动示例前端到指定端口。整条流水线跑完即销毁本地存储绝不污染开发数据——任何人 clone 后跑同一条命令都能得到相同结果。经验锦囊三条可迁移的工程素养按层级分工别用大炮打蚊子分支逻辑交给毫秒级单测别浪费昂贵的浏览器测试交互链路才轮到 Playwright。这条原则决定了三层防线各自的粒度。环境即代码复现即正义后端、密钥、环境变量全部脚本化如BETTER_AUTH_SECRET只在测试脚本里注入环境成了仓库的一部分而不是某个同事的笔记本。唯一数据源从根上隔离每次 E2E 用Date.now()拼唯一邮箱测试数据天然互不干扰连清理都不用做。写在最后认证系统的可靠性永远值得用自动化去守护。下次当你的线上服务又因一行边界判断而集体失联时不妨照这套三层防线搭起自己的测试工程化体系——把防线建在提交之前而不是等事故之后。【免费下载链接】better-authConvex Better Auth 项目地址: https://gitcode.com/gh_mirrors/con/better-auth创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考