news 2026/10/25 23:38:49

让测试规范活起来:lat.md 用 require-code-mention 强制 spec 与测试代码双向引用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
让测试规范活起来:lat.md 用 require-code-mention 强制 spec 与测试代码双向引用

让测试规范活起来:lat.md 用 require-code-mention 强制 spec 与测试代码双向引用

【免费下载链接】lat.mdAgent Lattice: a knowledge graph for your codebase, written in markdown.项目地址: https://gitcode.com/gh_mirrors/la/lat.md

lat.md是一个"用 Markdown 写成的代码库知识图谱"工具:它在项目根目录维护一个lat.md/文档目录,通过 wiki 链接把文档章节、源码符号和测试代码串成一张网,再用lat check命令持续校验这张网不会"断链"。其中最有意思的能力是require-code-mention——一个 frontmatter 开关,可以强制要求每一条测试规范(spec)都必须被测试代码中的注释真实引用,从而让 spec 与测试代码形成双向引用,任何一边被遗忘都会立刻报错。

痛点:写在文档里的测试规范,为什么总是没人管?

很多团队把测试规范写在文档里:这个场景要覆盖什么、边界条件怎么断言、异常路径怎么处理。但文档写完就"沉睡"了:

  • 代码重构了,文档里的 spec 没人更新,逐渐失真;
  • 某条 spec 一直没人写对应测试,但没有任何机制提醒你;
  • 新人接手时,分不清哪些规范有测试、哪些只是"写在纸上的愿望"。

lat.md 的思路是:与其指望人自觉,不如把"规范必须有代码实现"变成一条可以被机器校验的约束。

核心机制:一个 frontmatter 开关 + 一行代码注释

整个功能只需要两步,规则在 lat.md/knowledge/markdown.md 中有完整说明。

第 1 步:在 specs 文件头部打开开关

把测试规范写成lat.md/下的 Markdown 文件,每个测试用例就是一个章节(section),然后在文件头部加上 YAML frontmatter:

--- lat: require-code-mention: true --- # Specs ## Must Do X Description. ## Must Do Y Description.

这个开关的解析逻辑在 packages/core/src/lattice.ts 中实现——只要检测到require-code-mention: true,该文件的所有叶子章节(没有子章节的章节)就都被视为"必须有代码引用"的规范。

第 2 步:在测试代码里写一条// @lat:注释

在对应的测试代码中,用注释指向规范章节:

// @lat: [[specs#Must Do X]]

(Python、PHP 等语言用# @lat:注释。)这样,文档章节和测试代码就互相"认识"了。

双向引用是怎么工作的?

lat check code-refs会做两个方向的校验(见 lat.md/knowledge/cli.md):

方向校验内容抓什么问题
代码 → 文档每条// @lat: [[...]]注释必须指向lat.md/中真实存在的章节注释指向了已删除/写错名字的规范(悬空引用)
文档 → 代码开启require-code-mention的文件中,每个叶子章节必须被至少一条// @lat:注释引用写了规范却从来没人写测试

反向校验的核心实现就在 packages/core/src/cli/check.ts:收集全代码库的@lat:引用,再遍历开了开关的文件的每个叶子章节,发现没有任何引用覆盖时,报错:

section "Must Do Y" requires a code mention but none found

也就是说:你写了 spec 却没写测试,CI 会直接红给你看;反过来,测试里指向一条不存在的规范,同样报错。这正是"双向"的含义——两边都不敢悄悄漂移。

lat.md 自己的 View 测试规范 lat.md/knowledge/view/specs.md 就是这个机制的活例子:文件头开启开关,几十条 UI 行为规范全部被测试代码中的@lat:注释钉住。该功能的测试用例定义在 lat.md/knowledge/tests/check-code-refs.md,配套的报错场景 fixture 可以直接查看 tests/cases/error-require-code-mention/lat.md/specs.md。

落地三步走:让现有项目的 spec 文件"活"起来

  1. 安装并初始化:npm install -g lat.md,在项目里运行lat init生成lat.md/目录(轻量校验场景也可只用@lat.md/core的lat-core check)。
  2. 把测试规范写成章节:新建lat.md/specs.md,一个## 标题对应一条规范,头部加上require-code-mention: true。
  3. 让代码引用规范:在每条测试用例旁加// @lat: [[specs#规范标题]]注释,然后运行lat check确认全绿。

之后把lat check放进 pre-commit 钩子或 CI(项目自带 GitHub Action,见 action.yml),规范覆盖率就成了每次提交都能看见的指标。

小结

require-code-mention的设计非常克制:一个布尔开关 + 一行注释,就把"文档说有测试、代码里有测试"从口头约定变成了可校验的引用关系。对新手来说,它是理解 lat.md "知识图谱"理念的最佳切入点——知识的价值不在于写在文档里,而在于被持续验证、持续连接。

【免费下载链接】lat.mdAgent Lattice: a knowledge graph for your codebase, written in markdown.项目地址: https://gitcode.com/gh_mirrors/la/lat.md

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/25 23:05:32

应急响应实战复盘:从畸形图片Webshell到内存取证揪出后门

这届帕鲁杯出现了好几个值得反复琢磨的应急响应赛题,我印象最深的是那道《畸形的爱》,出题方是知攻善防实验室。光看名字觉得像剧情杀,真正进题之后才发现,这是一道典型的蓝队视角应急响应题,考的是日志分析、恶意文件…

作者头像 李华
网站建设 2026/10/19 3:14:23

MySQL数据类型选择实战:从手机号、金额到索引失效的避坑指南

聊到 MySQL 数据类型,许多开发的第一反应是:int、varchar、datetime,选一个就完事。我过去也这么想,直到被线上事故教训过几次。这篇文章主要聊 MySQL 数据类型怎么选才能少踩坑:数值、字符串、日期时间、JSON 四大类型…

作者头像 李华
网站建设 2026/10/19 3:14:23

服务器攻击与防御实战指南:从DDoS到WebShell的排查与加固

干服务器运维这行越久,越明白一件事:你永远不知道下一分钟攻击会从哪个方向来。我接手过一台被挖矿脚本占满CPU的Web服务器,半夜替电商客户处理过CC攻击打到带宽爆掉的告警,也亲眼见过同事因为一条文件上传漏洞,整个后…

作者头像 李华
网站建设 2026/10/19 5:19:10

RADIUS协议原理与Wi-Fi企业认证实战指南

简介:本资源是一份面向网络工程初学者与高校教学场景的RADIUS协议系统性教案,聚焦用户认证、授权与计费(AAA)核心机制,解决企业网接入控制、教育网按流量计费、VOD点播计时等典型应用场景中的身份验证难题。教案以Word…

作者头像 李华
网站建设 2026/10/19 5:19:12

Agent-Reach 实战:用 CLI 为 AI Agent 接上执行的手

1. 从"Agent-Reach"这个名字说起:它到底想解决什么问题 第一次看到 Agent-Reach 这个项目名,我的直觉是:这大概率是一个围绕 AI Agent 能力边界做文章的工具,而不是又一个"套壳聊天框"。原因很简单——"…

作者头像 李华
网站建设 2026/10/19 5:19:10

事务与ACID特性深度解析:从隔离级别到分布式事务,软考通关指南

1. 从软考真题看事务考法:这道题为什么总在“送分”和“送命”之间 我在带软考中级软件设计师备考的时候,经常跟学生说一句话:事务这道题,要么是送分题,要么是送命题,没有中间态。原因很简单——你只要把AC…

作者头像 李华