Java单元测试 Http Server Mock框架选型

摘要:
根据文章建议过滤出mock服务器、okhttp/mockwebserver和WireMock。Mock服务器使用netty作为httpserver。最大的依赖是荨麻。还有一些其他依赖项,如番石榴、commons-collection4、jackson等。有关详细信息,请参阅mockserver core/5.6.1。与谷歌趋势的流行度比较表明,WireMock更受欢迎,而npmtrends的结果正好相反。模拟服务器在npmtrends上的普及可以说是彻底碾压了WireMock,这可能与模拟服务器对多种语言和丰富部署环境的支持有关。如果您已经运行了许多HttpAPI,并且希望使用Record&Replay简化MockDSL的编写,那么mock服务器和WireMock都可以满足您的需求。
背景动机

某期优化需要针对通用的HttpClient封装组件--HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点:

  • apache http client 版本升级
  • HttpClientBuilder代码重构
  • RequestBuilder代码重构
  • 自定义RetryHandler
  • HttpContext扩展
  • 自定义HttpRequestInterceptor/HttpResponseInterceptor

代码很快修改完了,但是如何保证HttpExecutor的行为和以前是一致的呢?很容易就想到是单元测试。因为以前的代码并未提供组件的单元测试,都是依赖QA同学的黑盒测试完成,现有的单元测试又都是在更上层的HttpDao上,重点是对返回数据的解析逻辑代码验证,直接Mock了HttpExecutor的返回结果,完全无法覆盖底层组件的请求逻辑,因此配合本期优化需要提供HttpExecutor组件的单元测试。

需求分析

先大致分析一下HttpExecutor组件提供的功能:

  • 注册apache http client实例的初始化和销毁,包含ConnectionManager等apache http client子功能组件;
  • 上层入参的转封装,以及HttpResponse结果的初步解析封装(response header、status code、response data);
  • 依赖Interceptor对Http请求进行简单的统计;
  • 指定IO异常时的重试功能;

从功能上来分析,我需要的框架/组件需要满足以下功能:

  1. 响应延时;
  2. 异常模拟;
  3. Response Mock;
  4. request verify(请求验证);
  5. 必须是通过server simulate的方式,而非client stub,即必须真实的发起Http请求;
  6. 足够轻量,不必通过独立进程部署;

作为加分项,最好可以提供以下功能:

  1. Record & Replay(记录真实请求自动生成回放配置,生写代码有点痛苦);
  2. 支持json或yaml等非代码的DSL配置方式;
  3. 和Junit等单元测试框架集成良好;
  4. 支持maven plugin;
  5. 支持版本控制;
选型

从需求分析中必须真实发起请求来看,我的目标就是类似前后端分离开发中常用的API管理平台,这种平台很多,国内的类似小幺鸡YApiRap2Eolinker。但这些平台都必须是作为独立进程部署,而作为单元测试场景,我需要的足够轻量的部署方式。
照例先google、baidu、stackoverflow、github、mvnrepository上转一圈,找到了以下几篇关联性较强的文章(仓库):

微服务下的契约测试(CDC)解读中对契约测试、单元测试、接口测试区别描述中可以发现,契约测试完全能满足甚至超出我的需求,因此下面的框架选型也从契约测试的方向来出发。

根据文章推荐,筛选出mock-serverokhttp/mockwebserverWireMock

Framework部署方式抓取回放请求代理服务模式Https/SSLHttp2故障模拟多语言支持非代码配置生态(其他框架集成)Http LogResponse模板
mock-serverjar包集成/独立war包部署/Maven Plugin/Node.js Module/Grunt Plugin/Docker/Kubernetes/Homebrew 等,详见Running Mock Server支持支持支持支持支持响应延时以及500等错误响应模拟支持多语言client(java、ruby、node)json文件配置-支持支持
okhttp/mockwebserverjar包集成不支持不支持-支持支持模拟慢速网络环境以及500等错误响应模拟支持json文件配置OKHttp不支持不支持
WireMockjar包集成/独立war包部署支持支持支持jre8版本支持支持响应延时以及500等错误响应模拟Node.jsjson文件配置spring-cloud-contract支持支持

功能特性对比

就支持的功能集来看,okhttp/mockwebserver最弱,WireMockmock-server两者支持的特性大体相同,但是mock-server支持更多种语言和更多的部署环境,而WireMock则有Spring Cloud Contract的光环加持。

架构依赖对比

okhttp/mockwebserver本身就是OKHttp的mock组件,完全是原生的实现,除了Junit几乎没有其他依赖,是3个框架里最轻量的,详见mockwebserver/4.2.2

mock-server使用netty作为http server,最大的依赖项就是netty,其他还有一些guava、commons-collection4、jackson等依赖,详见mockserver-core/5.6.1

WireMock使用jetty作为http server,是典型的servlet架构,其他还依赖guava、jackson、httpclient等,详见wiremock-jre8/2.25.0

流行度对比

google trends结果显示WireMock更流行,而npm trends的结果正好相反,npm trends上mock-server的流行度可谓完全碾压WireMock,可能和mock-server对多语言的支持以及丰富的部署环境支持有关。

总结

我们知道框架选型永远都是根据选型人员、代码现状、需求场景来决定的,因此我这里只做推荐,不说结论。

如果你只是需要简单的HTTP Server Simulator辅助业务逻辑测试,无需SSL协议支持,那我推荐你使用okhttp/mockwebserver,功能够用,十分轻量,而且是OKHttp的组件,如果是Android开发那使用正好(Android上OKHttp使用率碾压HttpClient)。

如果你已经有很多Http API在运行,希望使用Record & Replay简化Mock DSL的编写,那么mock-serverWireMock都能满足你。

如果你的测试场景包含UI/UX测试,那支持node.js的mock-server对前端开发更为友好。又或者你的真实server是netty,不想引入servlet架构。

如果你是单纯的Java API测试,并且你还使用了Spring Cloud技术栈,那么WireMockSpring Cloud Contract是很合适的选择。

最后,附上一篇自己实现Mock Server的参考文档Using Sun Java 6 HttpServer to write a functional HTTP test

免责声明:文章转载自《Java单元测试 Http Server Mock框架选型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32 无法通过 %f 打印浮点数用Docker部署自己的JupyterHub下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装RF框架(基于Python)

1、安装Python, 下载地址【https://www.python.org/ftp/python/2.7.13/python-2.7.13.amd64.msi】 系统环境配置上,配置好环境,路径是安装的路径 测试是否安装好,以管理员身份运行cmd,输入python 2、安装pip cmd:get-pip.py  好像不用安装 3、安装CMD执行【p...

读书笔记-单元测试艺术(三)-使用桩对象解除依赖

一、几个概念 1.什么是外部依赖 外部依赖是指在系统中代码与其交互的对象,而且无法对其做人为控制。 最常见的例子是文件系统、线程、内存和时间等,我们使用桩对象来处理外部依赖问题。 2.什么是桩对象 桩对象是对系统中现有依赖的一个替代品,可人为控制。 通过使用桩对象,无需涉及依赖项,即可直接对代码进行测试。 3.什么是重构 重构是指不影响已有功能而改变代码设...

django-rest-framework框架 第二篇 之Mixin扩展类

Mixin扩展类 ['列表操作','过滤','搜索','排序'] <一>:<1>创建项目: 配置 urls 主路由 配置model文件(举个例子,就以book为模型) 当完成这步时 进行数据的 ''迁移'' 然后 '执行' 操作 <2>在views中 导入通用视图类 (只要是用mixin就要导入通用视图类)导入...

9款Android经常使用的高速开发框架

1、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 项目地址:http://www.oschina.net/p/afinal 主要有四大模块: (1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (2) 注解模块:android中的ioc框架,全然注解方式就能够进行...

Spring Boot构建RESTful API与单元测试

首先,回顾并详细说明一下在快速入门中使用的@Controller、@RestController、@RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容。 @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spring4之后加...

自己动手设计并实现一个linux嵌入式UI框架

     一直以来都是使用现成的UI框架,如微软的window、QT等,因为它有各种控件(如button、window、edit等)都已经封装实现好了、我们只要拿来用就是了,也一直认为它很神圣,没有深入了解它背后是如何实现的,近段时间有做这方面的项目,并且由我设计并实现的,说实在的,当时只是想找个简单易用的UI框架,QT、minigui。。。。都被我给否了...