尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Puppeteer 变更验证实战:测试、构建与 Lint 的正确姿势(附 mocha-runner 源码级原理)

Puppeteer 变更验证实战:测试、构建与 Lint 的正确姿势(附 mocha-runner 源码级原理) Puppeteer 变更验证实战测试、构建与 Lint 的正确姿势附 mocha-runner 源码级原理【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer本文围绕 Puppeteer 仓库中指导变更验证的技能文档 SKILL.md 展开系统讲解在该 monorepo 中如何正确地跑测试包括用.only精准过滤单个用例、如何构建编译、以及如何执行 lint 与格式化。读完本文你将掌握npm run test:chrome:headless、npm run unit、npm run build、npm run format等命令背后的完整调用链wireit → mocha-runner → Mocha 自定义接口并理解测试期望文件TestExpectations.json的工作机制从而在修改 Puppeteer 代码后快速、准确地验证变更。一、验证工作流总览四条核心命令SKILL.md 将变更验证归纳为四类操作分别对应四条 npm 命令验证目标命令适用场景运行浏览器端集成测试npm run test:chrome:headless/npm run test:firefox:headless修改了与 Chrome 或 Firefox 交互的行为页面、网络、输入、CDP/BiDi 协议等运行单元测试npm run unit修改了纯逻辑代码无需启动真实浏览器检查构建/编译问题npm run build提交前确认所有 TypeScript 包能编译通过Lint 与格式化npm run format执行 linter 与 formatter报告违规并尽可能自动修复文档同时给出两条最佳实践Best practices频繁运行测试以尽早发现变更引入的问题定期执行构建以检查编译错误。二、测试.only 浏览器端测试套件2.1 用.only精准锁定单个测试SKILL.md 中最重要的测试建议是To test a specific test ALWAYS add.onlyto the relevant test block, then runnpm run test:chrome:headlessfor Chrome ornpm run test:firefox:headlessfor Firefox.即先给目标测试块加上describe.only/it.only再运行对应浏览器套件的完整命令。例如只验证某一条用例describe(Page, function () { it.only(Page.goto should work, function () { // ... }); });然后执行npm run test:chrome:headless # Chrome npm run test:firefox:headless # Firefox为什么.only在这里“永远有效”关键在于仓库自定义的 Mocha 接口。mocha-runner 通过-u tools/mocha-runner/interface.cjs加载了一个包装 BDD 接口的自定义接口见 interface.ctsit.only会将itOnly true传给内部it函数describe.only则把套件标记为isOnly: true判断逻辑在 interface.cts 第 146 行!(itOnly || describeOnly) shouldSkipTest(test)——只要命中.onlySKIP 期望即被绕过该用例一定会执行。这保证了即使TestExpectations.json把该用例标记为 SKIP开发者本地加.only后依然可以强制跑它来调试。测试用例源码位于 test/src如page.spec.ts、navigation.spec.ts等.spec.ts/.test.ts文件编译产物落在test/build/下由 mocha-runner 以test/build/**/*.test.js为 spec 模式扫描执行见 mocha-runner.ts 第 205 行。2.2 测试命令的完整调用链npm run test:chrome:headless并非直接启动 Mocha而是一条 wireit 任务链。从根 package.json 可以看到test:chrome:headless: npm test -- --test-suite chrome-headless, test: { command: npx ./tools/mocha-runner, dependencies: [build:tools, ./test:build, ./tools/mocha-runner:build] }即wireit 先构建build:toolsmocha-runner、docgen 等工具和test:buildtsc -b编译 test/ 下的用例再执行npx ./tools/mocha-runner --test-suite chrome-headless。mocha-runner 读取 test/TestSuites.json 找到chrome-headless套件其参数为[chrome, headless, cdp]再按parameterDefinitions展开成环境变量注入 Mocha 子进程parameterDefinitions: { chrome: { PUPPETEER_BROWSER: chrome }, headless: { HEADLESS: true }, cdp: {} }仓库定义了 8 个测试套件chrome-headless、chrome-headful、chrome-headless-shell、chrome-pipe、chrome-bidi、chrome-bidi-only、firefox-headless、firefox-headful每个套件对应根 package.json 中的一个 wireit 脚本。其中参数到环境变量的映射体现了协议差异Firefox 套件使用PUPPETEER_PROTOCOLwebDriverBiDiChrome CDP 套件不设置协议变量chrome-pipe额外设置PUPPETEER_PIPEtrue以走管道通信。mocha-runner 还会把过滤后的 SKIP 期望序列化进PUPPETEER_SKIPPED_TEST_CONFIG环境变量见 mocha-runner.ts 第 171-179 行供自定义接口在运行时跳过对应用例。2.3 解读失败结果TestExpectations 机制测试失败时不要只看红叉——mocha-runner 会将“实际结果”与 test/TestExpectations.json 中登记的期望做比对只有不匹配期望的结果才判定为失败unexpected result并在终端打印对期望文件的新增/删除/更新建议suggestions选项默认开启见 mocha-runner.ts 第 327-346 行。期望条目结构字段语义可参见 mocha-runner README{ testIdPattern: [bluetooth-emulation.test] *, platforms: [darwin, linux, win32], parameters: [firefox], expectations: [FAIL], comment: Firefox does not support Web Bluetooth }字段含义匹配逻辑testIdPattern测试全名或其模式*贪婪通配见下文模式示例platforms生效平台linux/win32/darwinORparameters必须匹配的套件参数如firefox、webDriverBiDiANDexpectations可接受的结果PASS/FAIL/TIMEOUT/SKIPOR模式示例[page.spec] *匹配整个文件[page.spec] Page Page.goto *匹配某 describe 块下全部用例。规则要点后定义的期望覆盖先前的期望SKIP会直接阻止用例运行。模式匹配的单元测试可参考 mocha-runner 的 test.ts。如果某条用例在本地意外通过比如你修复了它runner 会建议你删除对应期望条目若你新增的修复导致某套件结果与期望不符按终端输出的建议更新test/TestExpectations.json即可注意根命令npm run format中的format:expectations会用 tools/sort-test-expectations.mjs 对其排序。2.4 调试不稳定flaky用例结合 mocha-runner 的能力验证过程中若遇到偶发失败可用环境变量的 deflake 机制重复运行指定用例详见 mocha-runner READMEPUPPETEER_DEFLAKE_TESTS[navigation.spec] * npm run test:chrome:headless默认重复 100 次可通过PUPPETEER_DEFLAKE_RETRIES1000调整命中模式的用例会被自动包裹进带调试日志捕获的withDebugLogs套件实现见 interface.cts 的 wrapDeflake。也可以在源码中直接使用it.deflake(repeats, title, fn)或describe.withDebugLogs工具函数。三、单元测试npm run unitSKILL.md 指出运行单元测试的命令是npm run unit。从根 package.json 看它是一条 workspace 透传命令unit: npm run unit --workspaces --if-present实际执行分布在三个子包中均为node --test原生测试运行器packages/puppeteer/package.jsonnode --test --test-reporterspec lib/**/*.test.js依赖build任务先经 wireit 编译单测跑的是编译产物packages/puppeteer-core/package.json同样的lib/**/*.test.js模式packages/ng-schematics/package.jsontest/build/**/*.test.js依赖build与build:test。这意味着单测验证的是构建后的 JS 输出而非直接跑 TS 源码——如果某个包构建失败单测任务也会连带失败与 SKILL.md 中“定期构建检查错误”的实践互为补充。四、构建与编译npm run build验证构建问题只需运行npm run build这是一个 wireit 任务根 package.json 第 46-58 行其依赖覆盖了整个 monorepo 的构建 DAGbuild ├── build:tools # docgen / doctest / mocha-runner / eslint 工具 ├── packages/browsers # puppeteer/browsers 包 ├── packages/ng-schematics ├── packages/puppeteer-core ├── packages/puppeteer ├── packages/testserver ├── test # 集成测试用例tsc -b └── test/installation # 安装类测试wireit 会按依赖顺序增量构建并缓存产物因此日常只需在改动后运行一次npm run build即可确认所有 TypeScript 包含 packages/puppeteer-core 这一核心 API 实现层均无编译错误。五、Lint 与格式化npm run formatnpm run format执行 linter 与 formatter报告违规项并在可能时自动修复。它是 wireit 聚合任务包含三个子任务根 package.json 第 97-109 行子任务实际命令说明format:eslinteslint --cache --fix .用 eslint.config.mjs 的配置修复 ESLint 问题依赖build:tools含tools/eslint本地插件format:prettierprettier --write --cache .按 prettier.config.js 全仓重写格式format:expectationsnode tools/sort-test-expectations.mjs对TestExpectations.json系列文件排序CI 侧对应的只读检查是npm run lintlint:eslintlint:prettierlint:expectations均以--check/--lint模式运行不修改文件。本地开发流程建议改代码 →npm run format→npm run build→ 跑.only过滤后的浏览器测试。六、验证清单Checklist结合 SKILL.md 的最佳实践一次完整变更的验证流程可以固化为定位失败用例给目标测试块加.only运行npm run test:chrome:headlessFirefox 则用test:firefox:headless注意.only会绕过 SKIP 期望强制执行该用例解读期望差异若 runner 报告 unexpected result按终端建议增删改test/TestExpectations.json条目全量构建npm run build确认所有包编译通过格式化提交前运行npm run format让 ESLint/Prettier 自动修复频繁验证小步提交边改边跑避免大改动后一次性调试。掌握以上流程后无论是修复一个 BiDi 协议下的页面行为还是调整puppeteer-core的某段内部实现你都能用仓库自带的 wireit mocha-runner 工具链在数分钟内完成从“改”到“证”的闭环。【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表