freeCodeCamp 课程挑战测试如何用 Vitest 运行?

发布时间:2026/9/10 15:07:11
freeCodeCamp 课程挑战测试如何用 Vitest 运行? freeCodeCamp 课程挑战测试如何用 Vitest 运行【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCampfreeCodeCamp 单仓中课程挑战内容curriculum/下的挑战 Markdown 与课程结构由curriculum包内的一套 Vitest 测试来验证。当你修改了课程挑战文件、schema 或课程结构后需要跑通这套测试确认没有破坏挑战的测试套件。测试入口是 curriculum/package.json 里的一组 pnpm 脚本。环境要求以 curriculum/package.json 的engines声明为准Node.js24、pnpm10curriculum 包使用 Vitest 4.1.5。先理解测试被拆成了哪两个项目curriculum/vitest.config.mjs 使用 Vitest 的 projects 模式聚合了两个测试项目import { defineConfig } from vitest/config; export default defineConfig({ test: { projects: [vitest.tooling.config.mjs, src/test/vitest.config.mjs] } });工具测试项目vitest.tooling.config.mjs 只声明了exclude: [src/test/blocks-generated/**/*.test.js, dist, node_modules]用于运行 curriculum 工具代码schema 校验、过滤器等自身的测试。课程内容测试项目src/test/vitest.config.mjs 只包含blocks-generated/**/*.test.jsenvironment: nodehookTimeout: 60000、testTimeout: 30000、isolate: false并声明了globalSetup: vitest-global-setup.mjs和setupFiles: vitest-setup.mjs。真正运行课程挑战测试的就是这个项目。准备条件课程内容测试的全局 setupsrc/test/vitest-global-setup.mjs在每次运行时做三件事把tools/client-plugins/browser-scripts/dist/js拷贝到src/test/stubs/js先删除该目标目录再重建在127.0.0.1:8080启动本地静态服务用于向浏览器提供 test-runner 与 stubs 文件通过 Puppeteer 启动一个 headless Chrome参数含--no-sandbox、--disable-setuid-sandbox、--disable-dev-shm-usage并把连接地址导出为PUPPETEER_WS_ENDPOINT供各测试池复用src/test/vitest-setup.mjs 按VITEST_POOL_ID为每个池创建独立的 browser context。因此运行前需要满足在仓库根目录安装依赖pnpm installtools/client-plugins/browser-scripts必须先构建出dist/js否则全局 setup 没有可拷贝的产物。该包的构建脚本tools/client-plugins/browser-scripts/package.json是 webpack production 打包cd tools/client-plugins/browser-scripts pnpm buildPuppeteer 需要本地 Chrome 可执行文件curriculum 包提供了安装脚本即puppeteer browsers install chrome --forcecd curriculum pnpm install-puppeteersetup 使用固定端口127.0.0.1:8080该端口被占用会导致本地服务无法监听运行前先确认空闲。需要注意的副作用全局 setup 会删除并重建src/test/stubs/js测试文件生成步骤会删除并重建src/test/blocks-generated目录。两者都是本地测试产物目录不属于课程源文件。生成 block 测试文件test-gen课程内容测试不是直接指向挑战 Markdown而是先为每个 block 生成一个测试文件cd curriculum pnpm test-gen该脚本是tsx ./src/test/utils/generate-block-tests.tsgenerate-block-tests.ts解析课程结构后为每个 block 在src/test/blocks-generated/下写出一个${block}.test.js文件内容形如文档示例import { defineTestsForBlock } from ../test-challenges.js; await defineTestsForBlock({ block: basic-javascript });实际参数是JSON.stringify后的 filter 对象含block字段。成功后会打印Generated N block test file(s).其中 N 为课程中的 block 数量。真正的测试断言由 test-challenges.js 中的defineTestsForBlock提供它使用 Vitest 的describe/it/expect结合challenge-schema.js、curriculum-schema.js、meta-schema.js等 Joi schema 校验挑战与课程结构并通过 Puppeteer 浏览器执行挑战内嵌的测试代码TypeScript 编译在测试中被 mock 为进程内编译见该文件顶部的vi.mock。运行测试curriculum/package.json 提供了四个脚本按需选择命令实际执行适用场景pnpm testNODE_OPTIONS--max-old-space-size7168 pnpm test-gen vitest run完整运行两个项目一次性验证pnpm test-contentpnpm test-gen pnpm test --project test只验证课程内容测试项目pnpm test-toolingpnpm test --project freecodecamp/curriculum只验证工具代码测试项目pnpm test:watchpnpm test-gen vitest修改代码时的 watch 模式在仓库根目录也可以用pnpm test-curriculum-content它等价于turbo -Ffreecodecamp/curriculum test-content。最短主路径如下按顺序执行pnpm install cd tools/client-plugins/browser-scripts pnpm build cd ../.. cd curriculum pnpm install-puppeteer pnpm test-content其中pnpm install-puppeteer在本地已装好 Chrome 时可跳过NODE_OPTIONS--max-old-space-size7168已由test脚本内置用于给整轮测试扩大 Node 堆内存无需手动设置。结果验证test-gen阶段输出Generated N block test file(s).可对照src/test/blocks-generated/下的文件数量确认生成完整。测试阶段vitest run结束时输出中没有失败用例且进程退出码为 0 即为通过若有挑战的测试用例失败Vitest 会列出失败的测试文件与断言信息退出码非 0。排查与限制全局 setup 失败、浏览器侧加载不到 test-runner先确认tools/client-plugins/browser-scripts/dist/js是否存在不存在则回到准备条件中执行 browser-scripts 的构建。Chrome 启动失败执行pnpm install-puppeteer重新安装 Chrome 可执行文件。超时类失败内容项目已把hookTimeout放宽到 60000、testTimeout到 30000 并关闭 isolate整轮运行依赖--max-old-space-size7168的堆内存配置不要去掉它。课程内容项目只运行src/test/blocks-generated/下生成的文件修改了curriculum/challenges/下的挑战文件后重新运行pnpm test-content它包含 test-gen即可重新生成并执行测试。课程内容的浏览器执行路径依赖固定端口 127.0.0.1:8080 上的本地静态服务测试运行期间该端口由 setup 占用运行结束时 setup 的 teardown 会关闭浏览器与服务。本地内容测试通过后从仓库根目录执行pnpm test-curriculum-content可以复现与 turbo 构建链路一致的运行方式。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考