Java单元测试 Http Server Mock框架选型
背景动机
某期优化需要针对通用的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异常时的重试功能;
从功能上来分析,我需要的框架/组件需要满足以下功能:
- 响应延时;
- 异常模拟;
- Response Mock;
- request verify(请求验证);
- 必须是通过server simulate的方式,而非client stub,即必须真实的发起Http请求;
- 足够轻量,不必通过独立进程部署;
作为加分项,最好可以提供以下功能:
- Record & Replay(记录真实请求自动生成回放配置,生写代码有点痛苦);
- 支持json或yaml等非代码的DSL配置方式;
- 和Junit等单元测试框架集成良好;
- 支持maven plugin;
- 支持版本控制;
选型
从需求分析中必须真实发起请求来看,我的目标就是类似前后端分离开发中常用的API管理平台,这种平台很多,国内的类似小幺鸡、YApi、Rap2、Eolinker。但这些平台都必须是作为独立进程部署,而作为单元测试场景,我需要的足够轻量的部署方式。
照例先google、baidu、stackoverflow、github、mvnrepository上转一圈,找到了以下几篇关联性较强的文章(仓库):
- Introduction to MockServer
- Introduction to WireMock
- okhttp/mockwebserver
- Leveling Up Your UI Tests With MockWebServer
- How to mock a web server for unit testing in Java?
- API integration and mocking.Most popular frameworks
- Comparison of API simulation tools
- Compare WireMock and MockServer's popularity and activity
- npm trends:mock-api-server vs mockserver vs mockserver-node vs wiremock-js vs wiremock-standalone
- 微服务下的契约测试(CDC)解读
- Spring Cloud Contract
从微服务下的契约测试(CDC)解读中对契约测试、单元测试、接口测试区别描述中可以发现,契约测试完全能满足甚至超出我的需求,因此下面的框架选型也从契约测试的方向来出发。
根据文章推荐,筛选出mock-server、okhttp/mockwebserver、WireMock。
| Framework | 部署方式 | 抓取回放请求 | 代理服务模式 | Https/SSL | Http2 | 故障模拟 | 多语言支持 | 非代码配置 | 生态(其他框架集成) | Http Log | Response模板 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| mock-server | jar包集成/独立war包部署/Maven Plugin/Node.js Module/Grunt Plugin/Docker/Kubernetes/Homebrew 等,详见Running Mock Server | 支持 | 支持 | 支持 | 支持 | 支持响应延时以及500等错误响应模拟 | 支持多语言client(java、ruby、node) | json文件配置 | - | 支持 | 支持 |
| okhttp/mockwebserver | jar包集成 | 不支持 | 不支持 | - | 支持 | 支持模拟慢速网络环境以及500等错误响应模拟 | 支持 | json文件配置 | OKHttp | 不支持 | 不支持 |
| WireMock | jar包集成/独立war包部署 | 支持 | 支持 | 支持 | jre8版本支持 | 支持响应延时以及500等错误响应模拟 | Node.js | json文件配置 | spring-cloud-contract | 支持 | 支持 |
功能特性对比
就支持的功能集来看,okhttp/mockwebserver最弱,WireMock和mock-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-server和WireMock都能满足你。
如果你的测试场景包含UI/UX测试,那支持node.js的mock-server对前端开发更为友好。又或者你的真实server是netty,不想引入servlet架构。
如果你是单纯的Java API测试,并且你还使用了Spring Cloud技术栈,那么WireMock和Spring Cloud Contract是很合适的选择。
最后,附上一篇自己实现Mock Server的参考文档Using Sun Java 6 HttpServer to write a functional HTTP test 。
Java单元测试 Http Server Mock框架选型的更多相关文章
- 原!!关于java 单元测试Junit4和Mock的一些总结
最近项目有在写java代码的单元测试,然后在思考一个问题,为什么要写单元测试??单元测试写了有什么用??百度了一圈,如下: 软件质量最简单.最有效的保证: 是目标代码最清晰.最有效的文档: 可以优化目 ...
- 【转】Java学习---10个测试框架介绍
[原文]https://www.toutiao.com/i6594302925458113027/ JAVA 程序员需要用到 10 个测试框架和库 Java 程序员需要用到十大单元测试和自动化集成测试 ...
- atititt.java定时任务框架选型Spring Quartz 注解总结
atititt.java定时任务框架选型Spring Quartz 总结 1. .Spring Quartz (ati recomm) 1 2. Spring Quartz具体配置 2 2.1. 增 ...
- Java单元测试(Junit+Mock+代码覆盖率)
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Java单元测试框架 JUnit
Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一 ...
- 单元测试mock框架——jmockit实战
JMockit是google code上面的一个java单元测试mock项目,她很方便地让你对单元测试中的final类,静态方法,构造方法进行mock,功能强大.项目地址在:http://jmocki ...
- 有效使用Mock编写java单元测试
Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...
- Java单元测试(Junit+Mock+代码覆盖率)---------转
Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测 ...
- atitit. groupby linq的实现(1)-----linq框架选型 java .net php
atitit. groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api , ...
随机推荐
- ffmpeg结合SDL编写播放器(一)
ffmpeg 工具是一个高效快速的命令行工具,进行视音频不同格式之间的转换. ffmpeg命令行 ffmpeg可以读取任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,由 -i ...
- python requests 保存图片
html = requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec ...
- 第08组 Alpha冲刺(3/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11872693.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- 冰多多团队-第三次Scrum会议
冰多多团队-第三次Scrum会议 会议基本情况 会议时间:4月9日 21:30 - 21:45 会议地点:新主楼F座2楼沙发休息处 工作情况 团队成员 已完成任务 待完成任务 zpj 接入Action ...
- OO助教的退休感想
深夜失眠+刚赶完火车的胡言乱语,切莫当真,择日修改 一年前,我在学姐的怂恿鼓励下,加上了吴老师的微信,表达了想担任下学期的OO助教的想法.三天后,我到新主楼参加OO助教的面试,其实还是蛮紧张的,毕竟自 ...
- asp.netCore3.0 中使用app.UseMvc() 配置路由
一.新配置路由策略 在 Asp.Net Core 3.0中默认不再支持app.UserMvc() 方式配置路由 系统. 而是使用新的模式,点击查看asp.netCore3.0区域和路由配置变化 默认 ...
- 【转】Android root检测方法总结
一 为什么要进行root检测?出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root,以提示用户若继续使用会存在风险. 二 root了会有什么风险?在Linux ...
- sql server数据库备份单个表的结构和数据生成脚本【转】
1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...
- 微信小程序支付接口之Django后台
本文链接:https://blog.csdn.net/qq_41860162/article/details/89098694Python3-django-微信小程序支付接口调用工具类生成一系列微信官 ...
- Vscode 修改主题颜色
首先向大家演示如何使用VSCode自带的颜色主题:依次点击左上角的文件-首选项-颜色主题,出现如下的主题选取界面.