ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

magic-resume 测试体系实战:从 Node 单元测试到 Playwright 浏览器回归

magic-resume 测试体系实战:从 Node 单元测试到 Playwright 浏览器回归 前端AI 应用开发工具【免费下载链接】magic-resumefree online AI resume editorthe only official website is https://magicv.art项目地址https://gitcode.com/GitHub_Trending/ma/magic-resume点击查看免费下载magic-resume 是一个基于 Vite React 的在线 AI 简历编辑器其 tests/README.md 定义了项目完整的自动化测试入口与运行规范。本文以该文档为骨架结合仓库源码与测试用例系统讲解test:ai、test:mobile、test:font-size三个测试套件的运行方式、前置条件、覆盖范围与底层实现原理帮助你在本地或 CI 环境中稳定复现这些回归测试并为新增功能补充测试提供参考。测试套件总览magic-resume 将测试分为两类一类是不依赖浏览器的 Node 单元测试通过tsx --test驱动另一类是基于 Playwright 的真实浏览器回归测试移动端工作台与正文字号。所有测试命令都集中在 package.json 的scripts中命令入口文件类型pnpm test:aitests/*.test.tsNode 单元测试pnpm test:resume-importtests/resume-import.test.tsNode 单元测试子集pnpm test:previewtests/preview.browser.mjs浏览器回归pnpm test:mobiletests/mobile-workbench.browser.ts浏览器回归pnpm test:font-sizetests/font-size.browser.ts浏览器回归pnpm install:playwrightplaywright install chromium依赖安装其中test:ai与test:font-size都通过tsx直接执行 TypeScript 测试文件test:mobile则使用 Node 内置的node:test运行器。一、Node 单元测试pnpm test:ai运行方式与覆盖范围test:ai是项目最轻量的测试入口通过tsx --test tests/*.test.ts运行tests/目录下的全部 TypeScript 测试文件。根据 tests/README.md它主要包含两类内容数字内容导入回归测试即tests/resume-import-content.test.ts重点验证 AI 导入简历时不会破坏以数字开头的内容既有的 AI / 导入测试即tests/resume-import.test.ts覆盖多供应商qwen、doubao、openai、deepseek、anthropic、gemini的视觉模型导入链路、错误处理与重试逻辑。如需单独运行某组测试可使用pnpm test:resume-import仅跑tests/resume-import.test.ts。数字内容导入回归源码级解析数字回归测试针对一个真实痛点简历内容中大量存在以数字开头的信息如3.5 GPA、5 years of experience、10x improvement in latency、2019 - present如果导入逻辑简单粗暴地按列表标记剥离前缀这些数据会被误删。核心实现在 src/app/app/dashboard/resumes/utils.tstoStringArray使用正则LIST_MARKER_PREFIX_REGEX /^\s*(?:[-*•]\s*|\d[.)]\s)/剥离行首标记。注意该正则只匹配「-、*、•等符号后跟空白」或「数字后紧跟./)且带空白」两种情况——也就是说1. 3.5 GPA会去掉1.前缀但3.5 GPA点后无空白会被完整保留。这正是tests/resume-import-content.test.ts中断言toStringArray(3.5 GPA\r\n5 years of experience\r\n...)等于原文的原因。测试还验证了以下行为对应 tests/resume-import-content.test.ts混合列表标记-、*、•、1.、2)被剥离且不吞内容数组输入会去除空条目、保留数字内容undefined/null/非字符串返回空数组createResumeFromAIResult将各模块的富文本描述统一转为ulli结构并对、做 HTML 转义如TypeScript React转义为TypeScript amp; lt;Reactgt;这一转换逻辑同样在 src/app/app/dashboard/resumes/utils.ts 中实现。AI 导入链路测试错误码与重试tests/resume-import.test.ts通过注入 mock fetch 验证了 src/lib/server/resume-import.ts 的完整请求链路关键断言包括各供应商请求 URL 与鉴权头正确如 Anthropic 使用x-api-key、Gemini 使用x-goog-api-key且密钥不出现在 URL 中配置非法空 key、__proto__作为 provider、file://协议、user:pass端点、非法图片、超过MAX_PDF_IMPORT_PAGES页数时不发起网络请求并返回对应错误码configRequired、invalidProvider、invalidEndpoint、invalidImages、tooManyPages超大请求体返回 413上游错误被翻译为可操作的错误码401→authenticationFailed、403→modelAccessDenied、429→rateLimited、400→modelOrEndpointError、500→upstreamError、超时→504timeout且不会把 API Key、简历原文回显给用户瞬时失败503会自动重试测试断言handleResumeImport内部重试了 3 次才返回成功模型输出为截断finish_reason: length、拒绝stop_reason: refusal、空内容或格式非法时分别报truncatedOutput、refused、emptyOutput、invalidOutput而不是当作网络错误。这些用例可以作为服务端导入 API的行为契约后续修改 src/lib/resume-import-schema.ts 或新增供应商时应同步扩展此文件。二、移动端工作台回归pnpm test:mobile运行前置条件该套件需要生产模式服务器而非开发服务器pnpm build pnpm start pnpm exec playwright install chromium webkit pnpm test:mobile文档明确说明必须使用生产模式的原因开发环境下react-grab调试浮层会拦截触摸输入。这一逻辑在 src/components/dev/ReactGrab.tsx 中可以看到——组件仅在import.meta.env.DEV为真时才动态加载react-grab因此开发模式下的 overlay 会干扰 Playwright 对移动端触摸事件的模拟生产构建则完全不含该组件。test:mobile同时在Chromium 与 WebKit两个引擎上运行见 tests/mobile-workbench.browser.ts浏览器上下文使用isMobile: true、hasTouch: true的移动端配置390×844 初始视口。若需指向其他服务器地址设置环境变量TEST_BASE_URL即可。覆盖的回归场景根据文档与测试源码套件验证以下行为标签切换在「内容 / 样式 / 预览」三个底部标签间切换断言底部导航始终完整落在视口内Math.abs(layout.bottom - layout.viewportHeight) 1短视口与窄视口依次遍历 390×844、390×660、390×360、667×375横屏、320×568 等五种视口模拟地址栏收起、软键盘弹出、横屏等可用高度变化34px 底部安全区通过给导航容器注入paddingBottom: 34px模拟 iOS 底部 home 指示条断言导航高度为65 inset、按钮不超出安全区编辑能力在 390×660 视口下进入富文本编辑器输入内容并断言写入了localStorageresume-storage验证移动端编辑数据持久化桌面布局切换将视口扩大到 1024×768 后移动端底部导航「内容」按钮应隐藏桌面端预览#resume-preview正常渲染滚动锁释放客户端路由跳转点击 logo 返回简历列表页后body不应再持有workbench-body-lock类即离开工作台时必须释放页面滚动锁。此外测试还断言页面meta[nameviewport]包含viewport-fitcover刘海屏适配并在全程监听pageerror任何未捕获的页面异常都会导致测试失败。已知边界文档特别强调视口尺寸调整只能近似模拟可用空间变化物理 iOS 键盘和 Safari 工具栏的真实行为仍需真机检查。这一边界在 tests/mobile-workbench.browser.ts 的注释中同样有说明属于设计上明确接受的测试局限不应在 CI 中盲目追求覆盖。三、正文字号浏览器回归pnpm test:font-size环境要求与安装该套件要求Node.js 20.19或受支持的更新版本项目 pnpm 依赖Playwright Chromium 浏览器。安装步骤pnpm install --frozen-lockfile pnpm install:playwrightinstall:playwright脚本等价于playwright install chromium见 package.json。在 Linux CI 上还需安装浏览器系统依赖pnpm exec playwright install --with-deps chromium为什么必须用开发服务器与移动端套件不同test:font-size要求开发服务器pnpm dev --host 127.0.0.1 --port 3000 --strictPortpnpm test:font-size原因在测试源码中一目了然测试通过 Vite 的运行时模块导入import(/src/utils/export.ts)、import(/src/store/useResumeStore.ts)直接调用现有的导出与导入函数见 tests/font-size.browser.ts因此生产/预览服务器无法替代。--strictPort保证端口占用时立即报错而非随机换端口。若开发服务器地址不同同样用TEST_BASE_URL指定。使用系统浏览器替代内置 Chromium默认使用 Playwright 捆绑的 Chromium如需改用已安装的浏览器如 Edge、Chrome设置TEST_BROWSER_CHANNEL为msedge或chrome。测试代码中对应为chromium.launch({ channel: process.env.TEST_BROWSER_CHANNEL })。PowerShell 示例$env:TEST_BROWSER_CHANNEL msedge pnpm test:font-size隔离性与产物每次运行都会创建隔离的浏览器上下文与合成简历数据基于 src/config/initialResumeData.ts 的initialResumeState构造不会修改既有浏览器会话中的简历。截图统一写入node_modules/.cache/font-size/目录含mobile-375.png、mobile-320.png、selection.png、long-content.png、failure.png等这些产物不应提交到仓库。由于样例简历引用了字体与图片资源测试要求本地应用可正常加载且相关资源可能依赖网络访问。覆盖的功能矩阵文档列出的覆盖点与测试代码一一对应tests/font-size.browser.ts鼠标选区通过TreeWalker定位目标文本并构造Range模拟真实鼠标框选mouse.down→ 分步mouse.move→mouse.up局部与混合字号选区应用 20px/24px 后断言内联样式font-size写入存储全选状态下控件显示「混合 / Mixed」默认与恢复默认未选中文本时字号控件禁用「恢复默认 / Reset to default」会移除内联字号格式保留应用字号不破坏原有strong、color、a链接等格式断言存储 HTML 同时包含color:与目标文字跨列表选择全选后设置 24px断言两个li项都被应用撤销 / 重做Ctrl/CmdZ撤销后存储中不再含font-sizeCtrl/CmdShiftZ重做后恢复持久化刷新页面后字号仍保留在编辑器与预览区#resume-preview并验证getComputedStyle实际生效全局字号继承修改globalSettings.baseFontSize默认 16见 src/config/initialResumeData.ts后未单独设置字号的文本继承全局值而局部 20px 与章节标题字号保持不变中英文标签切换NEXT_LOCALEcookie 后字号控件 aria-label 从「正文字号」变为「Body font size」选项变为「Default / Mixed / Reset to default」窄工具栏在 375px 与 320px 视口下断言字号下拉框的 bounding box 不超出视口宽度防工具栏溢出全部九套模板依次遍历classic、modern、left-right、timeline、minimalist、elegant、creative、editorial、swiss断言每套模板下局部字号与继承行为一致六个正文编辑器入口技能、自我评价、教育、经历、项目、自定义模块六个入口逐一验证字号应用。导出链路回归JSON 与 PDF套件还验证了导出功能对应 src/utils/export.tsJSON 导出 / 导入闭环通过exportResumeAsJson下载 JSON 文件解析后再调用 store 的addResume导入断言skillContent中的font-size格式未丢失导入实现见 src/store/useResumeStore.ts本地长页 PDF 下载调用exportToLongPagePdfpagePadding: 32断言下载文件以%PDF魔数开头注意它走 html2canvas jsPDF 的本地链路不会访问外部 PDF 服务浏览器打印捕获调用exportResumeToBrowserPrint通过 MutationObserver 拦截离屏 iframe 的print()断言打印文档包含font-size: 24px标记全程不弹出真实打印对话框实现在 src/utils/print.ts。PDF 检查的边界文档最后强调一个重要的测试设计原则PDF 检查只验证下载生成是否成功不验证每个 PDF 页面的视觉正确性外部 PDF 服务不会被调用。因此在调整排版typography或分页pagination时需要单独人工检查截图与实际导出布局不能依赖该测试断言视觉效果。四、环境变量与 CI 实践小结三个套件共用的环境变量如下变量作用适用套件TEST_BASE_URL指定被测服务器地址默认http://127.0.0.1:3000mobile、font-sizeTEST_BROWSER_CHANNEL使用系统浏览器msedge/chrome替代内置 Chromiumfont-sizeNEXT_LOCALE测试内通过 cookie 切换中英文界面font-size内部使用几条经过验证的实操建议Node 单元测试test:ai无浏览器依赖可在任意环境快速运行是修改 src/app/app/dashboard/resumes/utils.ts 与 src/lib/server/resume-import.ts 后的首选回归手段移动端套件必须跑在pnpm build pnpm start的生产服务器上否则react-grab会拦截触摸输入导致误报正文字号套件必须跑在开发服务器上依赖 Vite 模块导入Linux CI 记得加--with-deps所有测试产物截图、临时目录集中在node_modules/.cache/下设计上不污染仓库新增模板或新增正文编辑入口时应同步把模板 id / 入口 id 加入 tests/font-size.browser.ts 的遍历列表维持回归覆盖的完整性。这套「轻量 Node 单测 双引擎浏览器回归」的组合为 magic-resume 的 AI 导入、移动端工作台与富文本字号系统提供了可复现的质量基线配合pnpm test:previewtests/preview.browser.mjs可进一步覆盖模板预览链路。按本文的环境与命令说明操作即可在本地完整跑通这三条测试流水线。赞分享前端AI 应用开发工具【免费下载链接】magic-resumefree online AI resume editorthe only official website is https://magicv.art项目地址https://gitcode.com/GitHub_Trending/ma/magic-resume点击查看免费下载相关推荐Livewire 4 组件测试实战指南从 Pest 单元测试到 Playwright 浏览器测试Livewire 4 组件测试实战指南从 Pest 单元测试到 Playwright 浏览器测试 本文是 Livewire 4 官方文档《Testing》的中后端前端Penpot 前端测试体系实战指南CLJS 单元测试、Playwright 集成测试与浏览器实测验证Penpot 前端测试体系实战指南CLJS 单元测试、Playwright 集成测试与浏览器实测验证 Penpot 的前端 frontend/ 由 Clo前端设计系统图形学协同办公Sigma.js 测试体系深度指南Playwright 截图回归、Vitest 浏览器模式与基准测试实战Sigma.js 测试体系深度指南Playwright 截图回归、Vitest 浏览器模式与基准测试实战 导读 本文以 packages/test/READM数据可视化前端图形学上一篇7种字重免费开源宋体思源宋体CN终极完整使用指南下一篇大麦抢票自动化脚本教程从环境搭建到自动提交订单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表