用途:回答“哪些源文件没有任何测试文件引用其声明类型/符号”,用于在编写新测试前确定下一个要覆盖的文件,无需编译、解析依赖或运行测试。与行/分支覆盖率工具不同,它是静态配对启发式,几秒内完成。
两个引擎(任选其一,JSON 契约兼容):Roslyn(C#,scripts/Find-UntestedSources.cs)适合纯 .NET 仓库,按命名空间严格消歧,短名重复时更准确;tree-sitter(scripts/find_untested_sources.py)适合多语言(C#、Python、TypeScript/JavaScript、Go、Java、Rust、Ruby、Kotlin、Swift、PowerShell、C++)。纯 .NET 优先 Roslyn。
用法:在技能目录运行。Roslyn:dotnet run scripts/Find-UntestedSources.cs -- <repo-root> [--top N],可重定向保存 pairing.json;需支持 file-based app 的 .NET SDK,首次需 NuGet 还原 Microsoft.CodeAnalysis.CSharp。Polyglot:python scripts/find_untested_sources.py <repo-root> [--lang X] [--limit-untested N],可加 --include-tested 输出已验证来源;需 Python 3.10+ 和 pip install tree-sitter-language-pack。诊断走 stderr,JSON 走 stdout。
主要能力:递归发现源码/测试文件(跳过 bin、obj、node_modules 等);按项目名后缀、SDK 引用或路径规则区分测试与源;解析声明并配对;输出未测试文件、建议测试路径、source_to_tests 映射、orphan_tests。
限制:为静态解析启发式,不反映真实覆盖率;反射/DI 字符串引用、扩展方法、var/模式匹配、短标识符(<4 字符)、monorepo 路径别名等可能漏配或误配。使用窄范围根目录,仅执行一次分析器,不要用 glob 或人工扫描替代;分析器依赖缺失时应报告而非安装或降级。始终标注为静态配对启发式。适用:请求无测试文件列表、生成测试前的工作清单、生成后验证配对、枚举弱配对来源。