ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Azure Data Studio 编辑器 Diffing Fixture 测试机制全解析:基于黄金文件的差异算法回归测试

Azure Data Studio 编辑器 Diffing Fixture 测试机制全解析:基于黄金文件的差异算法回归测试 数据库客户端桌面应用数据分析【免费下载链接】azuredatastudioAzure Data Studio is a data management and development tool with connectivity to popular cloud and on-premises databases. Azure Data Studio supports Windows, macOS, and Linux, with immediate capability to connect to Azure SQL and SQL Server. Browse the extension library for more database support options including MySQL, PostgreSQL, and MongoDB.项目地址https://gitcode.com/gh_mirrors/az/azuredatastudio点击查看免费下载本指南深入讲解 Azure Data Studio 源码仓库中src/vs/editor/test/node/diffing目录下的 Diffing Fixture 测试体系它如何用成对输入文件 黄金结果文件自动验证行级差异diffing算法的输出如何在算法变更时自动回填期望文件并借助*.invalid.diff.json强制测试持续失败以及如何新增用例、判读输出。读完你既能掌握这套可自愈self-healing的 fixture 测试范式也能了解其背后AdvancedLinesDiffComputer与LegacyLinesDiffComputer两条差异算法的对照验证思路。一、什么是 Diffing Fixture 测试在 Azure Data Studio 的编辑器内核src/vs/editor中行级差异计算是代码比对、合并冲突展示、变更高亮等能力的基础。为了确保差异算法在大量真实代码形态TypeScript、JSON、JSX、纯文本等上输出稳定且符合直觉仓库在 src/vs/editor/test/node/diffing 下建立了一套基于fixture测试夹具目录 黄金文件golden file的回归测试体系。其核心约定来自 README.mdEvery folder infixturesrepresents a test. The file that starts with1.is diffed against the file that starts with2.. Usetstinstead oftsto avoid compiler/linter errors for typescript diff files.翻译成要点即一个目录 一个测试用例fixtures/下的每个子目录都对应一条独立的 diff 测试成对输入目录中以1.开头的文件作为原始版本以2.开头的文件作为修改版本测试对二者执行 diff 算法扩展名规避编译/静态检查TypeScript 类输入统一使用.tst而非.ts命名目的是避免这类测试专用代码片段被 tsconfig 或 linter 当作正式源码检查而产生编译错误。这一设计让测试数据与代码完全解耦输入只是两份文本文件任何人无需理解测试代码即可新增一条用例。二、fixtures 目录的完整结构当前仓库的fixtures下共有 46 个用例目录覆盖了差异算法需要应对的各种形态例如目录输入语言覆盖场景deletion.tst整文件删除第二份输入为空equals.txt两文件完全相等期望零差异move-1.tst代码块整体移动class-replacement.tst类/类型替换含advanced.human.diff.json人工标注期望bracket-aligning.tst括号对齐调整indentation.tst仅缩进变化intra-block-align.txt块内行对齐fuzzy-matching.txt模糊匹配/相似行subword.tst子词subword粒度变化word-shared-letters.tst单词间共享字母的极端情况json-brackets.jsonJSON 括号重排just-whitespace.js纯空白差异invalid-diff-trimws.tst目录名含trimws关键字触发忽略行尾空白选项ts-*系列约 20 个.tstTypeScript 各类重构方法拆分、字符串、注释、导入空白亲和、碎片化 eager diff 等ws-alignment.tsxJSX 空白对齐issue-185779.txt特定 GitHub issue 的回归复现penalize-fragmentation.txt惩罚碎片化 diff 的策略验证含 human 标注每个用例目录内通常包含fixtures/case/ ├── 1.ext # 原始版本输入 ├── 2.ext # 修改版本输入 ├── legacy.expected.diff.json # 旧算法期望结果黄金文件 ├── advanced.expected.diff.json # 新算法期望结果黄金文件 └── [advanced.human.diff.json] # 可选人工标注的人类理想 diff参考其中*.human.diff.json是少数用例额外保留的人工理想结果例如class-replacement/advanced.human.diff.json记录了一个人类认为应该这样 diff的参考区间用于在评审算法输出时对照但它并不参与断言——真正参与断言的是*.expected.diff.json。三、黄金文件机制期望结果自动生成与自动回填这套测试最精巧之处在于期望文件expected file可以不预先手写测试自身会根据实际算法输出自动生成或更新缺失自动创建当某个用例目录缺少*.expected.diff.json时首次运行会自动写入当前算法的实际输出作为期望文件同时生成一个空的*.invalid.diff.json不一致自动回填若实际 diff 与期望 diff 不一致测试会把期望文件更新为实际结果并把更新前的旧值备份写入*.invalid.diff.json强制持续失败只要目录里存在任何*.invalid.diff.json测试就会失败——即使第二次运行时算法输出已经与被回填后的期望文件一致测试依然失败。这一点是 README 特别强调的The test will fail if there are any*.invalid.diff.jsonfiles. This makes sure that the test keeps failing even if it is run a second time.这个设计杜绝了自动回填导致测试悄悄变绿的隐患变更者必须显式确认差异结果、手动删除 invalid 文件后测试才会恢复通过。完整的断言状态机以上规则在 diffingFixture.test.ts 中实现为三段式分支可以概括为如下状态机预期文件不存在 └─ 写期望文件实际结果 写空 invalid 文件 抛错 No expected file! └─ 需要开发者删除 invalid 文件后才能通过 存在 invalid 文件来自上次失败 ├─ invalid 内容为空回填期望文件抛错要求删除 invalid └─ invalid 内容非空 ├─ 实际 invalid旧期望从 invalid 恢复期望文件删除 invalid测试通过 └─ 实际 ! invalid回填期望文件继续抛错 无 invalid 文件正常路径 ├─ 实际 期望测试通过 └─ 实际 ! 期望备份期望到 invalid回填期望为实际抛错其中从 invalid 恢复期望文件的分支diffingFixture.test.ts实现了来回切换算法也能自洽的能力如果你把算法切回旧实现只要旧实现的输出仍等于 invalid 中备份的旧期望测试会自动把期望文件恢复为旧值并清理 invalid 文件从而让两种算法都能在同一套 fixture 上得到各自的黄金基线。四、测试入口与断言细节测试入口是 diffingFixture.test.ts它读取fixtures目录下所有子目录为每个目录、每种算法legacy与advanced生成一条独立的 mocha 用例测试名为${folder}-${legacy|advanced}见 diffingFixture.test.ts输入文件统一按 UTF-8 读取并把\r\n、\r归一化为\n后按行切分diffingFixture.test.ts保证跨平台行尾不破坏黄金文件每条用例同时实例化两个算法之一diffingFixture.test.tsLegacyLinesDiffComputer来自 src/vs/editor/common/diff/legacyLinesDiffComputer.ts内部基于LcsDiff最长公共子序列配合字符级变化计算、pretty diff 后处理等参数AdvancedLinesDiffComputer来自 src/vs/editor/common/diff/advancedLinesDiffComputer.ts对小型输入两侧行数之和小于 1700 行使用动态规划算法大文件回退到 Myers 算法并经过优化、随机匹配移除、平滑等一系列后处理用例目录名中只要包含trimws子串就会把ignoreTrimWhitespace置为truediffingFixture.test.ts例如invalid-diff-trimws目录就是专门验证忽略行尾空白开关的用例计算时固定maxComputationTimeMs为无穷大Number.MAX_SAFE_INTEGER、关闭 move 计算确保结果完全确定、可复现。黄金文件的 JSON 结构测试把算法输出序列化为DiffingResult见 diffingFixture.test.ts写入期望文件。以deletion用例的 advanced.expected.diff.json 为例{ original: { content: import { Link, List, Separator, Stack } from fluentui/react;\n..., fileName: ./1.tst }, modified: { content: , fileName: ./2.tst }, diffs: [ { originalRange: [1,30), modifiedRange: [1,2), innerChanges: [ { originalRange: [1,1 - 29,64], modifiedRange: [1,1 - 1,1] } ] } ] }字段语义如下字段含义original/modified两份输入的完整内容与文件名内容全文写入便于直接阅读和人工复核diffs[]行级差异列表每个元素是一段LineRangeMappingdiffs[].originalRange原始侧行区间格式[startLineNumber, endLineNumberExclusive)即左闭右开、行号从 1 开始diffs[].modifiedRange修改侧行区间格式同上diffs[].innerChanges行内字符级子差异原始/修改侧格式为[startLine,startCol - endLine,endCol]若为null表示该行块无字符级细化moves可选行移动信息当移动计算结果为空数组时会被删除见 diffingFixture.test.ts因此大多数黄金文件不含此字段对deletion用例而言2.tst为空文件算法把整个原始文件第 129 行映射为修改侧空内容[1,30)表示原始第 1 行到第 30 行不包含 30即第 1~29 行整块被删除。五、如何新增一条 Diffing Fixture 用例按 README 的约定新增用例只需四步在src/vs/editor/test/node/diffing/fixtures/下新建一个语义化命名的目录例如my-scenario放入原始版本文件1.txt或1.tst、1.js、1.tsx等TypeScript 代码一律用.tst扩展名避免被编译器/linter 处理放入修改版本文件2.txt内容为期望 diff 出的目标文本运行测试。由于my-scenario目录没有期望文件测试会自动写入legacy.expected.diff.json与advanced.expected.diff.json分别来自两个算法的输出同时写入两个空的legacy.invalid.diff.json与advanced.invalid.diff.json抛错提示删除 invalid 文件后测试才会通过。此时开发者应人工审查自动生成的期望文件是否符合直觉必要时对照advanced.human.diff.json的写法手动补充一个人类理想 diff作为评审参考确认无误后删除 invalid 文件用例即正式生效。空目录命名中包含trimws关键字即可顺带覆盖忽略行尾空白模式。六、算法变更时的工作流README 的核心操作指引README 最后给出了一条明确的算法变更操作手册When changing the diffing algorithm, run the fixture tests, review the diff of the*.expected.diff.jsonfiles and delete all*.invalid.diff.jsonfiles.即修改差异算法后运行 fixture 测试所有与旧行为不一致的用例会失败并自动把期望文件更新为新算法的输出、把旧输出备份进*.invalid.diff.json审查*.expected.diff.json的 diff通过 git diff 逐条核对新结果是否更合理例如对齐更好、碎片更少、移动识别更准确这是整个流程中最重要的人工环节删除所有*.invalid.diff.json只有确认变更正确后才清理 invalid 标记让测试恢复绿色。由于 invalid 文件的存在会强制测试失败包括重跑这套流程天然防止了改坏算法却因自动回填而误报通过的风险。若在审查中发现某条新结果不合理可以结合*.human.diff.json人工参考回溯算法在 advancedLinesDiffComputer.ts 或 legacyLinesDiffComputer.ts 中的具体阶段行对齐、后处理、字符级细化定位原因。七、同目录配套测试除 fixture 测试外同一目录还有独立的单元测试 lineRangeMapping.test.ts用于直接验证LineRangeMapping的区间语义与变换逻辑。它与 fixture 测试互补前者聚焦区间对象本身的行为后者聚焦完整 diff 管线的端到端输出。若你修改src/vs/editor/common/diff/下的核心类型或算法两个测试文件都应保持通过。八、小结这套测试范式可复用的价值Diffing Fixture 测试是典型的golden master 测试黄金主样本测试实践它的价值可以概括为三点低门槛的数据驱动新增用例零代码只需两份文本文件1.*/2.*命名约定让输入对一目了然自动回填 强制失败期望文件无需手工维护算法变更时自动生成新基线同时用*.invalid.diff.json强制开发者显式确认避免自动变绿掩盖回归双算法对照同一套 fixture 同时喂给 advanced 与 legacy 两条实现既为迁移提供基线对照也让两个算法共享统一的期望文件评审口径。若你需要在其他项目里引入类似机制只需复刻这套输入对 期望文件 invalid 标记的最小约定并保留存在 invalid 文件即失败的硬性规则即可获得同样可靠的差异算法回归保障。赞分享数据库客户端桌面应用数据分析【免费下载链接】azuredatastudioAzure Data Studio is a data management and development tool with connectivity to popular cloud and on-premises databases. Azure Data Studio supports Windows, macOS, and Linux, with immediate capability to connect to Azure SQL and SQL Server. Browse the extension library for more database support options including MySQL, PostgreSQL, and MongoDB.项目地址https://gitcode.com/gh_mirrors/az/azuredatastudio点击查看免费下载相关推荐void 编辑器 Diffing Fixture 测试机制全解从期望文件自愈到 diff 算法回归保障void 编辑器 Diffing Fixture 测试机制全解从期望文件自愈到 diff 算法回归保障 在 void基于 VS Code 的开源 AI 代码代码编辑器开发工具AI Agent人工智能Visual Studio Code Diffing Fixture 测试机制详解目录约定、自动更新与回归流程Visual Studio Code Diffing Fixture 测试机制详解目录约定、自动更新与回归流程 Diffing Fixture Tests 是开发工具代码编辑器Golden-Session Regression黄金会话回归Serial Studio 会话数据库的解析器回归测试机制Golden Session Regression黄金会话回归Serial Studio 会话数据库的解析器回归测试机制 导读 Golden Sessio桌面应用数据可视化物联网上一篇umi零崩溃实战Sentry错误监控全流程下一篇Leaflet Routing Machine多语言本地化指南支持全球用户的实用方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表