尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

vscode-textmate 测试指南:vscode-tmgrammar-test 与主题快照测试实战

vscode-textmate 测试指南:vscode-tmgrammar-test 与主题快照测试实战 vscode-textmate 测试指南vscode-tmgrammar-test 与主题快照测试实战【免费下载链接】vscode-textmateA library that helps tokenize text using Text Mate grammars.项目地址: https://gitcode.com/gh_mirrors/vs/vscode-textmatevscode-textmate 是 VS Code 官方使用的 TextMate 语法解析库负责把.tmLanguage语法文件变成精确的 token 流。如果你正在开发语法插件或自定义高亮vscode-textmate 测试是保证高亮不回归的关键。本文是一份面向新手的语法高亮测试指南带你从零掌握vscode-tmgrammar-test命令行测试和项目内置的主题快照测试Snapshot Test让每一次语法改动都有据可查。 为什么语法高亮也需要测试很多人以为语法高亮是写完正则就完事但实际上语法文件动辄上千行正则改动一处可能影响全局多行规则、begin/end配对、注入语法injection很容易出边界 bug高亮结果肉眼难以逐字核对回归全靠测试所以正规的语法工程都会配套两类测试token 级测试验证每个字符的 scope和主题级快照测试验证最终渲染颜色。下面分别实战。✅ 实战一用 vscode-tmgrammar-test 测试语法vscode-tmgrammar-test是社区最流行的 TextMate 语法测试工具它基于 vscode-textmate 内核直接在你的仓库里跑测试用法非常傻瓜式。一键安装步骤npm install --save-dev vscode-tmgrammar-test最快配置方法先准备一个待测试的代码文件例如tests/basic.jsfunction add(a, b) { return a b; }然后运行npx vscode-tmgrammar-test -s source.js -g syntaxes/javascript.tmLanguage.json -t tests/**/*.js首次运行时工具会为每个测试文件自动生成对应的.snap快照文件。快照里详细记录了每一行每个 token 的文本、范围scope和主题颜色例如function source.js meta.function.js storage.type.function.js add source.js meta.function.js entity.name.function.js之后每次改动语法重新运行命令工具会把新结果与.snap对比任何差异都会以高亮 diff 的形式呈现——这就是最实用的语法高亮回归测试。测试通过后记得把.snap文件一起提交进仓库。 实战二主题快照测试内置方案除了命令行工具vscode-textmate 仓库本身也内置了一套完整的测试体系非常适合作为抄作业的范例。核心逻辑位于 src/tests/tokenization.test.ts 和 src/tests/themes.test.ts。测试数据放在哪里类型目录作用语法 token 测试test-cases/first-mate/tests.json定义某行代码应切出哪些 token、每个 token 的 scope主题快照测试test-cases/themes/tests/每个.test后缀文件对应一份高亮快照比如 test-cases/first-mate/tests.json 里的一段用例{ line: hello world!, tokens: [ { value: hello, scopes: [source.hello, prefix.hello] } ] }意思就是对hello world!这行hello必须被切出source.hello和prefix.hello两个 scope。测试运行时逐行断言任何一个 scope 对不上都会报错。快照对比是怎么实现的主题快照测试的机制在 src/tests/themeTest.ts 中实现原理非常直白读取测试代码文件如tests/test.ts用所有内置主题Monokai、Solarized、dark_plus 等分别分词把每个 token 的文本 颜色序列化成一个 JSON 字符串与同名的.result文件如 test-cases/themes/tests/test.ts.result做deepStrictEqual对比{ content: /* Game of Life, color: #223355 }只要主题或语法产生任何颜色变化快照对比立刻失败逼着你审视这次改动是否预期。这就是主题快照测试的核心思想用死数据锁死活行为。 快速开始一条命令跑完所有测试vscode-textmate 使用 Vitest 作为测试框架见 package.json 的 scripts 配置安装依赖后只需npm install npm test项目内置的测试会自动遍历test-cases下的所有用例。你也可以单独跑某一类npx vitest run src/tests/tokenization.test.ts npx vitest run src/tests/themes.test.ts 小技巧主题测试首次失败时src/tests/themeTest.ts 里的writeExpected()方法会自动帮你把实际结果写入.result文件。在确认改动正确后可以用这种方式更新快照基准。 进阶用 inspect 工具调试分词过程当你只想盯着一份文件看逐行分词细节时仓库还内置了一个调试工具 src/tests/inspect.ts。它能打印每一行的 token 列表以及行末的完整规则栈Rule Stack对排查为什么这个关键字没高亮非常有用node out/tests/inspect.js grammar.json test.js输出会包含每个 token 的 scope、规则栈的嵌套层级与实例 ID是定位复杂begin/end规则问题的利器。 常见问题速查Q快照文件要不要提交进 Git要。快照就是测试基准不提交就失去了回归测试的意义。Q改了主题没改语法为什么快照测试也失败正常。主题快照同时锁定了语法分词和主题颜色两个维度颜色变化同样会触发对比。Q想测试自己的语法仓库怎么开始最简单的方式是克隆本仓库 https://gitcode.com/gh_mirrors/vs/vscode-textmate 作为参考实现模仿test-cases的目录结构组织你的用例再配合 vscode-tmgrammar-test 的.snap快照就能快速搭建起自己的测试体系。结语无论是用 vscode-tmgrammar-test 做轻量级语法测试还是参考 vscode-textmate 内置的主题快照测试做深度回归核心都是同一个思路把高亮行为固化成可对比的数据。语法高亮测试并不神秘动手跑通一个用例你就已经迈过了新手期。【免费下载链接】vscode-textmateA library that helps tokenize text using Text Mate grammars.项目地址: https://gitcode.com/gh_mirrors/vs/vscode-textmate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表