测试项目结构
本文档中引用的文件
- CMS.Plugin.MyPluginName.Application.Tests.csproj
- CMS.Plugin.MyPluginName.Domain.Tests.csproj
- CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests.csproj
- CMS.Plugin.MyPluginName.TestBase.csproj
- MyPluginNameApplicationTestModule.cs
- MyPluginNameDomainTestModule.cs
- MyPluginNameTestEntityFrameworkCoreModule.cs
- MyPluginNameTestBaseModule.cs
- MyPluginNameApplicationTestBase.cs
- MyPluginNameDomainTestBase.cs
- MyPluginNameEntityFrameworkTestBase.cs
- MyPluginNameTestBase.cs
- CMSPluginApplicationModule.cs
- CMSPluginDomainModule.cs
- CMSPluginEntityFrameworkCoreModule.cs
目录
引言
本文档详细说明基于ABP框 架的插件化项目中测试项目的整体结构划分。重点分析Application.Tests、Domain.Tests、EntityFrameworkCore.Tests和TestBase四个测试子项目的职责划分、依赖关系、测试范围及协作机制。通过分析.csproj文件中的项目引用和[DependsOn]模块依赖,揭示分层测试架构的设计原理与实现方式。
测试项目结构概览
测试项目采用分层架构设计,包含四个核心子项目:
CMS.Plugin.MyPluginName.Application.Tests:应用层测试项目CMS.Plugin.MyPluginName.Domain.Tests:领域层测试项目CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests:数据访问层测试项目CMS.Plugin.MyPluginName.TestBase:测试基础库项目
这种分层结构实现了测试代码的关注点分离,确保各层测试能够独立运行,同时通过明确的依赖关系支持集成测试场景。
Diagram sources
- CMS.Plugin.MyPluginName.Application.Tests.csproj
- CMS.Plugin.MyPluginName.Domain.Tests.csproj
- CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests.csproj
- CMS.Plugin.MyPluginName.TestBase.csproj
Section sources
各测试子项目职责与测试范围
Application.Tests
Application.Tests项目负责测试应用服务层(Application Layer)的功能,包括应用服务类、DTO转换、权限验证等。其测试范围涵盖应用服务的业务逻辑正确性、输入验证、异常处理等。
Section sources
Domain.Tests
Domain.Tests项目专注于领域层(Domain Layer)的测试,包括实体、值对象、领域服务、仓储接口等。其测试范围主要为领域模型的业务规则、不变性约束、领域事件等核心领域逻辑。
Section sources
EntityFrameworkCore.Tests
EntityFrameworkCore.Tests项目负责数据访问层的集成测试,验证实体映射、数据库查询、事务处理等EF Core相关功能。它使用SQLite内存数据库进行测试,确保数据库操作的正确性。
Section sources
TestBase
TestBase项目是测试基础库,为其他测试项目提供通用的测试基类、 服务配置、数据种子等功能。它封装了ABP集成测试的基础设施,包括依赖注入、工作单元、内存数据库初始化等。
Section sources
分层测试隔离与依赖配置
测试项目的依赖关系通过.csproj文件中的ProjectReference进行配置,实现了自上而下的分层依赖:
<!-- Application.Tests 依赖 Domain.Tests -->
<ProjectReference Include="..\CMS.Plugin.MyPluginName.Domain.Tests\CMS.Plugin.MyPluginName.Domain.Tests.csproj" />
<!-- Domain.Tests 依赖 EntityFrameworkCore.Tests -->
<ProjectReference Include="..\CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests\CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests.csproj" />
<!-- EntityFrameworkCore.Tests 依赖 TestBase -->
<ProjectReference Include="..\CMS.Plugin.MyPluginName.TestBase\CMS.Plugin.MyPluginName.TestBase.csproj" />
这种依赖配置实现了测试隔离:
- 应用层测试可以依赖领域层测试模块,进行跨层集成测试
- 领域层测试依赖数据访问层测试,确保领域逻辑与数据持久化的一致性
- 数据访问层测试依赖测试基础库,获得统一的测试基础设施
Diagram sources
- CMS.Plugin.MyPluginName.Application.Tests.csproj
- CMS.Plugin.MyPluginName.Domain.Tests.csproj
- CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests.csproj
- CMS.Plugin.MyPluginName.TestBase.csproj
Section sources
集成测试与单元测试组织策略
测试项目采用分层组织策略,区分单元测试和集成测试:
- 单元测试:在各层内部进行,使用模拟(Mocking)技术隔离外部依赖
- 集成测试:通过分层依赖实现跨层集成,如应用层测试可集成领域层和数据访问层
测试基类设计体现了这一策略:
MyPluginNameTestBase<TStartupModule>提供ABP集成测试基础- 各层测试基类继承自
MyPluginNameTestBase,并指定相应的启动模块 - 通过
WithUnitOfWorkAsync方法支持事务性测试
Diagram sources
- MyPluginNameTestBase.cs
- MyPluginNameApplicationTestBase.cs
- MyPluginNameDomainTestBase.cs
- MyPluginNameEntityFrameworkTestBase.cs
Section sources
ABP模块依赖构建测试环境
ABP框架的模块化系统通过[DependsOn]特性构建测试环境,形成模块依赖链:
// TestBase 模块依赖
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpTestBaseModule),
typeof(CMSPluginDomainModule))]
public class MyPluginNameTestBaseModule : AbpModule
// EF Core 测试模块依赖
[DependsOn(
typeof(MyPluginNameTestBaseModule),
typeof(CMSPluginEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreSqliteModule))]
public class MyPluginNameTestEntityFrameworkCoreModule : AbpModule
// 领域测试模块依赖
[DependsOn(typeof(MyPluginNameTestEntityFrameworkCoreModule))]
public class MyPluginNameDomainTestModule : AbpModule
// 应用测试模块依赖
[DependsOn(
typeof(CMSPluginApplicationModule),
typeof(MyPluginNameDomainTestModule))]
public class MyPluginNameApplicationTestModule : AbpModule
这种依赖链确保了测试环境的正确初始化:
- 从
TestBaseModule开始,配置基础服务(DI、工作单元) TestEntityFrameworkCoreModule配置EF Core和SQLite内存数据库DomainTestModule集成领域层功能ApplicationTestModule最终集成应用层服务
Diagram sources
- MyPluginNameTestBaseModule.cs
- MyPluginNameTestEntityFrameworkCoreModule.cs
- MyPluginNameDomainTestModule.cs
- MyPluginNameApplicationTestModule.cs
Section sources
项目间协作示例
测试项目间的协作通过分层依赖和模块继承实现。以应用层测试为例,它依赖领域层测试模块,从而可以进行跨层集成测试:
// ApplicationTestModule 依 赖 DomainTestModule
[DependsOn(
typeof(CMSPluginApplicationModule),
typeof(MyPluginNameDomainTestModule))] // 直接依赖领域测试模块
public class MyPluginNameApplicationTestModule : AbpModule
这种设计允许应用服务测试直接使用领域层的完整实现,包括:
- 领域实体和业务规则验证
- 仓储实现与数据库交互
- 领域事件发布与处理
同时,通过MyPluginNameApplicationTestBase继承MyPluginNameTestBase<MyPluginNameApplicationTestModule>,获得了完整的测试基础设施,包括:
- 依赖注入容器
- 工作单元管理
- 内存数据库访问
- 数据种子服务
Diagram sources
Section sources
总结
本测试架构通过四个测试子项目的分层设计,实现了清晰的关注点分离和有效的测试隔离。TestBase作为基础层提供通用测试设施,EntityFrameworkCore.Tests提供数据访问测试能力,Domain.Tests专注于领域逻辑验证,Application.Tests则负责应用服务的集成测试。
依赖关系通过.csproj文件的项目引用和ABP模块的[DependsOn]特性双重保障,既实现了编译时的依赖管理,又确保了运行时的模块初始化顺序。这种设计支持从单元测试到全栈集成测试的多种测试场景,为插件化系统的质量保障提供了坚实基础。