如何在Spring Boot中使用TDD写出高质量的接口

本文通过一个实例展示了如何在Spring Boot中使用TDD开发接口,包括接口文档、测试策略、集成测试与单元测试。首先,定义了发布帖子的接口,然后按照TDD流程编写集成测试和单元测试,确保功能的正确性和代码质量。通过TDD,不仅提高了代码覆盖率,还促进了代码的整洁和开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何在Spring Boot中使用TDD写出高质量的接口

之前在《如何说服你的同事使用TDD》中介绍了为什么要使用TDD(测试驱动开发),以及如何使用TDD写代码。文章发表后,有同学在评论区中表示文章写得不错,但是举得例子太过脱离实际了,能不能举一个在实际工作中的例子呀。这篇文章,就来分享一下在Spring Boot中,如何使用TDD写出功能健壮代码整洁高质量接口

我将用一个简单的案例,向你展示:

  • 什么是“接口文档->测试用例->产品代码”的TDD开发流程
  • 在Spring Boot中,怎样同时使用集成测试和单元测试,保证测试的覆盖面
  • 使用Spring Boot测试框架的一些优秀实践
  • 为什么要使用TDD

接口文档

我们要实现的接口,功能非常简单,就是能够对敏感字眼进行检查的发帖功能,不允许发带有“shit”、“fxxk”之类字眼的帖子,嗯,我们是一个文明的社区!

接口文档如下:

接口说明
发布帖子,同时对敏感字眼进行校验

URL 
/v2.0/posts

HTTP请求方式
POST

请求体
参数: content(帖子的内容,String)

响应
200 创建成功,返回成功创建的帖子信息
400 创建失败,帖子中包含敏感字眼

示例1
请求体

{
    "content": "hello world!"
} 

响应
200

{
    "id": 1,
    "content": "hello world!",
    "username": "sexy code",
    "createDate": 1515312619351
} 

示例2
请求体

{
    "content": "hello shit!"
} 

响应

{
    "errorCode": 100001,
    "errorInfo": "post contains sensitive info"
} 

测试策略

如果不采用TDD,那么下一步就是拿着接口文档开发接口了,但是这很不TDD。TDD要求我们先写测试用例。

你或许会认为不写测试用例,同样可以写出实现功能的接口。别急,测试用例带给你的好处远远不止正确性。

看完上面那份接口文档,我们很自然的想到有下面两个测试用例:

  1. 发布内容合规的帖子,成功发布,返回200和对应的数据
  2. 发布含有敏感字眼的帖子,发布失败,返回400和错误提示

上面这两个测试用例,都是从模拟客户端请求,到后台业务层和数据库层操作,再到返回响应的端到端测试,因此属于集成测试
集成测试要求我们启动Spring Boot的容器,因此运行起来会比较慢。通常情况下,集成测试只覆盖基本场景,更细致的测试,可以交给单元测试
比如在这个场景中,我们可以针对判断内容中是否含有敏感信息的这个功能,进行单元测试,这也就要求我们把这个功能,抽取成一个方法,这样才方便我们写测试用例。由于单元测试不需要启用Spring Boot容器,因此测试用例运行起来将非常迅速。

TDD在不知不觉中提高了我们的代码质量。它让我们从测试用例的角度出发,思考如何写出方便测试的代码,方便测试的代码,往往是符合单一职责的。

集成测试

制定好测试策略之后,下面开始写第一个测试用例。

一个测试用例通常包括以下三个步骤:

  1. 创建环境,初始化数据
  2. 执行操作
  3. 验证操作结果

对于我们这个发帖的接口,那就是:

  1. 创建Spring Boot容器
  2. 向发帖的接口,发送Post请求
  3. 根据返回的帖子id,去数据库查询,看查到的数据,是不是和发送的数据一致

使用Spring Boot提供的测试框架,可以很轻松的将上面这个过程写成代码(本文的所有代码,可到Github下载,欢迎加星):

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class PostControllerV2ITTest {

    public static final String POST_CONTENT_VALID = "post content test";
    public static final String POST_URL = "/v2.0/posts";

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值