大模型应用
在写新测试前静态找出没有对应测试的源文件并给出建议测试路径
当需要在不构建、不跑测试的情况下,快速列出仓库中缺少配对测试的源文件并得到建议测试文件位置时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在写新测试前静态找出没有对应测试的源文件通用
解决思路
- 使用调用方指定的最窄的仓库或包根目录,不要扫描父级工作区。
- 只运行一次合适的分析器,不要用人工 glob、文件名匹配或目视检查替代分析器执行;多语言分析时若需区分已配对与未配对源文件,传入 --include-tested。
- 若调用方同时说“不要构建”,要说明:静态配对禁止编译目标仓库和运行其测试,但不禁止启动本技能的仅解析分析器。
- 把分析器依赖当作环境前置条件:分析器调用失败时,不要安装包、不要尝试错误引擎、不要构建仓库、不要退回人工扫描,而是报告前置条件失败。
- 结果必须基于分析器输出的 JSON,保留其已配对/未配对分类和建议的相对路径,不要自行猜测不同路径。
- 当调用方指定了子目录时,把分析器相对路径加上该子目录前缀,使报告路径相对于工作区。
- 报告请求的结果并附上静态配对覆盖率的说明;不要追加构建、装包、跑测试或覆盖率命令;当存在已配对源文件时,列出覆盖它们的测试文件以便审计未配对分类。
- C#/.NET 专用仓库优先用 Roslyn 引擎:运行 dotnet run scripts/Find-UntestedSources.cs -- <repo-root> [--top N],可用 > pairing.json 保存报告,诊断输出到 stderr、JSON 输出到 stdout。
- 非纯 C# 仓库或需要跨 C#、Python、TypeScript/JavaScript、Go、Java、Rust、Ruby、Kotlin、Swift、PowerShell、C++ 统一分析时用 tree-sitter 引擎:python scripts/find_untested_sources.py <repo-root>,可用 --lang 限定语言(可重复)、--limit-untested N 截断报告、--include-tested 额外输出 tested_sources。
- Roslyn 引擎工作方式:递归遍历并剪枝 bin/、obj/、node_modules/、.git/、.vs/、packages/ 及点号子目录,跳过生成文件(.g.cs、.Designer.cs、.AssemblyInfo.cs)。
- Roslyn 引擎按最近的 .csproj 判定测试项目:项目名以 .Tests、.Test、.UnitTests、.IntegrationTests、.E2E、.EndToEnd、.Spec、.Specs 结尾,或内容引用 Microsoft.NET.Test.Sdk、MSTest.Sdk、Microsoft.Testing.Platform、xunit、NUnit、TUnit,或含 <IsTestProject>true</IsTestProject>。
- Roslyn 引擎并行解析每个源文件(CSharpSyntaxTree.ParseText,仅语法不编译),把每个 BaseTypeDeclarationSyntax / DelegateDeclarationSyntax 记录为 (ShortName, EnclosingNamespace, FilePath)。
- Roslyn 引擎并行扫描测试文件,收集 using 指令与所在命名空间,遍历每个 IdentifierToken 在短名索引中查找,并严格消歧:仅当声明的命名空间匹配测试文件的某个 using、所在命名空间或其前缀时才归属。
- Roslyn 引擎做配对与建议:反转成 source → [tests],依据 <ProjectReference> 构建生产到测试项目映射,对每个未测试源文件在引用它的测试项目下镜像其项目内相对路径作为建议路径。
- Roslyn 引擎按声明数降序、再按字母序输出 JSON。
- tree-sitter 引擎工作方式:递归遍历并剪枝常见构建/第三方目录(bin、obj、node_modules、target、dist、build、vendor、__pycache__、.venv、.git 等)和生成文件(.d.ts、.g.cs、.Designer.cs、_pb2.py、*.min.js、AssemblyInfo.cs 等)。
- tree-sitter 引擎用 detect_language_from_path 按扩展名映射语言,未知扩展名跳过。
- tree-sitter 引擎按各语言路径启发式判定测试文件:Python 路径含 tests/ 或 test/,或文件名以 test_ 开头或 _test.py 结尾,或 conftest.py;JS/TS/TSX 路径含 __tests__、tests、test、spec、e2e,或文件名含 .test./.spec.;Go 文件名以 _test.go 结尾;Java 路径含 test/tests,或文件名以 Test.java/Tests.java 结尾;Rust 路径含 tests/ 或 benches/;C# 路径含 tests/,或项目段以 .Tests/.Test/.UnitTests/.IntegrationTests 结尾,或文件名以 Tests/Test 结尾;Ruby 路径含 spec/ 或 test/,或文件名以 _spec.rb/_test.rb 结尾;Kotlin 路径含 test# 或 tests/ 或 spec/,或文件名以 Test.kt/Tests.kt/Spec.kt 结尾;Swift 路径含 test/、tests/、uitests/、integrationtests/(不区分大小写),或文件名以 Test.swift/Tests.swift 结尾;PowerShell 路径含 test/、tests/、pester/,或文件名以 .Tests.ps1/.Test.ps1 结尾;C++ 路径含 test/、tests/、testing/,或文件名以 test_ 开头或 _test.cpp/_tests.cpp 结尾。
- tree-sitter 引擎用 process(text, ProcessConfig(structure, imports, symbols)) 提取声明项、原始 import 语句和扁平声明名列表。
- tree-sitter 引擎做配对:对每个测试文件,合并 import 解析(按语言,如 Python from pkg.mod import x → pkg/mod.py;Java import a.b.C; → a/b/C.java;C# using 是命名空间而非文件,故为空操作)与标识符重叠(长度 ≥ 4 的类词 token 与声明名匹配)。
- tree-sitter 引擎按声明数降序输出 untested_sources。
- 消费输出:用 untested[*].source / untested_sources[*].path 选下一个要测试的源文件(声明数最高优先)。
- 消费输出:用 *.suggested_test_path 作为新测试文件的落点;Roslyn 引擎会遵循已 <ProjectReference> 该源项目的测试项目,无需 dotnet sln add;多语言引擎在找不到测试根时可能建议同目录测试;当源文件已有兄弟文件配对时,必须复用其测试目录约定,而不是退回源文件同目录。
- 消费输出:用 source_to_tests(Roslyn)或 --include-tested 的 tested_sources(多语言)验证新写的测试文件是否落入目标源文件的列表。
- 消费输出:用 orphan_tests(多语言)找出不引用任何同语言源文件的测试,用于排查陈旧或仅集成测试。
- 始终把最终结果标注为静态配对启发式,而非行/分支覆盖率证据;即使每个请求的源文件都有明显匹配或缺失的测试,也要附上该说明。
适用边界 · 注意事项
- 需要真实行/分支/Cobertura 覆盖率数据时,改用 coverage-analysis。
- 需要基于真实覆盖率数据的测试优先级时,改用 coverage-analysis。
- 需要 CRAP 分数/风险热点时,改用 coverage-analysis。
- 需要判断现有测试是否足够强时,改用 test-gap-analysis(变异推理)或 assertion-quality。