Understand-Anything tested_by测试覆盖链接机制揭秘:两遍归一化如何规范测试边
Understand-Anything tested_by测试覆盖链接机制揭秘两遍归一化如何规范测试边【免费下载链接】Understand-AnythingGraphs that teach graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.项目地址: https://gitcode.com/GitHub_Trending/un/Understand-AnythingUnderstand-Anything 能把任意代码仓库变成可探索、可搜索、可提问的交互式知识图谱而图谱质量的关键一环就是tested_by 测试覆盖链接机制在合并分析批次的merge-batch-graphs.py中一个确定性的两遍归一化链接器linker会把散落在各批次里的测试边统一规范为production → test方向让知识图谱里的测试覆盖关系清晰、可审计、不会重复。本文面向新手带你看懂这套机制的工作原理。一、问题背景LLM 生成的测试边为什么会乱在/understand技能的多智能体流水线中文件分析智能体会把每个批次的分析结果写成batch-*.json其中包含节点文件、函数、类和边imports、calls、tested_by等关系类型完整枚举见 schema.ts。其中tested_by表示某生产代码文件被某个测试文件覆盖。但 LLM 生成的这类边有三个通病通病原因方向系统性反了LLM 只有在分析测试文件时才会看到import 生产代码的关系于是它习惯把测试文件写在 source 一侧test → production出现无意义的边test↔test、production↔production、端点节点缺失的孤儿边覆盖不全很多测试文件根本没被 LLM 关联到任何生产文件简单地把这些边删掉重算会丢掉 LLM 真实看到的配对证据比如一个 Go 的_test.go覆盖同包多个.go文件。Understand-Anything 的方案是保留配对证据纠正方向补齐遗漏——这正是两遍归一化的核心思想见 SKILL.md 的说明。二、第一遍保留 LLM 语义纠正方向Pass 1核心逻辑位于 merge-batch-graphs.py 的link_tests函数中。Pass 1 遍历所有type tested_by的边对每条边按端点分类做三选一处理方向正确production → test原样保留方向反了test → production原地交换 source/target把方向纠正为forward并在 description 中追加[direction corrected]审计标记——配对证据被完整保留只是方向修正了语义损坏test↔test、prod↔prod、端点缺失直接丢弃因为已无可恢复的含义。此外还有两个工程细节权重感知去重同一对 (production, test) 出现多条边时保留 weight 更大的那条规则与后续 Step 6 的边去重保持一致避免低置信度边占位tested标签凡是最终成为某条tested_by边 source 侧的生产文件节点都会被打上tested标签方便在面板里一眼看出哪些代码有测试覆盖。三、第二遍按路径约定补齐遗漏Pass 2Pass 1 之后还有一些测试文件没有被任何边覆盖。Pass 2 就登场了对每个未配对的测试文件调用 production_candidates 按各语言的路径约定生成候选生产文件路径列表取第一个在图中真实存在的候选生成一条新的production → test边weight 0.5description 标记为 Path-based pairing (deterministic)。候选规则覆盖了主流语言布局配置集中在文件顶部的 tested_by linker 配置区JS/TS 系foo.test.ts→ 同目录foo.ts/tsx/js/...支持__tests__/、test/、spec/子目录走出匹配支持tests/foo/X.test.ts→src|app|lib|根目录/foo/X.ts的镜像树Gofoo_test.go→ 同目录foo.goPythontest_bar.py/bar_test.py→ 同目录或镜像树bar.py支持 Django 式mypkg/tests/布局Java/KotlinMaven/Gradle 布局src/test/java/...→src/main/java/...C#支持svc/tests/→svc/src/以及My.App.Tests/→My.App/的镜像项目Swift/Rust/PHPtests/目录内的文件一律视为测试源。判断某个路径是否算测试文件由 is_test_path 统一完成——注意 JS/TS 系要求文件名必须带.test/.spec中缀所以__tests__/helpers.ts这种工具文件不会被误判成测试。四、结果在哪里看合并报告自审计整个链接器在merge_and_normalize的Step 5b阶段运行位于节点去重之后、边去重之前并在合并报告中输出独立小节Fixed区统计翻转了多少条测试边、丢弃了多少条损坏边Tested-by linker区统计新增了多少条路径约定边、给多少生产节点打上 tested 标签。这样每次合并都是可审计的哪些边是 LLM 证据、哪些是确定性规则补齐、哪些被纠正了方向一目了然。最终产物写入ua-dir/intermediate/assembled-graph.json供后续面板渲染与评审阶段消费。五、测试覆盖91 个单元测试守住行为契约这套机制本身也有完善的测试。test_merge_batch_graphs.py 包含 91 个测试用例重点验证IsTestPathTests13 种语言的测试文件识别与生产文件排除ProductionCandidatesTests各语言候选路径的生成顺序与优先级同目录优先于镜像树LinkTestsTests反向边交换而非删除、test↔test 与孤儿边丢弃、重复边保留高权重、补齐不重复已有配对、幂等性等典型用例 test_inverted_llm_edge_is_swapped_not_stripped 直接演示了src/foo.test.ts → src/foo.ts的反向边被纠正为src/foo.ts → src/foo.test.ts且 description 中留痕 direction corrected。运行方式python -m unittest tests.skill.understand.test_merge_batch_graphs -v六、小结为什么交换优于删除重算方案优点缺点删除全部 LLM 测试边纯路径约定重算规则简单丢失真实项目的非标准配对如一对多测试覆盖覆盖率下降两遍归一化本项目方案保留 LLM 真实证据 纠正方向 补齐遗漏 全程留痕可审计规则较多但均有单测约束对新手而言记住一句话即可tested_by 边最终永远是生产文件 → 测试文件方向反的会被翻转、坏掉的会被丢弃、缺掉的会按路径约定补上而且每一步都会在合并报告里留下数字账目。这也是 Understand-Anything 图谱是用来教你的不是用来炫技的这一理念的落地细节。 延伸阅读SKILL.md 中 Phase 2 合并脚本的完整说明以及 graph-reviewer.md 中 27 种边类型含tested_by的评审约定。【免费下载链接】Understand-AnythingGraphs that teach graphs that impress. Turn any code into an interactive knowledge graph you can explore, search, and ask questions about. Works with Claude Code, Codex, Cursor, Copilot, Gemini CLI, and more.项目地址: https://gitcode.com/GitHub_Trending/un/Understand-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考