测试基类与公共设施
本文档引用的文件
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBaseModule.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameDataSeedContributor.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestData.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestBase.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestBase.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameEntityFrameworkTestBase.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameTestEntityFrameworkCoreModule.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestModule.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestModule.cs
目录
简介
本文说明 MyPluginNameTestBase 泛型基类的设计与实现,重点阐述其继承 AbpIntegratedTest<TStartupModule> 所带来的集成测试能力。详细说明 SetAbpApplicationCreationOptions 中启用 Autofac 容器的必要性,解释 WithUnitOfWorkAsync 系列方法如何封装工作单元事务管理,确保测试数据的原子性与隔离性。结合代码示例展示如何在具体测试类中继承并使用该基类进行服务获取与事务控制。
项目结构
本项目遵循模块化分层架构,测试代码集中于 test/ 目录下,按测试层级划分为应用层、领域层和实体框架层测试。CMS.Plugin.MyPluginName.TestBase 作为公共测试基类库,为各层测试提供统一的基础设施支持。
测试模块继承关系:
MyPluginNameTestBase<TStartupModule>:通用测试基类MyPluginNameApplicationTestBase:应用层测试基类MyPluginNameDomainTestBase:领域层测试基类MyPluginNameEntityFrameworkTestBase:EF Core 测试基类
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestBase.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestBase.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameEntityFrameworkTestBase.cs
Section sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestBase.cs
核心组件
MyPluginNameTestBase 是整个测试体系的核心基类,通过泛型约束确保测试模块的正确性,继承自 ABP 框架的 AbpIntegratedTest<TStartupModule>,提供完整的依赖注入、数据库事务和测试上下文管理能力。
Section sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cs
架构概述
该测试架构采用分层继承模式,MyPluginNameTestBase 作为根基类提供通用能力,各具体测试基类根据测试层级需求进行扩展。模块依赖关系清晰,通过 DependsOn 特性建立模块间依赖链。
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBaseModule.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameTestEntityFrameworkCoreModule.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestModule.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestModule.cs
详细组件分析
MyPluginNameTestBase 泛型基类分析
MyPluginNameTestBase<TStartupModule> 继承自 AbpIntegratedTest<TStartupModule>,为插件提供完整的集成测试环境。泛型参数 TStartupModule 约束为 IAbpModule,确保测试启动模块的正确性。
SetAbpApplicationCreationOptions 方法
该方法重写基类方法,通过调用 options.UseAutofac() 显式启用 Autofac 依赖注入容器。这是必要的,因为 ABP 框架支持多种 DI 容器,而本项目选择 Autofac 作为默认容器,确保测试环境与运行时环境一致。
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cs
WithUnitOfWorkAsync 事务管理方法
该系列方法封装了工作单元(Unit of Work)模式,确保测试中的数据库操作具有原子性和隔离性。通过 IUnitOfWorkManager 创建事务作用域,在 CompleteAsync() 调用前不会提交更改,测试结束后自动回滚,保证测试数据的纯净。
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cs
Section sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cs
具体测试基类实现
应用层与领域层测试基类
MyPluginNameApplicationTestBase 和 MyPluginNameDomainTestBase 均继承自 MyPluginNameTestBase,并提供 UsingDbContext 辅助方法,简化对数据库上下文的访问。这些基类通过指定不同的启动模块(MyPluginNameApplicationTestModule 和 MyPluginNameDomainTestModule)来适应不同层级的测试需求。
Section sources
test/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestBase.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestBase.cs
数据种子与测试数据
MyPluginNameDataSeedContributor 实现 IDataSeedContributor 接口,在测试初始化时执行数据种子逻辑。MyPluginNameTestData 作为单例服务,可用于存储和共享测试数据状态。
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestData.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameDataSeedContributor.cs
依赖分析
测试模块之间存在明确的依赖层次:
MyPluginNameTestBaseModule是基础模块,依赖 ABP 测试基础和 AutofacMyPluginNameTestEntityFrameworkCoreModule依赖测试基模块和 EF Core 模块MyPluginNameDomainTestModule依赖 EF Core 测试模块MyPluginNameApplicationTestModule依赖应用模块和领域测试模块
Diagram sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBaseModule.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameTestEntityFrameworkCoreModule.cstest/CMS.Plugin.MyPluginName.Domain.Tests/MyPluginNameDomainTestModule.cstest/CMS.Plugin.MyPluginName.Application.Tests/MyPluginNameApplicationTestModule.cs
Section sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBaseModule.cstest/CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests/MyPluginNameTestEntityFrameworkCoreModule.cs
性能考虑
WithUnitOfWorkAsync 方法通过作用域管理资源,避免内存泄漏。使用内存数据库(Sqlite in-memory)进行 EF Core 测试,显著提升测试执行速度。异步编程模型确保 I/O 操作不会阻塞测试线程。
故障排除指南
当测试失败时,应检查:
- 启动模块依赖是否正确配置
- Autofac 容器是否正常初始化
- 工作单元事务是否正确提交
- 数据种子逻辑是否执行成功
Section sources
test/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBaseModule.cstest/CMS.Plugin.MyPluginName.TestBase/MyPluginNameTestBase.cs
结论
MyPluginNameTestBase 继承 ABP 集成测试基类,配置 Autofac 容器,并通过工作单元管理测试事务。各层测试基类分别承接对应模块的测试配置。