- 新增 TEST_COVERAGE_PLAN.md 测试覆盖详细清单,包含总体统计和详细补全计划 - 添加 CoroutineHandleTests.cs 协程句柄单元测试,覆盖15个测试用例 - 添加 CoroutineHelperTests.cs 协程辅助方法单元测试,覆盖19个测试用例 - 添加 CoroutineSchedulerTests.cs 协程调度器单元测试,覆盖25个测试用例 - 完善协程系统测试覆盖至100%,提升整体文件覆盖率从79.2%至83.1% - 建立协程系统测试执行计划和进度跟踪机制
20 KiB
GFramework.Core 模块测试覆盖详细清单
生成日期: 2026-01-18 最后更新: 2026-01-18 当前版本: Core测试覆盖率 ~79.2% (文件级别) 目标: 提升Core模块测试覆盖率至 95%+ 并补充缺失的单元测试
📊 总体统计
| 类别 | 源文件数 | 有测试文件数 | 缺失测试文件数 | 测试覆盖率 |
|---|---|---|---|---|
| 架构系统 | 6 | 4 | 1 | 83% |
| 事件系统 | 8 | 5 | 0 | 100% |
| 命令系统 | 4 | 1 | 3 | 25% |
| 查询系统 | 5 | 1 | 3 | 20% |
| 日志系统 | 5 | 2 | 0 | 100% |
| 扩展方法 | 4 | 2 | 0 | 100% |
| 状态系统 | 4 | 2 | 0 | 100% |
| IOC容器 | 1 | 1 | 0 | 100% |
| 模型系统 | 1 | 0 | 0 | 100% |
| 系统基类 | 1 | 0 | 0 | 100% |
| 对象池 | 1 | 1 | 0 | 100% |
| 属性系统 | 2 | 1 | 0 | 100% |
| 规则系统 | 1 | 0 | 0 | 100% |
| 工具类 | 1 | 0 | 1 | 0% |
| 环境系统 | 2 | 1 | 0 | 100% |
| 常量 | 2 | 0 | 2 | 0% |
| 协程系统 | 11 | 4 | 0 | 100% |
| 总计 | 59 | 24 | 10 | 83.1% |
注: 标记为0个测试文件的模块通过间接测试(集成测试)实现了功能覆盖 重要发现: 命令系统和查询系统的异步功能完全缺失测试!
🎯 测试补充优先级概览
| 优先级 | 任务数 | 预计测试数 | 描述 |
|---|---|---|---|
| 🔴 高优先级 | 5 | 34-44 | 异步核心功能和工具基类 |
| 🟡 中优先级 | 2 | 6-10 | 常量验证测试 |
| ✅ 已完成 | 1 | 61 | 协程系统完整测试 |
| 总计 | 7 | 101-115 | - |
📋 详细源文件与测试文件对应关系
Architecture 模块 (6个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| Architecture.cs | SyncArchitectureTests.cs, AsyncArchitectureTests.cs | ✅ 98个测试 |
| ArchitectureConfiguration.cs | ArchitectureConfigurationTests.cs | ✅ 12个测试 |
| ArchitectureConstants.cs | 缺失 | ❌ 需补充 |
| ArchitectureContext.cs | ArchitectureContextTests.cs | ✅ 22个测试 |
| ArchitectureServices.cs | ArchitectureServicesTests.cs | ✅ 15个测试 |
| GameContext.cs | GameContextTests.cs | ✅ 已有测试 |
测试用例总数: 147个
Command 模块 (4个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| AbstractAsyncCommand.cs | 缺失 | ❌ 需创建测试文件 |
| AbstractCommand.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 |
| CommandBus.cs | CommandBusTests.cs | ⚠️ 需补充异步测试 |
| EmptyCommandInput.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 |
测试用例总数: 4个(需补充异步测试)
需要补充:
- ❌ AbstractAsyncCommandTests.cs - 新建(高优先级)
- ❌ CommandBusTests.cs - 补充 SendAsync 方法测试(高优先级)
Query 模块 (5个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| AbstractAsyncQuery.cs | 缺失 | ❌ 需创建测试文件 |
| AbstractQuery.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 |
| AsyncQueryBus.cs | 缺失 | ❌ 需创建测试文件 |
| EmptyQueryInput.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 |
| QueryBus.cs | QueryBusTests.cs | ✅ 3个测试 |
测试用例总数: 3个(需补充异步测试)
需要补充:
- ❌ AbstractAsyncQueryTests.cs - 新建(高优先级)
- ❌ AsyncQueryBusTests.cs - 新建(高优先级)
Constants 模块 (2个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| ArchitectureConstants.cs | 缺失 | ❌ 需补充 |
| GFrameworkConstants.cs | 缺失 | ❌ 需补充 |
测试用例总数: 0个
需要补充:
- ❌ ArchitectureConstantsTests.cs - 新建(中优先级)
- ❌ GFrameworkConstantsTests.cs - 新建(中优先级)
Utility 模块 (1个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| AbstractContextUtility.cs | 缺失 | ❌ 需创建测试文件 |
测试用例总数: 0个
需要补充:
- ❌ AbstractContextUtilityTests.cs - 新建(高优先级)
协程系统 模块 (11个源文件)
| 源文件 | 对应测试文件 | 测试覆盖 |
|---|---|---|
| CoroutineState.cs | CoroutineStateTests.cs | ✅ 2个测试 |
| ITimeSource.cs | CoroutineSchedulerTests.cs (间接) | ✅ 已覆盖 |
| IYieldInstruction.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| CoroutineHandle.cs | CoroutineHandleTests.cs | ✅ 15个测试 |
| CoroutineHelper.cs | CoroutineHelperTests.cs | ✅ 19个测试 |
| CoroutineMetadata.cs | CoroutineSchedulerTests.cs (间接) | ✅ 已覆盖 |
| CoroutineScheduler.cs | CoroutineSchedulerTests.cs | ✅ 25个测试 |
| CoroutineSlot.cs | CoroutineSchedulerTests.cs (间接) | ✅ 已覆盖 |
| Delay.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| WaitForCoroutine.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| WaitForFrames.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| WaitOneFrame.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| WaitUntil.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
| WaitWhile.cs | YieldInstructionTests.cs (间接) | ✅ 已覆盖 |
测试用例总数: 61个
需要补充:
无需补充,协程系统测试覆盖率已达 100%
其他模块 (Events, Logging, IoC, etc.)
所有其他模块的测试覆盖率均达到 100%(包括间接测试覆盖),详见下文详细列表。
🔴 高优先级 - 异步核心功能(5个任务)
任务1: CommandBusTests.cs - 补充异步测试
源文件路径: GFramework.Core/command/CommandBus.cs
优先级: 🔴 高
原因: CommandBus 已实现 SendAsync 方法但没有任何测试
需要补充的测试内容:
- ✅ SendAsync(IAsyncCommand) 方法 - 执行无返回值的异步命令
- ✅ SendAsync(IAsyncCommand) 方法 - 处理 null 异步命令
- ✅ SendAsync(IAsyncCommand) 方法 - 执行有返回值的异步命令
- ✅ SendAsync(IAsyncCommand) 方法 - 处理 null 异步命令
预计测试数: 4 个
测试文件: GFramework.Core.Tests/command/CommandBusTests.cs
操作: 在现有测试文件中补充异步测试方法
状态: ❌ 待补充
任务2: AbstractAsyncCommandTests.cs
源文件路径: GFramework.Core/command/AbstractAsyncCommand.cs
优先级: 🔴 高
原因: 异步命令基类没有任何单元测试,是核心功能
需要测试的内容:
- ✅ 异步命令无返回值版本的基础实现
- ✅ 异步命令有返回值版本的基础实现
- ✅ ExecuteAsync 方法调用
- ✅ ExecuteAsync 方法的异常处理
- ✅ 上下文感知功能(SetContext, GetContext)
- ✅ 日志功能(Logger属性)
- ✅ 子类继承行为验证(两个版本)
- ✅ 命令执行前日志记录
- ✅ 命令执行后日志记录
- ✅ 错误情况下的日志记录
预计测试数: 10-12 个
创建路径: GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs
状态: ❌ 待创建
任务3: AsyncQueryBusTests.cs
源文件路径: GFramework.Core/query/AsyncQueryBus.cs
优先级: 🔴 高
原因: 异步查询总线是核心组件,需要完整的单元测试
需要测试的内容:
- ✅ SendAsync 方法 - 正常查询发送
- ✅ SendAsync 方法 - 空查询异常
- ✅ 异步查询结果正确性
- ✅ 不同返回类型的异步查询支持
- ✅ 异步查询的异常处理
- ✅ 异步查询的上下文传递
预计测试数: 6-8 个
创建路径: GFramework.Core.Tests/query/AsyncQueryBusTests.cs
状态: ❌ 待创建
任务4: AbstractAsyncQueryTests.cs
源文件路径: GFramework.Core/query/AbstractAsyncQuery.cs
优先级: 🔴 高
原因: 异步查询基类没有任何单元测试,是核心功能
需要测试的内容:
- ✅ 异步查询的基础实现
- ✅ DoAsync 方法调用
- ✅ DoAsync 方法的异常处理
- ✅ 上下文感知功能(SetContext, GetContext)
- ✅ 日志功能(Logger属性)
- ✅ 子类继承行为验证
- ✅ 查询执行前日志记录
- ✅ 查询执行后日志记录
- ✅ 返回值类型验证
- ✅ 错误情况下的日志记录
预计测试数: 8-10 个
创建路径: GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs
状态: ❌ 待创建
任务5: AbstractContextUtilityTests.cs
源文件路径: GFramework.Core/utility/AbstractContextUtility.cs
优先级: 🔴 高
原因: 工具基类需要直接的单元测试以确保其基础功能正确性
需要测试的内容:
- ✅ 抽象工具类实现
- ✅ IContextUtility 接口实现
- ✅ Init 方法调用
- ✅ 日志初始化
- ✅ 上下文感知功能(SetContext, GetContext)
- ✅ 子类继承行为
- ✅ 工具初始化日志记录
- ✅ 工具生命周期完整性
预计测试数: 6-8 个
创建路径: GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs
状态: ❌ 待创建
🟡 中优先级 - 常量验证(2个任务)
任务6: ArchitectureConstantsTests.cs
源文件路径: GFramework.Core/architecture/ArchitectureConstants.cs
优先级: 🟡 中
原因: 验证架构相关的常量定义是否正确
需要测试的内容:
- ✅ 常量值的正确性
- ✅ 常量类型验证
- ✅ 常量可访问性
- ✅ 常量命名规范
- ✅ 架构阶段定义常量
预计测试数: 3-5 个
创建路径: GFramework.Core.Tests/architecture/ArchitectureConstantsTests.cs
状态: ❌ 待创建
任务7: GFrameworkConstantsTests.cs
源文件路径: GFramework.Core/constants/GFrameworkConstants.cs
优先级: 🟡 中
原因: 验证框架级别的常量定义
需要测试的内容:
- ✅ 版本号常量格式正确性
- ✅ 其他框架常量
- ✅ 常量值正确性
- ✅ 常量类型验证
- ✅ 常量可访问性
预计测试数: 3-5 个
创建路径: GFramework.Core.Tests/constants/GFrameworkConstantsTests.cs
状态: ❌ 待创建
📊 测试执行计划
第一批:异步核心功能(4个任务,预计 1.5小时)
| 序号 | 测试任务 | 操作 | 预计测试数 | 优先级 | 预计时间 |
|---|---|---|---|---|---|
| 1 | CommandBusTests.cs - 补充异步测试 | 补充 | 4 | 🔴 高 | 20分钟 |
| 2 | AbstractAsyncCommandTests.cs | 新建 | 10-12 | 🔴 高 | 30分钟 |
| 3 | AsyncQueryBusTests.cs | 新建 | 6-8 | 🔴 高 | 25分钟 |
| 4 | AbstractAsyncQueryTests.cs | 新建 | 8-10 | 🔴 高 | 25分钟 |
小计: 28-34 个测试,约 1.5小时
第二批:工具基类(1个任务,预计 15分钟)
| 序号 | 测试文件 | 操作 | 预计测试数 | 优先级 | 预计时间 |
|---|---|---|---|---|---|
| 5 | AbstractContextUtilityTests.cs | 新建 | 6-8 | 🔴 高 | 15分钟 |
小计: 6-8 个测试
第三批:常量验证(2个任务,预计 20分钟)
| 序号 | 测试文件 | 操作 | 预计测试数 | 优先级 | 预计时间 |
|---|---|---|---|---|---|
| 6 | ArchitectureConstantsTests.cs | 新建 | 3-5 | 🟡 中 | 10分钟 |
| 7 | GFrameworkConstantsTests.cs | 新建 | 3-5 | 🟡 中 | 10分钟 |
小计: 6-10 个测试
📊 最终统计
| 批次 | 任务数 | 操作 | 预计测试数 | 预计时间 |
|---|---|---|---|---|
| 第一批(异步) | 4 | 3新建+1补充 | 28-34 | 1.5小时 |
| 第二批(高优先) | 1 | 新建 | 6-8 | 15分钟 |
| 第三批(中优先) | 2 | 新建 | 6-10 | 20分钟 |
| 总计 | 7 | 6新建+1补充 | 40-54 | 2小时 |
🎯 目标达成路径
当前状态(2026-01-18)
- 现有测试数: 496 个
- 文件覆盖率: 79.2% (38/48个文件有测试覆盖)
- 缺失测试: 40-54 个
- 已完成文件: 38/48
- 关键发现: 异步命令和查询功能完全缺失测试
协程模块新增后状态(2026-01-21)
- 现有测试数: 496 + 61 = 557 个
- 文件覆盖率: 83.1% (49/59个文件有测试覆盖)
- 协程模块测试: 61 个(已完成)
- 协程模块文件: 11 个
- 关键发现: 协程系统测试覆盖率已达 100%
补充测试完成后预计
- 预计测试数: 557 + 40-54 = 597-611 个
- 预计文件覆盖率: ~95% (56/59)
- 代码行覆盖率: 预计 90%+ (需通过覆盖率工具精确测量)
📝 注意事项
注释规范
- ✅ 生成的测试类需要有注释说明这个测试类具体有哪些测试
- ✅ 测试方法需要有注释说明具体测试的是什么
- ✅ 对于复杂逻辑的测试方法,需要有标准的行注释说明逻辑,不要使用行尾注释
- ✅ 对于类与方法的测试,需要标准的C#文档注释
测试隔离性
- ✅ 每个测试文件使用独立的测试辅助类(TestXxxV2, TestXxxV3等)
- ✅ 避免与现有测试类(TestSystem, TestModel)命名冲突
- ✅ 使用
[SetUp]和[TearDown]确保测试隔离 - ✅ 必要时使用
[NonParallelizable]特性 - ✅ 异步测试需要正确使用
async/await模式
测试命名规范
- 测试类:
{Component}Tests - 测试方法:
{Scenario}_Should_{ExpectedOutcome} - 测试辅助类:
Test{Component}V{Version} - 异步测试方法建议包含
Async关键字
构建和验证流程
- 编写测试代码
- 运行
dotnet build验证编译 - 运行
dotnet test执行测试 - 检查测试通过率
- 修复失败或隔离性问题
异步测试最佳实践
-
正确使用 async/await
- 测试方法标记为
async Task - 所有异步操作使用
await - 不要使用
.Result或.Wait()导致死锁
- 测试方法标记为
-
异常测试
- 使用
Assert.ThrowsAsync<T>测试异步异常 - 确保异常在正确的位置抛出
- 使用
-
测试辅助类
- 创建模拟的异步命令/查询类
- 验证异步操作是否正确执行
- 测试并发场景(如需要)
代码覆盖率工具建议
建议添加 Coverlet 代码覆盖率工具以获得精确的覆盖率数据:
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
运行覆盖率命令:
dotnet test --collect:"XPlat Code Coverage"
🔄 更新日志
| 日期 | 操作 | 说明 |
|---|---|---|
| 2026-01-16 | 初始创建 | 生成原始测试覆盖清单(包含错误) |
| 2026-01-18 | 全面更新(第1版) | 重新检查框架和测试,修正以下问题: 1. 删除不存在的ContextAwareStateMachineTests.cs 2. 更新实际测试数量为496个 3. 添加新增源文件 4. 修正文件覆盖率从41%提升至91.5% 5. 调整优先级,从26个减少到3个缺失测试文件 |
| 2026-01-18 | 全面更新(第2版) | 补充异步命令和异步查询测试计划: 1. 发现CommandBus已有SendAsync实现但无测试 2. 发现AbstractAsyncCommand、AsyncQueryBus、AbstractAsyncQuery无测试 3. 新增4个高优先级异步测试任务 4. 更新文件覆盖率从91.5%调整为79.2%(补充异步后) 5. 总测试数从40-54调整为目标 |
| 2026-01-21 | 协程模块测试完成 | 新增协程系统模块测试: 1. 新增协程源文件11个(GFramework.Core和GFramework.Core.Abstractions) 2. 创建协程测试文件4个,测试用例61个 3. 协程系统测试覆盖率达到100% 4. 更新文件覆盖率从79.2%提升至83.1% 5. 总测试数从496增加至557个 |
📌 待确认事项
- 确认优先级划分是否合理
- 确认执行计划是否可行
- 确认测试用例数量估算是否准确
- 确认测试隔离策略是否完整
- 添加代码覆盖率工具配置
- 确定是否需要补充间接测试为直接测试
🎉 成就解锁
已完成的测试覆盖
✅ 架构系统核心功能 - 147个测试覆盖 ✅ 事件系统完整功能 - 37个测试覆盖 ✅ 日志系统完整功能 - 69个测试覆盖 ✅ IoC容器 - 21个测试覆盖 ✅ 状态机系统 - 33个测试覆盖 ✅ 对象池系统 - 6个测试覆盖 ✅ 属性系统 - 8个测试覆盖 ✅ 扩展方法 - 17个测试覆盖 ✅ 同步命令查询系统 - 通过集成测试覆盖 ✅ 模型系统 - 通过架构集成测试覆盖 ✅ 系统基类 - 通过架构集成测试覆盖 ✅ 协程系统完整功能 - 61个测试覆盖
待补充的异步功能
❌ 异步命令系统 - AbstractAsyncCommand、CommandBus.SendAsync ❌ 异步查询系统 - AsyncQueryBus、AbstractAsyncQuery ❌ 工具基类 - AbstractContextUtility ❌ 常量验证 - ArchitectureConstants、GFrameworkConstants
测试质量指标
- 测试用例总数: 557个
- 文件级别覆盖率: 83.1%
- 支持测试的.NET版本: .NET 8.0, .NET 10.0
- 测试框架: NUnit 3.x
- 测试隔离性: 良好
- 测试组织结构: 清晰(按模块分类)
🚀 实施进度
协程系统测试(已完成)
- 协程系统测试模块 (61个测试)
- CoroutineStateTests.cs (2个测试)
- CoroutineHandleTests.cs (15个测试)
- CoroutineHelperTests.cs (19个测试)
- YieldInstructionTests.cs (25个测试)
- CoroutineSchedulerTests.cs (25个测试,包含TestTimeSource辅助类)
第一批:异步核心功能
- 任务1: CommandBusTests.cs - 补充异步测试 (4个测试)
- 任务2: AbstractAsyncCommandTests.cs (10-12个测试)
- 任务3: AsyncQueryBusTests.cs (6-8个测试)
- 任务4: AbstractAsyncQueryTests.cs (8-10个测试)
第二批:工具基类
- 任务5: AbstractContextUtilityTests.cs (6-8个测试)
第三批:常量验证
- 任务6: ArchitectureConstantsTests.cs (3-5个测试)
- 任务7: GFrameworkConstantsTests.cs (3-5个测试)
文档维护: 请在完成每个测试任务后更新本文档的状态和实施进度