跳到主要内容

集成测试

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 yudao-cloud 项目的集成测试实践,系统性说明如何基于 Spring Boot Test 构建稳定高效的集成测试体系。内容涵盖:

  • @SpringBootTest 注解与测试配置文件加载机制
  • 自动装配与测试上下文构建策略
  • 业务模块(系统管理、基础设施、设备管理等)的集成测试方法与流程
  • 测试环境配置(application-unit-test.yaml)的参数说明与作用
  • 数据库与 Redis 在集成测试中的真实连接方式及测试数据准备与清理
  • API 接口集成测试示例(HTTP 请求、响应验证、状态码检查)
  • 事务处理、异常处理、并发访问等复杂场景的测试要点
  • 测试覆盖率统计与测试报告生成建议

项目结构

yudao-cloud 将“测试基础能力”抽象到 yudao-spring-boot-starter-test 模块中,通过统一的基类与测试配置,为各业务模块提供一致的集成测试支撑。核心结构如下:

  • 测试基础能力:BaseDbUnitTest、BaseDbAndRedisUnitTest、BaseRedisUnitTest 及其对应的测试配置类
  • 测试配置文件:各模块 test/resources 下的 application-unit-test.yaml
  • 业务模块测试入口:各模块的 ApplicationTests 类

Mermaid Diagram Code:

graph TB
subgraph "测试基础能力"
BDU["BaseDbUnitTest<br/>内存数据库测试"]
BDR["BaseDbAndRedisUnitTest<br/>内存DB+Redis测试"]
BRU["BaseRedisUnitTest<br/>内存Redis测试"]
RTC["RedisTestConfiguration<br/>内嵌Redis启动"]
SITC["SqlInitializationTestConfiguration<br/>SQL初始化"]
end
subgraph "业务模块测试"
SYS["系统模块测试入口"]
INFRA["基础设施模块测试入口"]
BPM["工作流模块测试入口"]
end
BDU --> SITC
BDR --> SITC
BDR --> RTC
BRU --> RTC
SYS --> BDU
INFRA --> BDU
BPM --> BDU

图表来源

章节来源

核心组件

  • 测试基类与自动装配
    • BaseDbUnitTest:提供内存数据库(H2)+ MyBatis Plus 的集成测试上下文,适用于 Service 层与 DAO 层联调
    • BaseDbAndRedisUnitTest:在 BaseDbUnitTest 基础上增加内存 Redis,覆盖缓存相关逻辑
    • BaseRedisUnitTest:仅启用内存 Redis,适合缓存专用场景
  • 测试配置类
    • RedisTestConfiguration:启动内嵌 RedisServer,端口默认由 RedisProperties 提供
    • SqlInitializationTestConfiguration:在延迟加载模式下手动初始化 SQL 脚本,确保测试前数据结构可用
  • 测试配置文件
    • application-unit-test.yaml:各模块 test/resources 下的统一配置,定义 H2 数据源、Redis 连接、MyBatis/Plus 配置等

章节来源

架构总览

下图展示了测试基类与配置类之间的依赖关系,以及它们如何共同构建测试上下文。

Mermaid Diagram Code:

classDiagram
class BaseDbUnitTest {
+@SpringBootTest
+@ActiveProfiles("unit-test")
+@Sql(cleanup)
+Import(DB/MyBatis/... configs)
}
class BaseDbAndRedisUnitTest {
+@SpringBootTest
+@ActiveProfiles("unit-test")
+@Sql(cleanup)
+Import(DB/MyBatis/Redis configs)
}
class BaseRedisUnitTest {
+@SpringBootTest
+@ActiveProfiles("unit-test")
+Import(Redis configs)
}
class RedisTestConfiguration {
+@Bean RedisServer
}
class SqlInitializationTestConfiguration {
+@Bean DataSourceScriptDatabaseInitializer
}
BaseDbAndRedisUnitTest --> RedisTestConfiguration : "使用"
BaseDbAndRedisUnitTest --> SqlInitializationTestConfiguration : "使用"
BaseDbUnitTest --> SqlInitializationTestConfiguration : "使用"
BaseRedisUnitTest --> RedisTestConfiguration : "使用"

图表来源

详细组件分析

测试基类与注解使用

  • @SpringBootTest
    • WebEnvironment.NONE:不启动 Web 容器,聚焦后端服务与数据层
    • classes = Application.class:指定测试上下文的引导配置类
  • @ActiveProfiles("unit-test")
    • 指定加载 test/resources 下的 application-unit-test.yaml
  • @Sql(scripts = ".../clean.sql", AFTER_TEST_METHOD)
    • 每个测试方法结束后执行清理脚本,保证测试隔离

章节来源

测试配置文件 application-unit-test.yaml

  • 数据库(H2 内存)
    • datasource.url:使用 H2 内存数据库,MySQL 模式兼容
    • druid.async-init/initial-size:提升启动速度
    • sql.init.schema-locations:初始化表结构
  • Redis(内存)
    • data.redis.host/port/database:连接本地内嵌 Redis
  • MyBatis/Plus
    • mybatis-plus.global-config.db-config.id-type:主键自增(H2)
    • mybatis-plus.type-aliases-package:实体包扫描路径
  • yudao.info.base-package:模块基础包名,用于扫描与自动装配

章节来源

数据库与 Redis 的真实连接方式

  • 数据库
    • 通过 SqlInitializationTestConfiguration 在延迟加载模式下初始化 SQL
    • 使用 H2 内存数据库,避免外部依赖,提升启动与执行效率
  • Redis
    • 通过 RedisTestConfiguration 启动内嵌 RedisServer,端口来自 RedisProperties
    • 适合缓存读写、分布式锁等场景的集成测试

章节来源

测试数据准备与清理

  • 准备
    • 使用 application-unit-test.yaml 中的 schema-locations 初始化表结构
    • 在具体测试中通过 SQL 或业务 Service 插入所需测试数据
  • 清理
    • 每个测试方法结束后执行 clean.sql,确保无残留数据影响后续测试

章节来源

API 接口集成测试示例(流程)

以下序列图展示了典型的 API 集成测试流程:客户端发起请求 → 控制器接收 → 服务层执行业务 → 数据层持久化/缓存 → 返回响应并断言结果。

Mermaid Diagram Code:

sequenceDiagram
participant T as "测试用例"
participant C as "控制器"
participant S as "服务层"
participant D as "数据层/仓储"
participant R as "Redis缓存"
T->>C : "HTTP 请求如 POST /xxx"
C->>S : "调用业务方法"
S->>D : "查询/插入/更新数据"
D-->>S : "返回数据"
S->>R : "读取/写入缓存可选"
R-->>S : "缓存命中/未命中"
S-->>C : "业务结果"
C-->>T : "HTTP 响应状态码/体"
T->>T : "断言状态码/响应体/缓存一致性"

说明

  • 该图为通用流程示意,具体模块可参考各模块的 ApplicationTests 示例类进行实现与断言。

业务模块集成测试方法

  • 系统管理模块
    • 测试入口类:YudaoModuleSystemBizApplicationTests
    • 建议覆盖:用户/角色/菜单/字典等核心业务的增删改查与权限控制
  • 基础设施模块
    • 测试入口类:YudaoModuleInfraBizApplicationTests
    • 建议覆盖:文件/监控/API 日志等基础设施能力
  • 工作流模块
    • 测试入口类:YudaoModuleBpmBizApplicationTests
    • 建议覆盖:流程发起、审批、候选人计算等核心流程

章节来源

事务处理、异常处理与并发访问

  • 事务处理
    • 使用 @Transactional 或测试中显式开启/回滚事务,确保测试隔离
    • 结合 @Commit/@Rollback 验证提交/回滚行为
  • 异常处理
    • 使用 @Test(expected=...) 或断言抛出特定异常
    • 对业务异常与系统异常分别进行验证
  • 并发访问
    • 使用 @Repeatable 测试或 JMH 压力测试,验证锁策略与幂等性
    • 关注 Redis 分布式锁、数据库唯一约束等并发保护措施

说明

  • 上述为通用实践建议,具体实现需结合业务模块的实际需求与测试基类能力。

测试覆盖率统计与报告生成

  • 覆盖率统计
    • 使用 JaCoCo 插件在 Maven 中配置覆盖率目标与阈值
    • 建议对关键模块(系统、基础设施、工作流)设定最小覆盖率门槛
  • 报告生成
    • 在 CI 中生成 HTML/CSV 报告,按模块维度汇总
    • 结合 SonarQube 或 Coveralls 进行趋势分析与质量门禁

说明

  • 以上为通用建议,具体配置请参考项目现有 Maven 与 CI 工作流。

依赖关系分析

  • 组件耦合
    • BaseDbAndRedisUnitTest 依赖 RedisTestConfiguration 与 SqlInitializationTestConfiguration
    • BaseDbUnitTest 依赖 SqlInitializationTestConfiguration
    • BaseRedisUnitTest 依赖 RedisTestConfiguration
  • 外部依赖
    • H2 内存数据库、Redisson 内嵌 Redis、MyBatis Plus、Druid 连接池
  • 潜在循环依赖
    • 测试配置类之间无直接循环依赖,通过 @Import 组织装配顺序

Mermaid Diagram Code:

graph LR
BDU["BaseDbUnitTest"] --> SITC["SqlInitializationTestConfiguration"]
BDR["BaseDbAndRedisUnitTest"] --> SITC
BDR --> RTC["RedisTestConfiguration"]
BRU["BaseRedisUnitTest"] --> RTC

图表来源

性能考量

  • 启动速度
    • 开启懒加载、异步初始化连接池、最小初始连接数
  • 执行速度
    • 使用 H2 内存数据库与内嵌 Redis,避免网络 IO
    • 合理拆分测试用例,减少重复初始化
  • 资源占用
    • 单测中避免启动 Web 容器(WebEnvironment.NONE)
    • 清理脚本确保测试间无资源泄漏

故障排查指南

  • 内嵌 Redis 端口冲突
    • 现象:启动失败,提示端口占用
    • 处理:确认 RedisProperties.port 配置,必要时调整端口或重启系统
  • SQL 初始化失败
    • 现象:表不存在或初始化脚本未执行
    • 处理:检查 schema-locations 路径与文件存在性,确认延迟加载模式下的初始化配置
  • 测试数据污染
    • 现象:测试间相互影响
    • 处理:确认 clean.sql 是否正确执行,必要时在测试方法中显式清理

章节来源

结论

yudao-cloud 的集成测试体系通过统一的测试基类与配置,实现了数据库与缓存的真实连接、稳定的测试上下文与可维护的测试数据管理。结合各业务模块的测试入口类,可以高效覆盖系统管理、基础设施、工作流等核心业务流程。建议在 CI 中引入覆盖率与报告机制,持续提升测试质量与交付效率。

附录

  • 快速开始
    • 在业务模块中新建测试类,继承 BaseDbUnitTest 或 BaseDbAndRedisUnitTest
    • 在 test/resources 下放置 application-unit-test.yaml 并按需修改
    • 编写测试用例,使用断言验证状态码、响应体与缓存一致性
  • 参考文件
    • 测试基类与配置:见“核心组件”与“章节来源”
    • 业务模块测试入口:见“业务模块集成测试方法”
用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答