# 测试和验证
**本文引用的文件**
- [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)