dotnet-test-audit 是一个用于审计 .NET 测试价值的技能,主要面向 C# 和 F# 测试代码。它的核心目标不是增加或减少测试数量,而是识别每个测试能够检测什么缺陷,从而在回归检测信心与维护成本之间取得平衡。
用途 该技能适用于测试评审、拟新增测试的评估,以及经授权的测试清理。在评审场景中,它只产出发现,不编辑测试或生产代码;在授权清理场景中,它要求先为每个候选变更建立证据,再执行修改。
主要能力 审计过程围绕以下能力展开:
- 确定审计边界:读取仓库说明、请求范围、测试项目与 CI 选择,保留既有语言、SDK、依赖、框架与运行器,识别目标框架与执行机制(VSTest、Microsoft.Testing.Platform、Expecto 可执行文件或仓库脚本),不假设过滤语法可互换。
- 建立测试价值证据:对每个拟新增或既有候选测试,明确可观察契约与拥有它的生产入口点、可能缺陷及能检测该缺陷的断言、证明相关路径执行的输入与观察、已有检测相同缺陷的测试、该层的独有价值(如序列化、运行时集成、失败处理或生命周期行为)。
- 检查证据:阅读完整测试、参数数据、辅助代码、生产所有者与相关调用方,检查发现与条件编译,追踪 mock 行为到生产边界,判断 fixture 是否提供了实现本应产生的结果,并在断言依赖提供方或运行时行为时阅读依赖契约。
- 识别模式:调查无显式断言、期望值由生产代码计算、源文本/快照/反射断言、重复测试、私有辅助或 mock 调用断言、仅测试访问或注入、负向断言、空集合或默认结果等模式,但不将其视为自动删除规则。
- 记录决策:使用保留、修复、合并、移除或未决,记录测试位置、契约、可检测缺陷、证据与执行状态;在合并或移除前,还需记录保留的断言及其 CI 路径、数据行/目标框架/平台/序列化/运行时差异、拟移除支持代码的用途与非测试消费者、相关历史或问题证据、拟议编辑、风险与聚焦验证命令。
- 应用授权变更:将批次限制在相关契约集合内,在移除旧所有者前转移有用断言;仅在清理授权包含生产访问或抽象变更时才修改它们;在声明代码未使用前搜索反射、依赖注入、生成调用方与外部 API 义务;不因测试使用而移除 InternalsVisibleTo、接口、时钟或工厂;保留失败的契约断言,单独诊断基线失败。
- 验证结果:在每次构建与运行期间保持源码固定,记录源码修订或脏补丁、配置、命令、所选运行时与实际结果;在授权编辑前后运行受影响测试,包括兄弟测试与适用目标框架;检查发现与执行用例(含参数行),将跳过、未发现、被过滤与阻塞用例与通过分开报告;对缺陷回归,在可用时展示缺陷源码失败与修复后成功;对不确定的替换强度,在授权变异执行时于隔离副本中测试代表性缺陷;使用兼容的 Stryker.NET 或隔离手动变异,不根据 C# 测试运行器推断 F# 变异支持;无效构建、缺失依赖或无关超时不能证明缺陷检测;在比较结果前重建变更 F# 内联代码的消费者;运行仓库格式化与变更检查,验证移动的测试仍包含在项目文件与 CI 过滤器中,并在编辑后重新检查契约清单。
- 交付审计:使用仓库的证据位置,否则使用 reliability/test-audit/,包含发现、决策、保留契约、验证证据与未决范围;区分静态推理、观察执行与变异证据;将生产变更与测试及测试支持分开报告;不因聚焦套件而声称完成仓库级审计;未经授权不发布发现、提交或创建 PR。
使用方式 该技能以技能形式提供,具体安装或调用命令在资料中暂未提供。使用时需遵循仓库既有约定,保留语言、SDK、依赖、框架与运行器,并在授权范围内执行审计与变更。
适用场景 适用于 C# 与 F# 测试评审、拟新增测试评估、测试清理与回归检测能力审计,尤其关注冗余覆盖、实现耦合与测试维护成本。
限制 不授权修复无关产品缺陷或重新定义预期行为;不因测试使用而移除有效的依赖边界或二进制兼容性;不假设不同运行器的过滤语法可互换;不根据 C# 测试运行器推断 F# 变异支持;无效构建、缺失依赖或无关超时不能证明缺陷检测;未经授权不发布发现、提交或创建 PR;缺失证据应标记为未决而非编造用途。