跳到主要内容
版本:Next

测试策略

引言

本文档详细介绍了CMS.Plugin.MyPluginName插件的测试体系,重点阐述了单元测试和集成测试的实现方法。文档涵盖了测试基础类的使用、测试上下文的构建、测试数据的准备,以及针对应用服务、领域逻辑和仓储层的具体测试策略。同时,本文还说明了测试中的断言验证、模拟对象使用和事务回滚等关键技术,并介绍了测试覆盖率要求和持续集成中的测试执行策略。

测试基础架构

测试上下文构建

CMS.Plugin.MyPluginName的测试体系基于ABP框架的集成测试能力,通过继承MyPluginNameTestBase<TStartupModule>类来构建测试上下文。该基类继承自AbpIntegratedTest<T>,为测试提供了完整的依赖注入容器和应用初始化环境。

MyPluginNameApplicationTestBaseMyPluginNameDomainTestBase分别用于应用层和领域层的测试,它们都继承自MyPluginNameTestBase<T>,并指定了相应的测试模块作为启动模块。这种分层的测试基类设计使得不同层次的测试可以拥有适当的依赖范围和配置。

测试数据准备

测试数据的准备通过MyPluginNameTestDataMyPluginNameDataSeedContributor两个类来实现。MyPluginNameTestData是一个标记为ISingletonDependency的简单类,用于在依赖注入容器中注册测试数据服务。

MyPluginNameDataSeedContributor实现了IDataSeedContributor接口,负责在测试初始化时播种测试数据。它通过依赖注入获取MyPluginNameTestData实例和IGuidGenerator服务,在SeedAsync方法中执行数据初始化逻辑。测试模块MyPluginNameTestBaseModuleOnApplicationInitialization阶段调用数据播种器,确保每次测试运行前都有一致的初始数据状态。

应用服务测试

应用服务测试通过MyPluginNameApplicationTestBase类进行,该类提供了访问数据库上下文的UsingDbContext方法,允许测试直接操作数据库以验证应用服务的行为。

应用服务测试通常验证以下方面:

  • 输入验证:检查服务是否正确验证输入参数
  • 业务逻辑:验证服务是否正确执行业务规则
  • 数据持久化:通过数据库查询验证数据是否正确保存
  • 异常处理:验证服务在错误条件下是否抛出适当的异常

测试通过依赖注入获取应用服务实例,并调用其方法,然后使用断言验证返回结果。

领域逻辑测试

领域逻辑测试通过MyPluginNameDomainTestBase类进行,专注于验证领域模型和领域服务的业务规则。这类测试通常不涉及应用层的DTO转换和API契约,而是直接测试领域对象的行为。

领域测试的重点包括:

  • 实体行为:验证实体方法是否正确修改状态
  • 领域服务:测试领域服务的业务逻辑
  • 规范模式:验证查询规范是否正确过滤数据
  • 领域事件:检查领域事件是否在适当条件下发布

仓储层测试

仓储层测试通过MyPluginNameEntityFrameworkTestBase类进行,使用SQLite内存数据库来测试EF Core仓储的实现。MyPluginNameTestEntityFrameworkCoreModule配置了使用SQLite的数据库选项,并在测试开始时创建内存数据库和表结构。

仓储测试验证:

  • 查询方法:测试各种查询方法是否返回正确的数据集
  • 分页和排序:验证分页和排序功能是否正常工作
  • 条件过滤:检查查询规范是否正确应用
  • 数据操作:验证插入、更新、删除操作是否成功

事务与回滚机制

测试框架通过MyPluginNameTestBase类中的WithUnitOfWorkAsync方法提供了事务管理支持。该方法创建一个工作单元作用域,在测试代码执行完毕后自动完成事务。

测试中的事务回滚主要通过以下机制实现:

  1. 使用内存数据库:每次测试运行后,内存数据库被销毁,数据自然回滚
  2. 工作单元模式:通过AbpUnitOfWorkOptions配置事务行为,确保测试操作在独立的事务中执行
  3. 依赖注入作用域:每个测试在独立的服务提供者作用域中运行,确保状态隔离

MyPluginNameTestBaseModule中配置了工作单元的默认事务行为为启用状态,确保所有数据库操作都在事务保护下进行。

测试覆盖率与持续集成

测试覆盖率要求包括:

  • 核心业务逻辑:100%覆盖关键业务路径
  • 异常处理:覆盖主要的错误场景和边界条件
  • 输入验证:验证所有输入参数的校验逻辑
  • 数据持久化:确保所有CRUD操作都被测试

在持续集成环境中,测试执行策略包括:

  1. 单元测试:在构建阶段快速执行,验证基本功能
  2. 集成测试:在部署前执行,验证组件间交互
  3. 并行执行:利用内存数据库的优势,多个测试可以并行运行
  4. 覆盖率报告:生成测试覆盖率报告,确保达到质量标准

测试模块的依赖关系确保了正确的初始化顺序:MyPluginNameTestEntityFrameworkCoreModule提供数据访问基础,MyPluginNameDomainTestModule在此基础上添加领域层测试支持,MyPluginNameApplicationTestModule最后添加应用层测试支持。

总结

CMS.Plugin.MyPluginName的测试体系提供了一套完整的测试基础设施,支持从领域层到应用层的全面测试。通过分层的测试基类、内存数据库和自动数据播种,测试既保证了隔离性又提高了执行效率。建议在开发新功能时遵循相同的测试模式,确保代码质量和可维护性。