用两条回归测试复现分组笔记的元信息错位

举报
yd_292978551 发表于 2026/10/19 17:40:15 2026/10/19
【摘要】 用不分组和分组两条回归用例,实际复现workvault中成员frontmatter与正文错位的问题,分析数组位置关联的风险及更有价值的回归断言。AI辅助整理,结果经本地运行核对。

用两条回归测试复现分组笔记的元信息错位

本文记录一次可重复的开源项目回归测试。代码审阅和行文由AI辅助,结论来自实际运行输出。复现对象是AI办公实践中心的workvault,核对提交为085fcde1bff20b1a4dc132d76bf8d82f7efa6bee;2026年10月19日再次获取远端后,该主分支提交未变。本文未修改项目生产代码,也未断言维护者已经确认或修复。

1. 为什么文件数量正确仍可能存在错误

数据转换工具经常把原始记录渲染为多篇Markdown笔记,并额外生成分组索引。如果后续步骤依赖数组位置把元信息补回笔记,插入索引就可能改变对应关系。只验证“生成了几篇文件”无法发现内容之间的错配。

这次使用两条虚构记录:Alice(id为1)和Bob(id为2),两者均属于A组。正文模板只输出姓名,文件名来自姓名;profile同时声明name与id两个frontmatter字段。测试全部在本地运行,不连接个人云资源、不使用账号凭据。

2. 先设置不分组的对照

第一条用例关闭分组,调用renderSource,再分别寻找notes/Alice.md和notes/Bob.md,使用extractFrontmatter取出元信息,断言两者姓名分别为Alice和Bob。该用例实际通过。

第二条用例只增加groupBy: 'team’和groupTemplate: ‘# Team {{group}} ({{count}})’,其余输入保持一致。这样可以缩小差异,避免同时修改数据、模板和配置而无法定位原因。

核心断言如下:

const alice = notes.find(n => n.path === 'notes/Alice.md');
expect(extractFrontmatter(alice!.content)).toContain('name: Alice');

3. 实际输出

开启分组后,实际得到:

notes/A.md      -> name: Alice, id: 1
notes/Alice.md  -> name: Bob, id: 2
notes/Bob.md    -> 没有frontmatter

组索引拿到了第一位成员的元信息,Alice正文配上了Bob的元信息,末位成员没有对应元信息。Vitest实际汇总为1通过、1失败;失败断言显示预期name: Alice,实际得到name: Bob。这里的失败用例用于证明缺陷,不能写成“测试全部通过”。

4. 沿着对应关系定位

src/core/engine.ts先把分组索引追加进notes,再追加成员笔记。后续补frontmatter的处理却遍历混合后的notes,并使用records[i]取原记录。索引笔记不属于原始成员记录,这两个数组在分组情况下已经长度不同、含义不同。

修复方向是保留明确的数据关联:在渲染成员时直接使用该成员record生成frontmatter,或者将组索引与成员笔记分开处理。组索引应使用自身的组信息。简单跳过第一项也不稳妥,因为可能同时存在多个组索引,索引数量随数据变化。

本文没有提交修复或声称生产环境恢复。维护者仍需决定组索引应包含哪些字段,并验证模板自带frontmatter、多个分组和空记录等分支。

5. 值得保留的回归检查

至少保留两条成员的name和id与正文一致、组索引不携带第一位成员身份、末位成员仍有元信息这三类断言。还应增加多分组和模板自带frontmatter的用例。测试目标应覆盖“数据属于谁”,不能只覆盖“是否生成文件”。

复现仓库:https://gitcode.com/agent-best-practices/workvault

以上仅是指定提交、指定输入下的本地复现;未公开个人数据,未将本地回归结果混同为上游接收、审核或修复结果。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。