测试体系
概述
ncc 使用 Jest 作为测试框架,测试分为三类:集成测试、CLI 测试和单元测试。测试默认运行 dist/ 中的编译产物,coverage 模式下运行 src/ 源码。
测试配置
运行命令需要特殊 Node.js 参数:
--expose-gc:允许测试手动触发 GC(global.gc()),避免内存积累--max_old_space_size=4096:部分测试包(如 twilio)编译时内存开销大
集成测试
文件结构
测试运行器 (test/integration.test.js)
每个集成测试文件是一个可执行的 Node.js 脚本,通过 ncc run --no-cache 编译并执行。测试通过的标准是进程正常退出(exit code 0)。
平台跳过规则
额外测试
验证特定功能:
--target es5配合 web-vitals"type": "module"包的正确处理
CLI 测试
文件结构
测试用例格式 (test/cli.js)
每个用例可定义:
args:CLI 参数数组env:环境变量覆盖timeout:超时时间(用于 watch 模式测试)expect:期望结果,支持三种形式:{ code: N }:期望退出码{ timeout: true }:期望超时function(code, stdout, stderr, timedOut):自定义验证
测试运行器 (test/cli.test.js)
CLI 测试通过 child_process.fork() 运行,每个测试是一个独立进程。
CLI 测试覆盖的场景
测试固件
原生模块测试
通过 pnpm build-test-binary 编译为 test/integration/hello.node,验证 ncc 能正确处理原生 .node 文件。
Coverage 模式
差异:
- 使用
--runInBand(串行执行,确保覆盖率收集正确) - 设置全局变量
global.coverage = true - 测试运行器加载
src/cli.js而非dist/ncc/cli.js - 生成 HTML 和 LCOV 格式的覆盖率报告
测试超时
- 集成测试:200 秒(
jest.setTimeout(200000))— 大型包编译耗时 - CLI 测试:20 秒(
jest.setTimeout(20000))