跳到主要内容
版本:Next

测试项目结构

本文档中引用的文件

目录

  1. 引言
  2. 测试项目结构概览
  3. 各测试子项目职责与测试范围
  4. 分层测试隔离与依赖配置
  5. 集成测试与单元测试组织策略
  6. ABP模块依赖构建测试环境
  7. 项目间协作示例
  8. 总结

引言

本文档详细说明基于ABP框架的插件化项目中测试项目的整体结构划分。重点分析Application.TestsDomain.TestsEntityFrameworkCore.TestsTestBase四个测试子项目的职责划分、依赖关系、测试范围及协作机制。通过分析.csproj文件中的项目引用和[DependsOn]模块依赖,揭示分层测试架构的设计原理与实现方式。

测试项目结构概览

测试项目采用分层架构设计,包含四个核心子项目:

  • CMS.Plugin.MyPluginName.Application.Tests:应用层测试项目
  • CMS.Plugin.MyPluginName.Domain.Tests:领域层测试项目
  • CMS.Plugin.MyPluginName.EntityFrameworkCore.Tests:数据访问层测试项目
  • CMS.Plugin.MyPluginName.TestBase:测试基础库项目

这种分层结构实现了测试代码的关注点分离,确保各层测试能够独立运行,同时通过明确的依赖关系支持集成测试场景。

Diagram sources

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

Section sources

集成测试与单元测试组织策略

测试项目采用分层组织策略,区分单元测试和集成测试:

  • 单元测试:在各层内部进行,使用模拟(Mocking)技术隔离外部依赖
  • 集成测试:通过分层依赖实现跨层集成,如应用层测试可集成领域层和数据访问层

测试基类设计体现了这一策略:

  • MyPluginNameTestBase<TStartupModule> 提供ABP集成测试基础
  • 各层测试基类继承自MyPluginNameTestBase,并指定相应的启动模块
  • 通过WithUnitOfWorkAsync方法支持事务性测试

Diagram sources

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

这种依赖链确保了测试环境的正确初始化:

  1. TestBaseModule开始,配置基础服务(DI、工作单元)
  2. TestEntityFrameworkCoreModule配置EF Core和SQLite内存数据库
  3. DomainTestModule集成领域层功能
  4. ApplicationTestModule最终集成应用层服务

Diagram sources

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]特性双重保障,既实现了编译时的依赖管理,又确保了运行时的模块初始化顺序。这种设计支持从单元测试到全栈集成测试的多种测试场景,为插件化系统的质量保障提供了坚实基础。