Testing
由于 Rspack 使用 Rust + TypeScript 代码混合编写,因此会针对两者使用不同的测试方案。
Rust 测试
Rust 测试仅适用于原子功能的单元测试,无法测试完整构建流程。如需测试完整构建流程,请编写 Node 测试用例
运行 Rust 测试
通过 ./x test rust 或者 cargo test 可运行 Rust 代码中的测试用例。
编写 Rust 测试
用例编写在 Rust 代码内部,用于对当前文件内的函数提供单元测试。如:
更多信息请参考:Rust: How to Write Tests
Node 测试
Rspack 的测试用例包括如下:
- Rspack 核心测试用例,存放在
tests/rspack-test文件夹下,会通过模拟构建流程以运行测试用例。通常情况下,都在此文件夹下添加测试用例。 - Rspack 其他包的测试用例,存放在
packages/{name}/tests文件夹下,仅当修改对应包时添加/修改。
通过在根文件夹下运行 ./x test unit 或 pnpm run test:unit 即可运行 Rspack 测试。
也可以进入 tests/rspack-test 文件夹并运行 npm run test 来运行测试用例,并且对测试流程进行更精细的控制:
- 需要刷新测试快照时:添加
-u参数,如npm run test -- -u - 需要过滤测试用例时:添加
-t参数,如npm run test -- -t configCases/asset即可仅运行tests/rspack-test/configCases/asset文件夹下的用例。匹配支持正则,详见 rstest
运行测试
可以通过如下方式运行这些测试用例:
- 根目录下运行
./x test unit或pnpm run test:unit。 - 或在
tests/rspack-test目录下运行npm run test。 - 如需更新 snapshot,在
tests/rspack-test目录下运行npm run test -- -u。 - 如需传入特定 rstest cli 参数,在
tests/rspack-test目录下运行npm run test -- {args}。 - 如需过滤特定测试用例,在
tests/rspack-test目录下运行npm run test -- -t path-of-spec。- 如
npm run test -- -t configCases/asset即可仅运行tests/rspack-test/configCases/asset文件夹下的用例(config 会自动映射到 configCases,其他文件夹类似)。
- 如
- 如需使用 Rspack Wasm 运行测试用例,需要额外配置以下环境变量:
NAPI_RS_FORCE_WASI=1: 强制使用 Rspack Wasm 而不是原生绑定WASM=1:启用 Wasm 专用的测试配置NODE_NO_WARNINGS=1: 关闭 Node.js 的 Wasm 警告。
目录规范
文件夹 tests/rspack-test 的结构如下所示:
{Name}.test.js 作为测试的入口文件,会遍历 {name}Cases 并运行其中的用例。因此当你需要添加/修改测试用例时,请根据需要测试的功能类型在相应的 {name}Cases 文件夹下添加用例。
测试类型
目前已有的测试类型有:
- Normal:用于测试配置无关的核心构建流程。当你的测试无需添加
rspack.config.js时可使用此测试类型。 - Config:用于测试构建配置项。如果你的测试需要通过
rspack.config.js添加特定配置才可以运行时,且不符合其他场景时可使用此测试类型。 - Hot:用于测试 HMR 是否正确运行。HotNode 会固定使用
target=async-node,HotWeb 会固定使用target=web,HotWorker 会固定使用target=webworker。 - HotSnapshot:用于测试 HMR 能否生成正确的中间产物。与Hot类型测试共用测试用例。
- Watch:用于测试 Watch 模式下修改文件后的增量编译。
- StatsOutput:用于测试构建结束后控制台输出的日志。
- StatsAPI:用于测试构建结束后生成的 Stats 对象。
- Diagnostic:用于测试构建过程中产生的警告/错误的格式化输出信息。
- Hash:用于测试 Hash 能否正确生成。
- Compiler:用于测试 Compiler/Compilation 对象的 API。
- Defaults:用于测试配置项之间的联动。
- Error:用于测试
compilation.errors和compilation.warnings的互操作。 - Hook:用于测试各种 hook 能否正确工作。
- TreeShaking:用于测试 Tree Shaking 相关功能。
- Builtin:用于测试内置原生实现的插件。
请优先在以上测试类型中添加用例。
Normal
用例的编写与常规的 rspack 项目相同,但不包含 rspack.config.js 文件,会使用固定的配置构建。
Config
此测试用例与常规的 rspack 项目相同,可通过添加 rspack.config.js 来指定构建配置,并可通过添加 test.config.js 来控制测试运行时的各种行为,其结构如下:
Hot
此测试用例与常规的 rspack 项目相同,可通过添加 rspack.config.js 来指定构建配置
对应的在变更的文件内通过 --- 分割变更前后的代码:
在用例的代码中,通过 NEXT_HMR 方法控制文件变更时机,并在其中添加测试代码:
HotSnapshot
与 Hot{Target} 测试使用相同的测试用例。并在用例文件夹下生成 __snapshots__/{target}/{step}.snap.txt 文件,用于对每一次 HMR 的增量产物进行 snapshot 测试。
Snapshot 结构如下:
- Changed Files:引发本次 HMR 构建的源码文件
- Asset Files:本次 HMR 构建的产物文件
- Manifest:本次 HMR 构建的
hot-update.json元数据文件内容,其中"c":本次 HMR 需要更新的 chunk 的 id"r":本次 HMR 需要移除的 chunk 的 id"m":本次 HMR 需要移除的 module 的 id
- Update:本次 HMR 构建的
hot-update.js补丁文件信息,其中:- Changed Modules:补丁中包含的模块列表
- Changed Runtime Modules:补丁中包含的 runtime 模块列表
- Changed Content:补丁代码的快照
Watch
由于 Watch 构建需要分多步进行,可通过添加 rspack.config.js 来指定构建配置。其用例的目录结构较为特殊,会以自增的数字表示变更批次:
同时在测试的代码中,可以通过 WATCH_STEP 变量获取当前的变更批次数字。
StatsOutput
用例的编写与常规的 rspack 项目相同,运行后会将控制台输出信息生成快照并存放在 tests/rspack-test/__snapshots__/StatsOutput.test.js.snap 中。
由于部分 StatsOutput 测试用例包含 hash。因此当你修改了产物代码时,请通过 -u 参数刷新这些用例的快照。
Stats API
此测试固定使用 tests/rspack-test/fixtures 作为构建的源码,因此用例以单文件编写,其输出结构如下:
Diagnostic
此测试用例与常规的 rspack 项目相同,可通过添加 rspack.config.js 来指定构建配置,但额外会在用例目录下添加 stats.err 文件用于存储警告/错误的快照,如需刷新请使用 -u 参数。
Hash
此测试用例与常规的 rspack 项目相同,但额外会在用例目录下添加 test.config.js 文件,并指定 validate() 方法用于在构建结束后检测 stats 对象中的 hash 信息:
Compiler
此测试固定使用 tests/rspack-test/fixtures 作为构建的源码,因此用例以单文件编写,其输出结构如下:
Defaults
此测试不会执行真实的构建,仅会生成构建配置并观察与默认配置的差异。基础的默认配置会生成快照并存放在 tests/rspack-test/__snapshots__/Defaults.test.js.snap 中。
此测试固定使用 tests/rspack-test/fixtures 作为构建的源码,因此用例以单文件编写,其输出结构如下:
Error
此测试的用例固定使用 tests/rspack-test/fixtures 作为构建的源码,因此测试用例以特定的配置结构编写:
Hook
会记录 hook 的出入参并存放在快照 hooks.snap.txt 中,最终产物代码的快照存放在 output.snap.txt 中。
此测试的用例固定使用 tests/rspack-test/fixtures 作为构建的源码,因此测试用例以特定的配置结构编写:
TreeShaking
此测试用例与常规的 rspack 项目相同,可通过添加 rspack.config.js 来指定构建配置,但会将最终产物生成快照并存放在 __snapshots__/treeshaking.snap.txt 中。
Builtin
此测试用例与常规的 rspack 项目相同,可通过添加 rspack.config.js 来指定构建配置。
但根据目录的不同,会将不同的产物生成快照并存放在 __snapshots__/output.snap.txt 中:
- plugin-css:将
.css后缀文件生成快照 - plugin-css-modules:将
.css和.js后缀文件生成快照 - plugin-html:将
.html后缀文件生成快照 - 其他:将
.js后缀文件生成快照

