序言
为什么写这个教程
在多年的开发实践中,我发现一个普遍存在的问题:很多开发者会写业务代码,但不会写测试代码。即使写了测试,也往往是:
- 测试覆盖率为零,或者为了「达标」而凑数
- 测试代码质量低下,维护成本高昂
- 不知道如何测试数据库交互、HTTP 请求、权限控制等常见场景
- 对 TDD(测试驱动开发)有所耳闻,但从未真正实践过
所以本项目的初衷就是打造一门兼具实用性和易学性的测试课程。通过从零开始构建一个仿知乎的问答系统,手把手带你掌握 Spring Boot 应用的测试技能。
项目特色
真实的 TDD 开发流程
本教程严格遵循 TDD 的「红 - 绿 - 重构」循环:
1. 编写一个测试 → 2. 运行测试(失败) → 3. 编写最少代码使测试通过 → 4. 重构代码 → 5. 重复
你将亲身体验「先写测试,后写实现」的完整开发流程,理解 TDD 如何帮助你:
- 更清晰地思考需求
- 设计出更松耦合的代码
- 获得重构的信心(测试保护网)
全面的测试场景覆盖
本项目将以 TDD 为切入口,讲解 Web 应用常见功能的测试,如:
| 测试场景 | 说明 |
|---|---|
| 数据库测试 | 使用 Testcontainers 创建隔离的测试数据库 |
| 测试表单验证 | 验证用户输入的有效性 |
| 测试文件上传 | 处理头像等文件上传场景 |
| 测试邮件发送 | 模拟邮件发送进行账户验证 |
| 测试远程 API 调用 | 测试第三方 API 集成 |
| 测试「异常」抛出 | 验证业务异常的正确处理 |
| 模拟登录用户 | 使用 Spring Security 测试认证和授权 |
多层次的测试策略
涉及了 Web 应用常见的测试层级:
- 单元测试:测试 Service、Policy 等单一组件的逻辑
- 集成测试:测试 Controller 层的完整请求处理流程
- 容器化测试:使用 Testcontainers + Docker 提供干净的测试环境
企业级技术栈
本项目采用主流的企业级技术栈,学完即可用于实际工作:
| 技术 | 说明 | 官网 |
|---|---|---|
| Spring Boot | 应用框架 | spring.io/projects/sp… |
| Spring Security | 认证和授权框架 | spring.io/projects/sp… |
| MyBatis | ORM 框架 | www.mybatis.org/mybatis-3/z… |
| Redis | 缓存中间件 | redis.io/ |
| Kafka | 消息中间件 | kafka.apache.org/ |
| Flyway | 数据库版本控制工具 | github.com/flyway/flyw… |
| JWT | Token 认证支持 | github.com/jwtk/jjwt |
| Testcontainers | 容器化测试工具 | www.testcontainers.org/ |
| JUnit 5 | 测试框架 | junit.org/junit5/ |
| Mockito | Mock 框架 | site.mockito.org/ |
| AssertJ | Fluent 断言库 | assertj.github.io/ |
你将学到什么
完成本教程后,你将能够:
- ✅ 理解 TDD 的核心思想和实践方法
- ✅ 使用 JUnit 5 + Spring Test 编写单元测试和集成测试
- ✅ 使用 Testcontainers 进行数据库和中间件的隔离测试
- ✅ 测试 Spring Security 保护的受认证接口
- ✅ 测试表单验证、异常处理、文件上传等常见场景
- ✅ 使用 Mock 和 Stub 隔离外部依赖
- ✅ 建立测试驱动开发的信心和习惯
开发环境
| 工具 | 版本号 | 说明 |
|---|---|---|
| JDK | 17+ | 推荐使用 LTS 版本 |
| Maven | 3.8+ | 依赖管理和构建工具 |
| MySQL | 8.0 | 通过 Docker 运行 |
| Redis | 最新 | 通过 Docker 运行 |
| Docker | 28+ | 通过 Docker 运行 |
| IntelliJ IDEA | 最新版 | 社区版或正式版均可 |
注:MySQL、Redis 等中间件均使用 Docker 运行,无需在本地安装