Spring Controller层测试 – 01 概述

Spring Controller层(Web层或API层)的测试有多种方案。有人倾向于使用纯单元测试,有人则倾向于使用集成测试。

单元测试和集成测试

先来看一下单元测试和集成测试的概念。

单元测试

单元测试是对软件中的最小可验证单元进行检查和验证。比如对Java中的类和方法的测试。

测试原则:

  • 尽可能保证测试用例相互独立(测试用例中不能直接调用其他类的方法,而应在测试用例中重写模拟方法);
  • 此阶段一般由软件的开发人员来实施,用以检验所开发的代码功能是否符合自己的设计要求

单元测试的作用:

  • 可以尽早的发现缺陷;
  • 利于重构;
  • 简化集成;
  • 辅助文档;
  • 辅助设计。

单元测试的不足:

  • 每个测试单元至少需要3~5行代码,存在投入与产出的平衡。

集成测试

集成测试是根据集成测试计划,一边将模块或其他软件单位组合成越来越大的系统,一边运行该系统,以分析所组成的系统是否正确,各组成部分是否合拍。集成测试的策略主要有自顶向下和自底向上两种。

集成测试的作用:

  • 目的是覆盖更多的执行路径;
  • 发现单元之间接口的错误;
  • 发现集成后的软件同软件需求不一致的地方。

不足在于:

  • 关注的粒度较大,控制起来比较困难

比较来说单元测试更加重视过程,而集成测试更加重视结果。

Spring提供的Controller层测试方案

我们可以在不运行web server的情况下直接对Controller的逻辑进行测试。要执行这种测试,就需要mock服务器的行为,因此也有可能在测试中漏掉一些内容。不过无需担心,我们可以在集成测试中覆盖可能会漏掉的那部分内容。

当然也可以启动一个WebServer来执行Controller层的测试。这样就可以加载整个应用的Context,因此这种方案也可以被视为一种较重的方案。

在这里介绍三种Spring Controller层的测试方案:

  • 在standalone模式下使用MockMVC方式;
  • 结合SpringRunner使用MockMVC方式;
  • 结合SpringBootTest和RestTemplate进行测试。

通常在执行单元测试的时候使用MockMVC方案,在进行集成测试的时候则建议使用RestTemplate方案。原因是使用MockMVC方式可以对Controller进行细粒度的断言,而RestTemplate则是能够使用Spring的WebApplicationContext(部分或全部)。

示例程序

为了便于说明,写了一个简单的SpringBoot Application来进行演示。

在应用中有如下几个类:

  • WorkerController:WEB接口类;
  • WorkerControllerAdvisor:Controller异常统一处理类,这里捕获了NonExistException并修改返回的status为404;
  • WorkerFilter:过滤器类,在response中添加了header值 X-CHOBIT-APP=chobit-header
  • IWorkerService:服务接口类;
  • WorkerServiceImpl:服务实现类,模拟了数据库操作。

示例代码可在CSDN下载,地址:https://download.csdn.net/download/tianxiexingyun/11065824

接下来分几篇文章来介绍几种测试方案。


发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据