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
接下来分几篇文章来介绍几种测试方案。
发表评论