Rome 解析器一致性测试工具:cargo coverage 全解析
Rome 解析器一致性测试工具cargo coverage 全解析【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址: https://gitcode.com/gh_mirrors/to/tools本指南以 xtask/coverage/README.md 为主体结合仓库源码系统讲解 RomeJavaScript / TypeScript 统一开发工具链用于验证解析器parser规范符合度的cargo coverage命令从完整参数表、测试套件选择机制、输出格式到基于compare子命令的分支回归对比工作流。读完你将掌握如何运行一致性测试、如何用--json输出做覆盖率对比以及如何在 CI 中发布可读的 Markdown 报告。一、cargo coverage是什么cargo coverage是 Rome 仓库中一个 xtask 辅助工具位于 xtask/coverage它的作用是用真实的第三方测试语料驱动 Rome 的 JS/TS/JSX 解析器验证解析器对这些语法是否符合规范conformance。它与单元测试互补——单元测试验证我们希望解析器怎么做而 coverage 验证行业公认的语法样例中解析器是否表现正确。从目录结构看该工具依赖三类外部语料它们以子模块/镜像形式随仓库引入xtask/coverage/test262/TC39 的 test262 测试套件对应js/262套件xtask/coverage/Typescript/TypeScript 编译器的测试用例集对应ts/microsoft套件xtask/coverage/babel/Babel parser 的 fixture对应ts/babel与jsx/babel套件。这些目录是否完整取决于子模块是否已初始化运行前应确认语料已就位。工具本身是一个独立的 Cargo packagextask_coverage见 Cargo.toml依赖rome_js_parser、rome_js_syntax、rome_diagnostics等核心 crate因此它直接以真实解析器为被测对象。二、完整命令参考cargo coverage由 main.rs 中的帮助文本定义完整用法如下USAGE: cargo coverage SUBCOMMAND [option] SUBCOMMANDS: compare Compares output between two --json outputs OPTIONS --markdown Emits supported output into markdown format. Supported by compare subcommand. --json Prints the test results in JSON. This mode will send all other test output and user messages to stderr. --detailed[debug] Prints a detailed summary at the end for all failing tests. Includes in depth details if set to debug. --suitesIDS Runs the specified tests suites. Use comma as separator. --filterfile Filters out tests that dont match the query. --help Prints this help.各参数的作用与源码依据如下表参数作用源码依据compare对比两份--json输出见第七章main.rs--markdown仅配合compare使用输出 Markdown 格式报告results.rs--json测试结果输出为 JSON其余日志全部走 stderr保证 stdout 可被管道重定向reporters.rs、lib.rs--detailed[debug]默认只打印覆盖率表格赋值为failing时追加所有失败测试的诊断赋值为debug时进一步打印 RAST解析语法树reporters.rs、main.rs--suitesIDS指定运行哪些测试套件逗号分隔默认*lib.rs--filterfile只运行路径中包含该查询字符串的测试子串匹配且已做反斜杠归一化runner.rs--help打印帮助文本main.rs几点值得注意的细节--detailed的可选值实际是coverage、failing、debug三个级别见 reporters.rs分别对应仅覆盖率表格 / 覆盖率表格 失败用例诊断 / 全部用例的 RAST 与诊断。--json模式下JsonReporter在run_completed时把各套件结果序列化输出到 stdoutreporters.rs因此可以安全地cargo coverage --json results.json。若--suites指定了未知 IDget_test_suites会静默忽略_ {}不会报错lib.rs书写 ID 时需小心拼写。三、--suites的取值与内部映射README 列出了合法取值而 lib.rs 中的 get_test_suites 揭示了它们的展开逻辑输入 ID展开/映射为说明*默认js、ts、jsx、symbols全部运行全部套件js或javascriptjs/262等价于只跑 test262ts或typescriptts/microsoft,ts/babel两个 TS 套件都跑jsxjsx/babelBabel 的 JSX fixturesymbolssymbols/microsoftMicrosoft 的符号解析套件README 帮助文本未列出但源码中确实注册了该套件js/262Test262TestSuite见 test262.rsts/microsoftMicrosoftTypescriptTestSuite见 ts_microsoft.rsts/babelBabelTypescriptTestSuiteBabel 的 TypeScript fixturejsx/babelBabelJsxTestSuiteBabel 的 JSX fixturesymbols/microsoftSymbolsMicrosoftTestSuite符号表相关测试ID 不区分大小写输入先to_lowercase多 ID 用英文逗号分隔例如cargo coverage --suitesjs/262,jsx/babel cargo coverage --suitests每个套件都实现了 runner.rs 中的TestSuitetrait需要提供套件名如js/262、基准目录base_path、判断某路径是否为测试文件is_test、以及加载单个测试load_test。四、输出模式与运行流程4.1 默认终端输出默认不带--json时输出由DefaultReporter进度条见 reporters.rs与SummaryReporter汇总见 reporters.rs共同完成。运行过程会先显示Loading N test files的加载进度再显示Running执行进度每个用例打印PASS/FAIL标签套件结束时打印Ran N tests in X.XXs。汇总阶段输出一张 ASCII 表格包含Test suite多套件时、Tests ran、Passed、Failed、Panics、Coverage 六列覆盖率保留两位小数。两个 reporter 通过MulticastTestReporter组合在一起lib.rs这是典型的观察者模式同一个测试运行事件被多个 reporter 消费。4.2 JSON 输出--json模式下每个套件的结果被序列化为形如下面的结构对应 lib.rs 中的数据结构{ js/262: { s: { a: 10000, pa: 9800, f: 150, pc: 50, c: 98.0 }, p: [ { o: Passed, h: built-ins/Array/from.js }, { o: Failed, h: language/statements/for-of.js } ] } }字段含义ssummary包含atests_ran、papassed、ffailed、pcpanics、ccoverage 百分比pdetails是逐用例结果o为Passed/Failed/Panicked之一h为用例名。JSON 是compare子命令的输入格式。4.3 详细诊断与 RAST--detailedfailing会在表格下方追加所有失败用例的诊断信息[FAIL] ...: Incorrectly errored:及其 parse 诊断、[PANIC]的 panic 消息等--detaileddebug还会为每个用例打印RAST Output for file即解析出的语法树调试输出便于定位解析器在语法层面的错误。五、测试如何运行与判定5.1 执行模型run_test_suiterunner.rs的执行模型值得关注发现阶段用walkdir递归遍历套件基准目录按is_test过滤再应用--filter子串匹配路径与查询均做\→/归一化加载阶段在线程池中并发load_test读取每个测试文件支持 UTF-16 编码文件见 util.rs 的 BOM 探测与解码执行阶段使用yastl线程池并行执行用例每个用例在catch_unwind中运行panic 会被捕获并记录堆栈自定义 panic hook 会过滤掉/rustc与.cargo框架保留业务代码栈帧结果聚合结果通过 mpsc 通道回传由单线程汇总并调用store_results计算通过率。每个用例可能包含多个文件如 TypeScript 的多文件用例TestCaseFiles承载一组TestCaseFile每个文件携带独立的文件名、源码、JsFileSource与解析选项runner.rs。5.2 判定分类单个用例的运行结果有四种runner.rs结果含义Passed解析结果与预期一致IncorrectlyPassed应该报错的用例没有报错IncorrectlyErrored不该报错的用例报了错Panicked用例执行过程中 panic其中预期是否报错由各套件自行定义test262 依据 YAML 元数据中的negative.phase parseTypeScript 依据是否存在对应的*.errors.txtbaseline 文件。此外即使解析成功若语法树中出现bogus 节点解析器没报错但产出了无效节点也会判为IncorrectlyErrored并给出专门诊断见 runner.rs 的create_bogus_node_in_tree_diagnostic——这是无诊断但树不合法的兜底检查。六、各测试套件的实现细节6.1 js/262test262test262.rs 解析 test262 测试文件头部的 YAML 元数据/*--- ... ---*/块正则/\*\-{3}((?:.|\n)*)\-{3}\*/提取flags、negative等字段然后按 flag 决定执行方式onlyStrict前置use strict;后以 script 解析module以 ES module 解析noStrict/raw直接以 script 解析无特殊 flag同时跑严格模式与非严格模式任一失败即算失败merge_outcomes。只加载negative.phase parse的用例即只关注解析阶段必须失败的用例negative.phase为early/resolution/runtime的用例被跳过因为这些属于后续阶段而非解析器职责。6.2 ts/microsoftTypeScript 官方用例ts_microsoft.rs 的实现有三个特点多文件支持TypeScript 测试用例用// filename: xxx.ts注释分隔多个文件extract_metadata用正则(?m)^/{2}\s*(?Pname\w)\s*:\s*(?Pvalue[^\r\n]*)解析选项遇到filename选项即切换当前文件选项处理// alwaysStrict会在文件头注入use strict;// module、// target会记录为 run options其余选项从文件内容中剔除非 JS/TS 文件JSON、CSS 等直接丢弃模块启发式用(import|export)\s正则判断文件是否含模块语法没有则强制按Script解析源码注释解释了原因模块语法可能出现在文件末尾Rome 当前未做第二遍扫描预期错误判定在Typescript/tests/baselines/reference目录下查找同名*.errors.txt含 run options 变体如name(modulecommonjs).errors.txt作为该用例应当报错的依据编码兼容通过check_file_encoding支持 UTF-16 编码的测试文件util.rs 中实现了 BOM 探测 UTF-16 LE/BE 解码 原生字节序回退。6.3 ts/babel、jsx/babel、symbols/microsoftts/babelBabelTypescriptTestSuite与jsx/babelBabelJsxTestSuite分别运行 Babel parser 仓库中的 TypeScript 与 JSX fixture验证 Rome 与 Babel 的解析结果一致性symbols/microsoftSymbolsMicrosoftTestSuite针对符号解析场景用于验证语义层面的符号表能力见 lib.rs 的注册。各套件共享同一个执行框架只是base_path与is_test/load_test不同这也是该工具能低成本接入新语料的架构优势。七、cargo coverage compare分支间回归对比7.1 标准工作流README 给出的对比工作流如下假设你在功能分支上开发# (commit your code on pr branch, run) git checkout main cargo coverage --json base_results.json git checkout your branch cargo coverage --json new_results.json cargo coverage compare ./base_results.json ./new_results.json --markdown要点两次运行必须使用相同套件README 示例省略了--suites默认*若只想对比 JS可写作cargo coverage js --json ...main.rs 注释 即演示了这种用法两份 JSON 由 compare.rs 读取若省略路径参数它会在仓库根目录回退查找base_results.json/new_results.json--markdown输出可直接粘贴到 PR 描述或 CI 评论中。7.2 对比输出的内容不带--markdown时输出 ASCII 表格Passed/Failed/Panics 三行的 main 分支数、PR 数、差值带--markdown时results.rs输出每个套件一张对比表Total / Passed / Failed / Panics / Coverage差值用/-与加粗标注并用✅/❌/⏫/⏬指示升降通过数上升为绿色上升失败数上升为红色上升等按类别分组的用例清单使用details折叠便于长报告分类含义:fire: Regression之前通过、现在失败/panic 的用例:tada: Fixed之前失败/panic、现在通过的用例:boom: Failed to Panic从失败变为 panic:interrobang: Panic To Failed从 panic 变为失败:heavy_plus_sign: Added Tests新出现的用例:heavy_minus_sign: Removed Tests消失的用例分类逻辑在 compare_diffs实际路径 results.rs中以用例名test_case为键做集合差与状态迁移比对状态未变的用例不追踪。八、使用建议与注意事项首次运行前确认xtask/coverage/test262、xtask/coverage/Typescript、xtask/coverage/babel语料已初始化完整否则对应套件加载不到用例ran_any_tests为 false 时进程会以退出码 1 结束见 lib.rs快速迭代用--filter例如只想看某个语法特性相关用例时cargo coverage js --filteroptional-chaining只运行路径包含该子串的用例显著缩短单轮耗时排查失败用--detaileddebug打印 RAST 后可直观看到语法树中 bogus 节点或错误位置配合诊断信息定位解析器缺陷PR 对比务必固定套件与分支compare假设两份 JSON 出自相同语料版本跨套件/跨语料版本对比无意义套件名会按键排序以保证 CI 输出稳定compare.rsCI 集成--jsoncompare --markdown的组合天然适合在 PR 中自动生成一致性报告README 提供的工作流即是为该场景设计的。至此从命令参数到源码实现cargo coverage的完整脉络已经清晰它既是一致性回归的体检工具也是解析器开发者在语法层面对标行业标准test262、TypeScript、Babel的度量基准。深入阅读 runner.rs、reporters.rs 与各套件实现文件可以进一步理解其并发模型与扩展点为接入新的测试语料提供参考。【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址: https://gitcode.com/gh_mirrors/to/tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →