跳到主要内容

测试指南

目录

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

简介

本测试指南面向 yudao-cloud 项目的开发者与测试工程师,系统性阐述单元测试、集成测试、API 测试、性能与压力测试、测试数据准备、测试环境搭建以及在持续集成中执行测试的完整流程。文档基于仓库现有测试基础设施与配置,结合 JUnit 5、Mockito(通过测试基类与工具类体现)、Spring Boot Test、内存数据库与 Redis、SQL 初始化、随机数据生成等能力,帮助团队建立高质量、可维护的测试体系。

项目结构

yudao-cloud 采用多模块聚合工程,测试相关能力集中在 yudao-framework/yudao-spring-boot-starter-test 模块,提供通用的测试基类与配置,覆盖内存数据库与 Redis 的单元测试基座,并在各业务模块中以 application-unit-test.yaml 提供测试环境配置。

Mermaid Diagram Code:

graph TB
A["根工程<br/>pom.xml"] --> B["yudao-framework<br/>框架模块"]
B --> C["yudao-spring-boot-starter-test<br/>测试基座"]
C --> C1["BaseDbUnitTest.java"]
C --> C2["BaseDbAndRedisUnitTest.java"]
C --> C3["RedisTestConfiguration.java"]
C --> C4["SqlInitializationTestConfiguration.java"]
A --> D["yudao-module-system<br/>业务模块"]
D --> D1["application-unit-test.yaml"]
A --> E["yudao-module-infra<br/>业务模块"]
E --> E1["application-unit-test.yaml"]
A --> F["yudao-module-bpm<br/>业务模块"]
F --> F1["application-unit-test.yaml"]

图表来源

章节来源

核心组件

  • 测试基类与注解
    • BaseDbUnitTest:基于内存数据库的单元测试基类,导入数据库与 MyBatis 配置,激活 unit-test 环境,测试后自动清理。
    • BaseDbAndRedisUnitTest:在 BaseDbUnitTest 基础上增加内存 Redis 支持,适合涉及缓存交互的测试。
  • 测试配置
    • RedisTestConfiguration:启动内嵌 RedisServer,便于无外部 Redis 的本地测试。
    • SqlInitializationTestConfiguration:在延迟初始化场景下仍能正确执行 SQL 初始化。
  • 测试工具
    • RandomUtils:提供随机字符串、ID、日期、枚举状态、手机号、邮箱、URL 以及基于 Podam 的 POJO 随机构造,简化测试数据准备。
  • 示例测试
    • EncryptionTests:展示如何使用 JUnit 5 编写加密/签名相关功能的测试用例。

章节来源

架构总览

下图展示了测试执行的关键路径:测试类继承测试基类 → 启动内存数据库与 Redis(如需)→ 执行 SQL 初始化 → 运行测试 → 清理数据。

Mermaid Diagram Code:

sequenceDiagram
participant UT as "测试类"
participant BD as "BaseDbUnitTest"
participant RDS as "RedisTestConfiguration"
participant SIC as "SqlInitializationTestConfiguration"
participant DB as "内存数据库"
participant RC as "RedisServer"
UT->>BD : 继承并标注@SpringBootTest
BD->>SIC : 导入 SQL 初始化配置
BD->>DB : 启动内存数据库
BD->>RDS : 导入 Redis 配置如使用
RDS->>RC : 启动内嵌 Redis
UT->>DB : 执行业务 SQL如需
UT->>RC : 执行缓存操作如使用
UT->>UT : 断言与验证
UT->>DB : 测试后清理after

图表来源

详细组件分析

单元测试基类与注解使用

  • BaseDbUnitTest
    • 作用:提供仅数据库的单元测试环境,适合 Service/Mapper 层测试。
    • 关键点:@ActiveProfiles("unit-test")、@Sql 清理、导入数据库与 MyBatis 配置。
  • BaseDbAndRedisUnitTest
    • 作用:在数据库基础上增加内存 Redis,适合涉及缓存的场景。
    • 关键点:导入 Redis 配置类与自动装配。

Mermaid Diagram Code:

classDiagram
class BaseDbUnitTest {
+注解@SpringBootTest
+注解@ActiveProfiles("unit-test")
+注解@Sql(清理)
+导入数据库/MyBatis配置
}
class BaseDbAndRedisUnitTest {
+继承BaseDbUnitTest
+导入Redis配置
}
BaseDbAndRedisUnitTest --|> BaseDbUnitTest

图表来源

章节来源

测试配置与环境

  • application-unit-test.yaml
    • 各业务模块的测试环境配置文件,用于切换到 unit-test 环境,加载内存数据库与 Redis。
  • datasource.yaml
    • 生产/开发环境的数据源配置,测试阶段通常由内存数据库替代。

章节来源

测试工具:随机数据生成

  • RandomUtils
    • 功能:随机字符串、ID、日期、布尔、集合、POJO 等,支持自定义消费者回调。
    • 价值:大幅减少测试数据准备成本,提高用例可读性与可维护性。

Mermaid Diagram Code:

flowchart TD
Start(["进入随机数据生成"]) --> Choose["选择数据类型"]
Choose --> Str["字符串/邮箱/手机号/URL"]
Choose --> Num["整数/长整型/短整型"]
Choose --> Time["日期/时间"]
Choose --> Enum["通用状态枚举"]
Choose --> Pojo["POJO 对象Podam"]
Str --> Done(["返回结果"])
Num --> Done
Time --> Done
Enum --> Done
Pojo --> Done

图表来源

章节来源

示例:加密/签名测试(JUnit 5)

  • EncryptionTests
    • 展示如何使用 @Test 编写签名、验签、加解密等测试用例。
    • 建议:对边界条件(超时、错误密钥、非法输入)分别编写用例,确保健壮性。

章节来源

集成测试策略

  • Spring Boot Test 注解
    • @SpringBootTest:加载应用上下文,WebEnvironment 可选 NONE 或 MOCK。
    • @ActiveProfiles("unit-test"):切换到测试环境配置。
    • @Sql:在测试前后执行 SQL(如清理)。
  • 测试数据库与事务
    • 内存数据库:通过导入数据库自动配置与 SQL 初始化配置,实现快速、隔离的测试。
    • 事务回滚:可在测试方法上使用 @Transactional 并在测试后回滚,保证数据一致性。
  • Redis 集成
    • 通过 RedisTestConfiguration 启动内嵌 Redis,满足缓存相关集成测试需求。

章节来源

API 测试指南(概念性)

  • REST Assured 使用建议
    • 选择:在需要真实 HTTP 层验证的场景引入 REST Assured。
    • 场景:接口幂等性、鉴权、分页、排序、错误码、响应格式校验。
    • 建议:将公共断言封装为工具方法,统一响应体结构校验。
  • 接口测试用例设计
    • 正常用例:正常参数、边界值、典型业务流程。
    • 异常用例:缺失参数、非法参数、权限不足、服务异常、网络抖动。
  • 响应验证
    • 状态码、响应头、JSON Schema 校验、字段存在性与类型检查。

(本节为概念性指导,不直接分析具体源码)

性能测试与压力测试(概念性)

  • JMeter 使用场景
    • 并发用户数、吞吐量、响应时间分布、错误率。
    • 关联参数提取、定时器、断言、聚合报告。
  • 压测执行
    • 选择稳定环境,预热、正式压测、逐步加压、观察指标。
  • 结果分析
    • 关注 P95/P99 延迟、错误率、资源瓶颈(CPU、内存、数据库连接池)。

(本节为概念性指导,不直接分析具体源码)

依赖分析

  • 测试插件与工具
    • maven-surefire-plugin:运行 JUnit 5 测试。
    • Lombok + MapStruct:编译期注解处理器配置。
  • 测试基座依赖
    • 数据库:Druid、MyBatis Plus、MyBatis Plus Join。
    • Redis:Redisson 自动配置、内嵌 Redis。
    • SQL 初始化:Spring SQL 初始化适配延迟加载场景。

Mermaid Diagram Code:

graph TB
P["pom.xml"] --> M1["maven-surefire-plugin"]
P --> M2["maven-compiler-plugin"]
P --> F["yudao-spring-boot-starter-test"]
F --> D1["DruidDataSourceAutoConfigure"]
F --> D2["MybatisPlusAutoConfiguration"]
F --> D3["MybatisPlusJoinAutoConfiguration"]
F --> R1["RedissonAutoConfiguration"]
F --> S1["SqlInitializationTestConfiguration"]

图表来源

章节来源

性能考虑

  • 测试执行效率
    • 使用内存数据库与内嵌 Redis,避免外部依赖带来的启动与网络开销。
    • 通过 @Sql 清理数据,避免跨用例污染。
  • 资源占用
    • 内嵌 Redis 端口冲突处理已在配置中考虑,建议在 CI 中固定端口或禁用持久化。
  • 并发与隔离
    • 单测并发执行时注意共享资源(端口、临时文件)的隔离。

(本节为通用建议,不直接分析具体源码)

故障排查指南

  • 测试无法启动或找不到配置
    • 检查 application-unit-test.yaml 是否位于 test/resources。
    • 确认 @ActiveProfiles("unit-test") 与配置文件一致。
  • Redis 端口占用
    • 内嵌 Redis 启动失败时,检查端口占用或容器重启策略。
  • SQL 初始化失败
    • 确认 SQL 路径与文件存在,检查延迟初始化场景下的初始化顺序。
  • 数据库连接异常
    • 核对 datasource.yaml 中的驱动与 URL,确认网络可达性。

章节来源

结论

yudao-cloud 的测试体系以 yudao-spring-boot-starter-test 为核心,提供了内存数据库与 Redis 的一体化测试基座,配合随机数据生成与 SQL 初始化,能够高效、稳定地支撑单元与集成测试。建议团队在编写测试时遵循“清晰断言、隔离数据、复用工具”的原则,并在持续集成中统一执行测试,保障质量门槛。

附录

测试覆盖率与工具(概念性)

  • JaCoCo
    • 在 Maven 中配置插件,生成覆盖率报告,建议设置阈值(如行覆盖率、分支覆盖率)。
  • SonarQube
    • 集成覆盖率与代码质量扫描,结合分支保护策略,确保主干质量。

(本节为概念性指导,不直接分析具体源码)

测试数据准备最佳实践

  • 优先使用 RandomUtils 生成随机但合理的测试数据。
  • 对于复杂对象,先构造最小可用数据,再通过消费者回调补充差异字段。
  • 对于外部依赖(如第三方支付),使用桩或假实现,避免真实调用。

章节来源

测试环境搭建与 CI 执行

  • 本地
    • 使用 application-unit-test.yaml,确保内存数据库与 Redis 可用。
  • CI
    • 使用 GitHub Actions 等流水线,按矩阵 JDK 版本构建,执行测试。
    • 建议将覆盖率与静态分析纳入流水线步骤。

章节来源

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答