# 测试和验证 **本文引用的文件** - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs) - [GFramework.SourceGenerators.Tests/core/GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs) - [GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs) - [GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs) - [GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs) - [GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs) - [GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs) - [GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs) - [GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj](file://GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj) ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 引言 本文件面向源代码生成器的测试与验证,系统性阐述测试框架与策略,重点围绕快照测试机制、三类生成器(枚举扩展、日志、上下文感知)的测试用例设计、测试数据准备与执行流程、边界条件与异常模拟、最佳实践与调试技巧,以及在持续集成中的自动化与质量保障流程。目标是帮助开发者高效编写与维护生成器测试,并扩展测试覆盖面。 ## 项目结构 测试工程位于 GFramework.SourceGenerators.Tests,按功能域划分子目录: - core:通用测试基础设施(快照测试与基础测试) - enums:枚举扩展生成器的快照测试 - logging:日志生成器的快照测试 - rule:上下文感知生成器的快照测试 生成器实现位于 GFramework.SourceGenerators,对应三个子命名空间: - enums:枚举扩展生成器 - logging:日志生成器 - rule:上下文感知生成器 通用生成器基类位于 GFramework.SourceGenerators.Common/generator,为不同类型的生成器提供统一的增量生成与解析能力。 ```mermaid graph TB subgraph "测试工程" T_CORE["core/GeneratorSnapshotTest.cs
core/GeneratorTest.cs"] T_ENUM["enums/EnumExtensionsGeneratorSnapshotTests.cs"] T_LOG["logging/LoggerGeneratorSnapshotTests.cs"] T_RULE["rule/ContextAwareGeneratorSnapshotTests.cs"] end subgraph "生成器实现" G_ENUM["enums/EnumExtensionsGenerator.cs"] G_LOG["logging/LoggerGenerator.cs"] G_RULE["rule/ContextAwareGenerator.cs"] end subgraph "通用基类" BASE_ENUM["Common/generator/AttributeEnumGeneratorBase.cs"] BASE_TYPE["Common/generator/TypeAttributeClassGeneratorBase.cs"] BASE_META["Common/generator/MetadataAttributeClassGeneratorBase.cs"] end T_ENUM --> G_ENUM T_LOG --> G_LOG T_RULE --> G_RULE G_ENUM --> BASE_ENUM G_LOG --> BASE_TYPE G_RULE --> BASE_META ``` 图表来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L1-L72) - [GFramework.SourceGenerators.Tests/core/GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs#L1-L39) - [GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs#L1-L208) - [GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs#L1-L591) - [GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L1-L84) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234) - [GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104) - [GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs#L1-L35) - [GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs) 章节来源 - [GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj](file://GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj#L1-L30) ## 核心组件 - 快照测试框架(GeneratorSnapshotTest):封装 Roslyn 源生成器测试流程,自动对比生成产物与快照文件,支持首次生成快照与后续比对。 - 基础测试工具(GeneratorTest):用于直接断言生成源文件集合,适用于不需要快照管理的场景。 - 生成器基类体系:AttributeEnumGeneratorBase、TypeAttributeClassGeneratorBase、MetadataAttributeClassGeneratorBase,分别面向“属性+枚举”、“属性+类”、“元数据+类”的增量生成模式。 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L1-L72) - [GFramework.SourceGenerators.Tests/core/GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs#L1-L39) - [GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104) - [GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs#L1-L35) ## 架构总览 下图展示测试执行的端到端流程:测试用例构造输入源码,调用快照测试框架,Roslyn 源生成器运行并产出生成源;框架将生成产物与快照文件逐项比对,断言失败或首次运行生成新快照。 ```mermaid sequenceDiagram participant Test as "测试用例" participant Snap as "快照测试框架" participant Roslyn as "Roslyn 源生成器测试" participant Gen as "具体生成器" participant FS as "快照文件系统" Test->>Snap : 调用 RunAsync(source, snapshotFolder) Snap->>Roslyn : 配置测试状态Sources、行为、禁用诊断 Roslyn->>Gen : 触发增量生成与源输出 Gen-->>Roslyn : 返回生成源文件集合 Roslyn-->>Snap : 生成源文件集合 loop 遍历每个生成文件 Snap->>FS : 读取/写入快照 Snap->>Snap : 标准化换行并断言相等 end ``` 图表来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L20-L61) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L14-L35) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L15-L41) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L67) ## 详细组件分析 ### 快照测试框架(GeneratorSnapshotTest) - 设计要点 - 使用 Roslyn 的 CSharpSourceGeneratorTest 作为测试宿主,配置 TestState.Sources 传入待测源码。 - 通过 TestBehaviors 跳过生成源检查,聚焦于生成产物与快照的比对。 - 支持禁用特定诊断(如 GF_Common_Trace_001),避免噪声干扰。 - 首次运行若快照不存在,则创建快照并断言失败,引导开发者接受新快照。 - 标准化换行符与空白,确保跨平台一致性。 - 断言策略 - 对每个生成文件,读取对应快照,标准化后与生成内容断言相等。 - 任一文件不匹配即报告差异文件名,便于定位问题。 - 适用场景 - 生成器输出稳定且可预期的场景,适合长期维护的快照回归。 ```mermaid flowchart TD Start(["开始 RunAsync"]) --> Setup["配置测试状态
设置 Sources/TestBehaviors/禁用诊断"] Setup --> Run["运行测试并收集生成源"] Run --> Loop{"遍历每个生成文件"} Loop --> |存在快照| Compare["读取快照并标准化"] Compare --> AssertEq{"与生成内容相等?"} AssertEq --> |否| Fail["断言失败并报告文件名"] AssertEq --> |是| Next["继续下一个文件"] Loop --> |无快照| Create["创建快照目录并写入"] Create --> FirstFail["断言失败并提示新快照位置"] Next --> Done(["结束"]) FirstFail --> Done Fail --> Done ``` 图表来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L20-L61) 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L1-L72) ### 基础测试工具(GeneratorTest) - 设计要点 - 通过向 TestState.GeneratedSources 添加期望的文件名与内容,直接断言生成结果。 - 适用于生成逻辑复杂但输出不稳定或难以维护快照的场景。 - 使用建议 - 将生成器输出拆分为明确的片段,分批断言,提升可读性与可维护性。 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs#L1-L39) ### 枚举扩展生成器(EnumExtensionsGenerator)与测试 - 生成逻辑概览 - 基于 AttributeEnumGeneratorBase,扫描带指定属性的枚举。 - 生成 IsX 方法与 IsIn 方法,支持 Flags 枚举与普通枚举。 - 输出文件名约定为 {EnumName}.EnumExtensions.g.cs。 - 测试用例设计 - 基础枚举的 Is 方法集、IsIn 方法、带 Flags 的枚举、关闭 Is 方法或 IsIn 方法的开关。 - 每个场景独立快照,确保变更可追踪。 - 边界与异常 - 生成器在符号校验阶段会报告非 partial 类型或非枚举类型的错误诊断。 - 测试中通过快照验证诊断是否按预期产生。 ```mermaid classDiagram class AttributeEnumGeneratorBase { +Initialize(context) #ResolveAttribute(compilation, symbol) #ValidateSymbol(...) #Generate(symbol, attr) #GetHintName(symbol) } class EnumExtensionsGenerator { +AttributeShortNameWithoutSuffix +ResolveAttribute(...) +ValidateSymbol(...) +Generate(symbol, attr) +GetHintName(symbol) } AttributeEnumGeneratorBase <|-- EnumExtensionsGenerator ``` 图表来源 - [GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L10-L104) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L14-L114) 章节来源 - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114) - [GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs#L1-L208) ### 日志生成器(LoggerGenerator)与测试 - 生成逻辑概览 - 基于 TypeAttributeClassGeneratorBase,扫描带指定属性的类。 - 生成只读日志字段,支持自定义日志名、字段名、访问修饰符、静态/实例等。 - 输出文件名约定为 {ClassName}.Logger.g.cs。 - 测试用例设计 - 默认配置、自定义日志名、自定义字段名、实例字段、公开字段、泛型类等多维度快照。 - 每个维度一个测试,确保参数组合正确。 - 边界与异常 - 生成器在 ValidateSymbol 中可扩展校验规则(例如类可见性、接口约束等)。 - 测试通过快照验证生成代码与预期一致。 ```mermaid classDiagram class TypeAttributeClassGeneratorBase { #AttributeType #ResolveAttribute(compilation, symbol) } class LoggerGenerator { +AttributeShortNameWithoutSuffix +ValidateSymbol(...) +Generate(context, compilation, symbol, attr) +GetHintName(symbol) } TypeAttributeClassGeneratorBase <|-- LoggerGenerator ``` 图表来源 - [GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs#L10-L35) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L15-L103) 章节来源 - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103) - [GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs#L1-L591) ### 上下文感知生成器(ContextAwareGenerator)与测试 - 生成逻辑概览 - 基于 MetadataAttributeClassGeneratorBase,扫描带指定元数据特性的类。 - 校验必须为 partial class;生成 Context 属性与 IContextAware 接口显式实现。 - 输出文件名约定为 {ClassName}.ContextAware.g.cs。 - 测试用例设计 - 单一快照测试,覆盖 partial class、接口实现、上下文访问等关键点。 - 边界与异常 - 非 partial 或非 class 的类型会在生成阶段报告诊断,测试通过快照验证诊断与生成结果。 ```mermaid classDiagram class MetadataAttributeClassGeneratorBase { +AttributeMetadataName +AttributeShortNameWithoutSuffix +Initialize(context) #ResolveAttribute(...) #ValidateSymbol(...) #Generate(...) #GetHintName(symbol) } class ContextAwareGenerator { +AttributeShortNameWithoutSuffix +ValidateSymbol(...) +Generate(...) +GetHintName(symbol) } MetadataAttributeClassGeneratorBase <|-- ContextAwareGenerator ``` 图表来源 - [GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L122) 章节来源 - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234) - [GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L1-L84) ## 依赖关系分析 - 测试工程依赖 Roslyn 与 NUnit 测试 SDK,以及生成器实现项目。 - 各生成器依赖对应的通用基类,形成清晰的职责分离与复用。 - 快照测试框架与具体生成器解耦,通过 Roslyn 测试宿主统一接入。 ```mermaid graph LR Proj["GFramework.SourceGenerators.Tests.csproj"] --> |引用| GenEnum["GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs"] Proj --> |引用| GenLog["GFramework.SourceGenerators/logging/LoggerGenerator.cs"] Proj --> |引用| GenRule["GFramework.SourceGenerators/rule/ContextAwareGenerator.cs"] GenEnum --> BaseEnum["Common/generator/AttributeEnumGeneratorBase.cs"] GenLog --> BaseType["Common/generator/TypeAttributeClassGeneratorBase.cs"] GenRule --> BaseMeta["Common/generator/MetadataAttributeClassGeneratorBase.cs"] ``` 图表来源 - [GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj](file://GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj#L21-L23) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234) - [GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104) - [GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs#L1-L35) - [GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs) 章节来源 - [GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj](file://GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj#L1-L30) ## 性能考虑 - 快照测试的 I/O 成本主要集中在首次生成与大量文件比对。建议: - 控制快照粒度,避免单个测试生成过多文件。 - 在 CI 中缓存快照目录,减少重复生成。 - 使用稳定的换行与空白规范化,避免平台差异导致的无效比对。 - 生成器本身采用增量生成,尽量保持解析与生成逻辑轻量,避免在生成阶段做重型计算。 ## 故障排查指南 - 快照不匹配 - 首次运行会因缺少快照而断言失败并提示新快照位置,接受后重试。 - 若断言失败,检查生成文件名与内容是否符合预期,必要时更新快照。 - 诊断噪声 - 已在测试中禁用特定诊断(如 GF_Common_Trace_001),若仍有噪声,可在测试中进一步调整禁用列表。 - 生成器校验失败 - 枚举扩展生成器对非 partial 或非枚举类型会报告诊断;上下文感知生成器对非 class/partial 也会报告诊断。检查输入源码是否满足生成器前置条件。 - 跨平台差异 - 快照框架已做换行与空白标准化,仍出现差异时,检查本地编辑器的换行符设置与 IDE 行尾处理。 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L36-L61) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L37-L49) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L39-L67) ## 结论 该测试体系以快照测试为核心,结合通用测试基类与生成器基类,实现了对三类源代码生成器的全面验证。通过清晰的测试用例设计、稳健的断言策略与良好的边界处理,既保证了生成结果的稳定性,也为持续改进提供了可靠保障。建议在新增生成器或修改现有逻辑时,优先补充快照测试,确保回归可控。 ## 附录 ### 如何编写新的快照测试 - 准备输入源码:包含生成器特性与目标类型定义,必要时内联接口或工厂以满足生成依赖。 - 编写测试方法:调用 GeneratorSnapshotTest.RunAsync(source, snapshotFolder),确保 snapshotFolder 存在且可写。 - 首次运行:断言失败并生成快照,提交快照文件;后续运行将与快照比对。 - 维护快照:当生成逻辑变更时,确认变更合理后接受新快照。 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L20-L61) - [GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs#L10-L48) - [GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs#L10-L105) - [GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L19-L83) ### 如何扩展测试覆盖范围 - 新增测试场景:针对生成器的关键参数与边界条件(如 Flags 枚举、泛型类、访问修饰符、静态/实例字段等)补充测试。 - 引入基础测试工具:对于输出不稳定或难以维护快照的场景,使用 GeneratorTest 直接断言生成源集合。 - 生成器扩展:在生成器基类中增加更多校验与可配置项时,同步完善测试用例与快照。 章节来源 - [GFramework.SourceGenerators.Tests/core/GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs#L19-L38) - [GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L57-L103) - [GFramework.SourceGenerators/logging/LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L51-L93) - [GFramework.SourceGenerators/rule/ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L78-L122) ### 持续集成中的测试自动化与质量保证 - 依赖与目标框架:测试工程同时支持 net8.0 与 net10.0,确保在不同 .NET 版本下均能运行。 - 包引用:包含 Roslyn 与 NUnit 测试 SDK,以及 Roslyn 源生成器测试包,保障测试宿主与断言能力。 - 快照目录:在项目文件中预置快照目录占位,CI 中可缓存以加速构建。 - 建议流程 - PR 触发测试:所有快照测试通过后方可合并。 - 快照审查:任何快照变更需在 PR 中明确说明原因。 - 失败处理:CI 失败时优先检查断言失败的文件名与差异,必要时在受控环境下接受新快照。 章节来源 - [GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj](file://GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj#L1-L30)