ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Deno 如何在 Deno 中运行 node:* 兼容层测试并用 config.jsonc 控制用例集合

2026/9/9 18:56:23 拓冰建站 浏览量
Deno 如何在 Deno 中运行 node:* 兼容层测试并用 config.jsonc 控制用例集合 Deno 如何在 Deno 中运行 node:* 兼容层测试并用 config.jsonc 控制用例集合【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/denoDeno 的node:*兼容层有两套容易混淆的测试doc/testing.md 中专门区分了它们tests/unit_node/— Deno 自己编写的node:*内置模块单元测试通过cargo test unit_node::module运行tests/node_compat/— Node.js 自己的测试文件直接在 Deno 上执行来度量兼容性运行哪一批用例由tests/node_compat/config.jsonc控制。本文讲的是后者如何在 Deno 源码仓库中运行 Node.js 官方测试用例以及如何用config.jsonc增删用例、标记 flaky、按平台跳过或配置期望失败。适用前提是你在 Deno 仓库内做兼容性相关的开发或验证需要先构建出仓库自带的 deno 二进制。准备条件按.github/CONTRIBUTING.md的 building from source 一节安装 Rust 工具链及原生编译依赖编译器、cmake 等并带子模块克隆仓库CLAUDE.md 要求使用--recurse-submodules。构建开发版 denocargo build --bin denonode compat 用例本体是 vendored 的 Node.js 测试套件位于tests/node_compat/runner/suite/tests/node_compat/README.md 说明它是denoland/node_test的 git 子模块--recurse-submodules保证该目录有内容。运行 node compat 测试入口是tests/node_compat/mod.rsREADME 称之为 The script entrypoint of node对应的node_compat测试目标。运行单个用例tests/node_compat/mod.rs 源码中的注释给出了标准形式过滤词用目录/文件名不含test/前缀可写全名或片段# 过滤所有名字里带 test-assert 的用例 cargo test --test node_compat -- test-assert # 调试某个用例让 deno 停在断点处等待调试器 cargo test --test node_compat -- test-assert --inspect-brktests/node_compat/README.md 中写的是简写形式cargo test name of test file等价含义--inspect-brk之外还支持--inspect-wait见mod.rs的parse_cli_args。运行 config.jsonc 里登记的全部用例doc/testing.md 指出./xhelper 封装了常用测试命令node compat 对应./x test-compat name运行./x --help可查看该 helper 封装的全部命令。也可以走 tests/node_compat/runner/deno.json 里定义的testtaskcd tests/node_compat/runner deno task test 过滤词该 task 的实际内容是DENO_TEST_UTIL_DENO_EXE$(deno eval console.log(Deno.execPath())) cargo test --test node_compat --即把当前 deno 可执行文件路径传给测试 harness 后再跑cargo test --test node_compat。无过滤器时跑的是什么集合这是理解config.jsonc作用的关键mod.rs的main()不带过滤器只运行config.jsonc中登记过的用例带过滤器从完整 vendored 套件里运行所有匹配的用例即使它没登记在config.jsonc里加--report不做 config 过滤跑整个套件且仅在 CI 环境CI环境变量存在下生成报告文件。测试发现规则collect_test_files_recursive递归扫描runner/suite/test/下每个子目录只收集文件名以test-开头、扩展名为.js/.mjs/.cjs/.ts的文件以.开头的隐藏文件和fixtures、common、tools等IGNORED_TEST_DIRS目录会被跳过。config.jsonc 字段如何控制用例集合tests/node_compat/config.jsonc的格式由 tests/node_compat/schema.json 定义结构是{tests: { 目录/文件名: { ... } }}键是相对runner/suite/test/的路径。每个条目支持的字段README mod.rs的TestConfig schema字段类型作用空对象{}—该用例登记为应在 Deno 中通过纳入 CI checkignoreboolean所有平台跳过mod.rs要求配ignore: true必须写reasonwindows/darwin/linuxboolean 或期望失败对象布尔值控制该平台是否运行默认true写成{exitCode: N, output: pattern}表示运行但期望以该方式失败linuxAarch64/linuxX86_64同上平台字段按架构细分覆盖linuxflakyboolean标记为 flaky最多重试 3 次后才算失败reasonstring说明跳过/标记原因envobject仅对该用例追加的环境变量叠加在 runner 默认值之上README 明确提示 sparingly 使用exitCode/outputinteger / string顶层期望失败配置作用于所有平台可被平台字段覆盖output支持[WILDCARD]extraDenoArgsstring 数组只对该用例追加的deno run/deno testCLI 参数timeoutMsnumber覆盖该用例的超时毫秒README/mod.rs 提示只用于本来就慢的用例不要拿来掩盖挂起仓库中的真实条目示例摘自 tests/node_compat/config.jsonc// 普通登记期望通过 parallel/test-assert-async.js: {}, // 只跳过 Windows文档明确建议用逐平台开关而不是笼统 ignore internet/test-dns-ipv6.js: { windows: false }, // 全平台跳过必须带 reason abort/test-zlib-invalid-internals-usage.js: { ignore: true, reason: Tests Node.js internal C binding (internalBinding(zlib).Zlib) which is not implemented in Deno }, // 标记为 flaky parallel/test-child-process-can-write-to-stdout.js: { flaky: true }, // 单用例环境变量覆盖该测试需要走 OpenSSL 分支其他用例不能带这个变量 parallel/test-crypto-rsa-dsa.js: { env: { DENO_INTERNAL_NODE_TEST_FORCE_SHARED_OPENSSL: 1 } }schema.json 里还给出期望失败的文档示例平台字段写对象windows: { exitCode: 1 }。语义resolve_expected_failure/handle_expected_failure是该用例被运行恰好以配置的方式失败退出码相等、output的[WILDCARD]模式匹配才算通过如果它通过了或失败方式不符都记为失败失败信息里会给出Exit code mismatch/Output mismatch detail的具体差异。运行细节与结果验证每个用例的实际执行runner 用刚构建出的 deno 执行用例文件。用例源码中引用了node:test时用deno test -A --quiet --unsafe-proto --no-check否则用deno run -A --quiet --unsafe-proto工作目录是runner/suite/并自动注入NODE_TEST_KNOWN_GLOBALS0、NODE_SKIP_FLAG_CHECK1、NO_COLOR1、TEST_SERIAL_ID等环境变量mod.rs的TestSetup。用例内的// Flags:行runner 会解析它把--expose-gc等 V8 标志转成--v8-flags把--no-warnings等 Node 选项放进NODE_OPTIONS--inspect/--inspectPORT会归一化成 Deno 的--inspect127.0.0.1:PORT形式。超时默认 10 000 msmacOS 上 20 000 ms可用timeoutMs逐用例覆盖。串行目录sequential/和pummel/下的用例逐条串行执行pummel 是 Node 的压力套件会分配多 GB 缓冲区并发跑会把 CI 机器拖垮。PTY 用例pseudo-tty/前缀的用例需要平台支持 PTY不支持时自动记为 ignored。flaky 处理flaky: true的用例最多跑 3 次在 CIIS_CI且非--report模式下所有用例都按 flaky 处理。验证方式单用例cargo test的输出显示ok/FAILED失败时输出包含用例自身的 stdout/stderr截断到 2000 字符以及一行可复制的Command: NODE_TEST_KNOWN_GLOBALS0 NODE_SKIP_FLAG_CHECK1 NODE_OPTIONS... deno ...按它可以直接复现失败debugging_command_text。全量非--report模式下任何失败会触发panic_on_failures即cargo test整体失败。历史结果tests/node_compat/README.md 提到有每日结果查看站点node-test-viewer可看全部用例的最新结果。CI 行为README 明确 The items listed inconfig.jsoncare checked in CI check —— 你修好某个兼容问题、让新用例开始通过后把它加进config.jsonc它才会进入 CI 的必过集合未登记的用例只在带过滤器的本地运行或--report模式下出现。边界说明doc/testing.md提醒OS 相关跳过应使用逐平台开关如windows: false而不是笼统的ignoreignore: true时reason是强制的缺失时mod.rs会 panic。config.jsonc里的键必须与runner/suite/test/下的相对路径一致如parallel/test-foo.js写错路径不会报错只是该用例不会进入无过滤器运行集合。本文只覆盖 node compat 套件node:*内置模块的 Deno 自写单元测试在tests/unit_node/用cargo test unit_node::运行是另一个独立入口。【免费下载链接】denoA modern runtime for JavaScript and TypeScript.项目地址: https://gitcode.com/GitHub_Trending/de/deno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考