ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Biome GraphQL 格式化器 Prettier 测试套件深度解析:快照来源、运行机制与更新流程

Biome GraphQL 格式化器 Prettier 测试套件深度解析:快照来源、运行机制与更新流程 Biome GraphQL 格式化器 Prettier 测试套件深度解析快照来源、运行机制与更新流程【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome导读本文以 crates/biome_graphql_formatter/tests/specs/prettier/README.md 为主体系统讲解 Biome 项目中 GraphQL 格式化器与 Prettier 的兼容性测试体系这批测试快照从哪里来、如何作为biome_graphql_formatter测试套件的一部分运行、如何通过环境变量生成差异报告以及如何从 Prettier 上游仓库提取并更新快照。读完本文你将掌握这套以 Prettier 为基准、以快照对比为核心的格式化回归测试工作流并能独立完成运行、分析报告与同步上游用例的全部操作。一、这套测试套件是什么Biome 作为 Web 项目工具链其格式化器formatter需要与生态中广泛使用的 Prettier 保持高度一致的输出。为此Biome 在 GraphQL 格式化器测试目录中维护了一份从 Prettier 官方仓库提取的快照集用于持续检验biome_graphql_formatter的格式化结果与 Prettier 自身输出之间的差异。从仓库结构可以清楚看到这套体系的分层测试入口crates/biome_graphql_formatter/tests/prettier_tests.rs 通过tests_macros::gen_tests!宏批量生成针对tests/specs/prettier/{graphql}/**/*.{graphql}的测试函数测试数据crates/biome_graphql_formatter/tests/specs/prettier/graphql/ 下按主题分目录存放.graphql输入文件与对应的.prettier-snap期望快照如arguments/、comments/、fragments/、kitchen-sink/、trailing-comma/等约 40 个用例分组公共测试基础设施位于 crates/biome_formatter_test/src/test_prettier_snapshot.rs是整个格式化 vs Prettier 快照对比逻辑的通用实现供包括 GraphQL 在内的多个语言格式化器复用提取脚本crates/biome_graphql_formatter/tests/specs/prettier/prepare_tests.js 封装了从 Prettier 仓库抽取 GraphQL 用例的逻辑。值得注意的一个细节README 中说明这些快照提取自 prettier/prettier 仓库——这是一个外部事实陈述仓库内部则以.prettier-snap文件形式保存期望输出以.snap文件形式保存仅当存在差异时的Biome 侧快照。测试数据长什么样以最简单的示例 hello.graphql.prettier-snap 为例Prettier 对query { project(name: GraphQL) { tagline } }的期望输出为{ project(name: GraphQL) { tagline } }而复杂用例 kitchen-sink/kitchen_sink.graphql 则覆盖 query/mutation/subscription、片段、指令、别名、内联片段、参数默认值等 GraphQL 语法的全混合场景用于检验格式化器在综合场景下的表现。二、如何运行这套测试2.1 随测试套件运行根据 README这些测试是biome_graphql_formatter测试套件的组成部分运行整个 crate 的测试即可覆盖也可以单独显式调用cargo test -p biome_graphql_formatter --test prettier_tests这条命令会通过 prettier_tests.rs 中宏生成的所有测试用例对每个.graphql输入文件执行格式化与同目录下的.prettier-snap期望输出逐字对比。测试使用的格式化选项在测试入口中明确配置为空格缩进 默认缩进宽度IndentStyle::Space与IndentWidth::default()与 Prettier 的useTabs: false, tabWidth: 2对齐。2.2 每个用例的内部处理流程在 test_prettier_snapshot.rs 中每个用例PrettierSnapshot::test的实际处理步骤是读取输入PrettierTestFile::new读取.graphql输入文件并通过strip_prettier_placeholders剥离游标|与范围PRETTIER_RANGE_START/PRETTIER_RANGE_END占位符——这对应 Prettier 的 cursor/range 测试占位符适配将输入中的prettier-ignore替换为 Biome 等价的biome-ignore format: prettier ignore格式化输出后再替换回去从而让两套 ignore 语义在快照层面对齐格式化与复检对语法树执行format_node得到格式化结果若输入无解析错误还会用CheckReformat对格式化结果再次格式化并比对确保格式化幂等idempotent与 Prettier 期望对比通过get_prettier_diff读取同目录.prettier-snap文件使用similar::TextDiff生成统一格式unified的差异输出一致直接通过并且不会生成多余的 Biome 侧.snap文件utils.rs 中会顺带清理可能遗留的快照输出不一致生成包含 Prettier vs Biome 差异的.snap快照文件测试失败并展示逐行 diff。忽略清单load_ignored_tests读取 prettier_ignored_tests 文件凡是以其中任一行前缀开头的用例将被完全跳过不产生快照、不进入兼容性报告同时清理其可能残留的快照文件。该清单默认只有注释说明当前 GraphQL 用例全部处于启用状态。2.3 范围格式化range与文档格式化的特殊分支对于带范围占位符的用例run_formatter会调用format_range只格式化指定区间再用apply_range_format把格式化片段回填到原输入中其中对反向范围end start的用例直接跳过因为TextRange无法表达这种区间。此外with_document_file_source分支会启动一个内存文件系统上的 workspace server以打开文件 → 更新配置 → format_file的完整服务链路来格式化包含嵌入代码的文档并针对嵌入场景走verify_embedded_reformat做无 IR 的二次格式化校验。三、生成兼容性差异报告README 提供了三个环境变量用于在运行测试时输出 Biome 与 Prettier 的详尽差异报告环境变量取值作用REPORT_PRETTIER1启用报告生成测试进程退出时输出report.md或 JSON文件包含每个用例的完整差异REPORT_TYPEjson或markdown指定报告格式默认markdownINCOMPATIBLE_ONLY1只输出不兼容与 Prettier 输出不一致的用例文件名为report_incompatible.md典型用法组合# 生成 markdown 格式的完整差异报告 REPORT_PRETTIER1 cargo test -p biome_graphql_formatter --test prettier_tests # 只关注不兼容用例输出 JSON 报告 REPORT_PRETTIER1 REPORT_TYPEjson INCOMPATIBLE_ONLY1 \ cargo test -p biome_graphql_formatter --test prettier_tests报告背后的实现报告的生成逻辑在 crates/biome_formatter_test/src/diff_report.rsDiffReport是一个全局单例get()在首次调用时通过 libc 的atexit注册进程退出回调测试过程中每个用例把文件名、Biome 输出、Prettier 期望三元组收集进MutexVec进程结束时统一落盘每个文件的兼容度single_file_compatibility按匹配行数 / 两方输出行数较大值计算100% 视为完全兼容配合is_compatible过滤INCOMPATIBLE_ONLY1时兼容用例不会进入报告markdown 报告会汇总两个整体指标基于文件的平均相似度file_based_average_prettier_similarity与基于行的兼容行占比line_based_average_prettier_similarity并为每个用例输出Prettier Similarity百分比与 unified diff 代码块JSON 报告则序列化PrettierCompatibilityMetricData含逐文件指标与差异便于机器解析报告文件名默认按report.md/report.json/report_incompatible.md/report_incompatible.json取值也可通过REPORT_FILENAME环境变量覆盖此为源码实现细节README 未展开。从源码结构看这套DiffReport机制是跨语言共享的任何调用biome_formatter_test快照基础设施的格式化器 crate 都能复用同一份报告能力。四、从 Prettier 上游提取并更新快照README 的 Updating 一节给出了完整的同步流程。Prettier 本身使用 Jest 运行快照测试其快照存放在__snapshots__/format.test.js.snap中需要借助一个 Node.js 脚本把快照抽取为纯文本文件供 Rust 测试直接使用。4.1 前置准备# 1. 在本地克隆 Prettier 仓库需自行指定克隆位置 git clone https://github.com/prettier/prettier.git # 2. 清空现有抽取目录确保过时用例被移除 # 即删除 crates/biome_graphql_formatter/tests/specs/prettier 下的所有子目录 # 3. 进入公共抽取脚本目录并安装依赖 cd crates/biome_formatter_test/src/prettier pnpm install # 4. 回到 GraphQL 用例目录 cd crates/biome_graphql_formatter/tests/specs/prettier # 5. 执行抽取参数为 Prettier 仓库根目录 node prepare_tests.js prettier root directory其中第 3、4 步中的目录对应关系为公共脚本位于 crates/biome_formatter_test/src/prettier/含package.json、LICENSE与 prepare_tests.js而 GraphQL 专用的薄封装是 crates/biome_graphql_formatter/tests/specs/prettier/prepare_tests.js。4.2 抽取脚本做了什么从 prepare_tests.js 的源码可以还原完整抽取逻辑定位上游测试目录把传入的 Prettier 根目录解析为prettier root/tests/format/graphql递归遍历其中所有文件跳过format.test.*这类 spec 文件读取 Jest 快照从每个目录的__snapshots__/format.test.js.snap中取出键为文件名 format 1的快照文本用固定的分隔线input/output/options切分出输入、选项与期望输出三部分解析范围选项从 options 段中正则提取rangeStart/rangeEnd缺省分别为0与Infinity对应 Prettier 的 range 测试复制输入文件把原始.graphql输入文件按相对路径复制到当前目录即tests/specs/prettier下保持上游目录结构重新格式化期望输出由于 Biome 与 Prettier 的默认选项存在差异脚本会用prettier.format以固定默认配置trailingComma: all、tabWidth: 2、printWidth: 80、embeddedLanguageFormatting: off等对期望输出再格式化一遍后写入.prettier-snap文件——这保证了期望快照与 Biome 测试入口使用的选项口径一致记录 Prettier 自身的重格式化缺陷若原始快照与重新格式化后的结果不一致说明 Prettier 上游存在 re-format 不一致的问题脚本会额外写出文件名.prettier-snap-original文件以保留原始输出仓库中union_types.graphql.prettier-snap-original正是这类文件无 Jest 快照的文件兜底如果快照中找不到对应 key则直接读取输入文件并用 Prettier 现场格式化把结果写入.prettier-snap。可见这套更新流程保证了上游 Jest 快照 → 纯文本.prettier-snap期望文件 → Rust 测试逐字对比三级数据链路始终与 Prettier 上游保持同步。五、与其他测试体系的关系为了让读者对 Biome GraphQL 格式化测试有整体认识这里补充说明 README 之外、同目录下的相邻测试机制以仓库结构为据原生 spec 测试spec_tests.rs 与 spec_test.rs 驱动 tests/specs/graphql/ 下的自有用例如definitions/、selection_set/、trailing_newline/、suppression/等其中目录内的options.json可配置格式化选项输出对比的是 Biome 自己的.snap快照而非 Prettier 基准Prettier 兼容测试即本文主题基准是 Prettier 的.prettier-snap两者的基础设施SpecSnapshot与PrettierSnapshot都构建在 biome_formatter_test 之上后者提供了快照构建、格式化复检check_reformat.rs、差异报告等通用能力。六、总结这套 Prettier 快照测试体系是 Biome GraphQL 格式化器保证与生态基准对齐的关键机制日常运行只需cargo test -p biome_graphql_formatter --test prettier_tests需要审计兼容性时借助REPORT_PRETTIER1配合REPORT_TYPE、INCOMPATIBLE_ONLY即可生成逐文件差异与整体相似度指标而定期从 Prettier 上游通过prepare_tests.js重新抽取快照则能让兼容性回归持续跟随上游演进。README 中描述的运行与更新两大场景分别对应测试基础设施与抽取脚本两条可独立维护的流水线共同支撑着 Biome 在 GraphQL 格式化输出上的持续对齐。【免费下载链接】biomeA toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.项目地址: https://gitcode.com/gh_mirrors/bi/biome创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表