之前写了一篇介绍 HttpClient 的两种重试机制 的文章, 但是否真的会按照预期进行重试我们不得而知。

别人提供给我们的 API 往往都是正常的,很多错误并不能稳定重现,这也造成了我们无法进行全面的测试。正是这种情况下,了解到了 WireMock。

本文不打算做一个入门教程,重点在于如何用 WireMock 解决实际的问题。WireMock 官网的文档很不错,想要深入了解的可以去阅读一下。

初始化调用端

首先初始化一个HttpClient

public ZwroksApi(){RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(1000).build();DefaultServiceUnavailableRetryStrategy serviceUnavailableRetryStrategy = new DefaultServiceUnavailableRetryStrategy();httpClient = HttpClients.custom().setServiceUnavailableRetryStrategy(serviceUnavailableRetryStrategy).setDefaultRequestConfig(requestConfig).build();
}

进行了如下配置

  1. 异常重试默认开启,重试3次。
  2. 使用了默认的服务不可用重试策略,会重试1次,间隔1秒。
  3. 设置 SocketTimeout 为1秒,用于模拟超时。

异常重试

超时

首先来模拟一下超时,设置了固定的 delay 2秒,所以一定会超时,按照预期会重试3次,所以一共是请求4次。

@Test
public void testSocketTimeOut() {stubFor(get(urlEqualTo("/test")).willReturn(aResponse().withStatus(HttpStatus.SC_OK).withHeader("Content-Type", "text/xml").withBody("ok").withFixedDelay(2000)));zwroksApi.test();verify(4, getRequestedFor(urlEqualTo("/test")));
}

但是结果呢

Expected exactly 4 requests matching the following pattern but received 1

具体的原因在之前那篇文章也已经提过,SocketTimeoutExceptionInterruptedIOException 的子类,不会重试。

如何超时也进行重试,在上一篇中也有讲,这里就不赘述了。

错误返回

WireMock 中提供了几种错误返回,使用也很简单

@Test
public void testBadResponse() {stubFor(get(urlEqualTo("/test")).willReturn(aResponse().withFault(Fault.CONNECTION_RESET_BY_PEER)));zwroksApi.test();verify(4, getRequestedFor(urlEqualTo("/test")));
}

这里在运行时会抛错 java.net.SocketException: Connection reset,这种异常是会进行重试的,所以这里测试可以通过。

服务不可用重试

调用的代码如下,我希望在返回503的时候进行重试

@Test
public void testServiceUnavailable() {stubFor(get(urlEqualTo("/test")).willReturn(aResponse().withStatus(HttpStatus.SC_SERVICE_UNAVAILABLE).withHeader("Content-Type", "text/xml").withBody("service unavailable")));zwroksApi.test();verify(2, getRequestedFor(urlEqualTo("/test")));
}

这里测试也是可以通过的。WireMock 提供了获取请求日志的能力,除了次数,我们可以看看是否两次请求是间隔了一秒。

    List<ServeEvent> allServeEvents = getAllServeEvents();long firstTime = allServeEvents.get(1).getRequest().getLoggedDate().getTime();long lastTime = allServeEvents.get(0).getRequest().getLoggedDate().getTime();assert lastTime - firstTime > 1000;

API 测试利器 WireMock相关推荐

  1. 初学api测试_面向初学者的API-在此免费视频课程中学习如何使用API

    初学api测试 What exactly is an API? How do you use an API? We've just published a full beginner's course ...

  2. 新手入门API测试必要了解的知识

    什么是API?API是Application Programming Interface的简写.实现了两个或多个独立系统或模块间的通信和数据交换能力. 什么是API测试?API测试是不同于UI级自动化 ...

  3. Chrome Restful Api 测试工具 Postman-REST-Client离线安装包下载,Axure RP Extension for Chrome离线版下载...

    [Postman for Chrome 离线下载] Postman-REST-Client离线安装包,可直接在Chrome浏览器本地安装使用,可模拟各种http请求,Restful Api测试, CS ...

  4. katalon进行app测试_使用Katalon Studio创建你的第一个API测试

    API测试(或WebService测试)在软件测试中变得越来越重要.根据谷歌趋势报告,过去五年来,行业内对API测试的兴趣一直在增加.这种趋势在一定程度上表明API测试的需求变得更加普遍.测试API或 ...

  5. soapui工具_基于开源的API测试工具!不再为web服务负载测试而发愁

    通过一个可视化.拖拽式的界面,LoadUI允许您实时.交互式地创建.配置和重分配负载测试.在单一测试环境下,LoadUI提供完整的测试覆盖,支持所有标准的协议和技术.它功能强大,能从任意数量的本地和远 ...

  6. stm32c8t6的can通信实验代码_TCP的连接建立与关闭状态及数据传输通信过程【含有 PHP socket API 测试实验代码】...

    php中文网最新课程 每日17点准时技术干货分享 本文章使用 PHP 代码来测试 TCP 传输层的一个通信过程.TCP/IP 协议关于该协议的详细内容可自行查阅 <>PHP 的 tcp/u ...

  7. 一种基于openflow的虚拟化层软件flowvisor的API测试

    注明:本文并不对openflow进行分析,本人也是略略知道这个概念,对flowvisor也只是对其API有所测试,更深的源码并未涉及,只是希望该文能对以后的flowvisor研究者提供些许帮助. 一: ...

  8. python rest api 测试_如何用Python编写REST API的单元测试

    在过去的几个月中,正在从事一个名为B的项目.它是带有简单Web UI的徽章生成器,用于添加数据并生成PDF可打印徽章.B后端现在已转移到REST-API并测试REST-API中使用的功能,我们需要一些 ...

  9. API测试工具SoapUI Postman对比分析

    版权声明:本文为博主原创文章,未经博主允许不得转载.    https://blog.csdn.net/powertoolsteam/article/details/83012359 本文由葡萄城技术 ...

最新文章

  1. Java集合类: Set、List、Map、Queue区别及应用
  2. [转]ExtJS Grid 分页时保持选中的简单实现方法
  3. 面试官:为什么HTTPS是安全的
  4. windows环境搭建golang的gin框架简易教程
  5. sprint冲刺计划第七天团队任务
  6. (转)Java中的守护线程
  7. 满足条件的数累加(信息学奥赛一本通-T1066)
  8. mac修改jupyter notebook启动时的打开目录
  9. php加载lrc,javascript - 【求助】php如何获取虾米网的LRC地址?
  10. c语言归并排序数组不固定,归并排序非递归实现C语言
  11. (原创)使用nRF51822/nRF51422创建一个简单的BLE应用 ---入门实例手册(中文)之五...
  12. 单位dB和dBm的区别
  13. CSS动画-Animation
  14. BC66F3652研发笔记
  15. 基于libtorch的Alexnet深度学习网络实现——Cifar-10数据集分类(提升准确率)
  16. python dictionary怎么用_python Dictionary字典使用
  17. 如何将文件FLAC格式快速转换为MP3格式
  18. 台式计算机识别不了u盘,电脑为什么识别不了u盘 电脑识别不了u盘该如何解决...
  19. Dalvik虚拟机垃圾收集(GC)过程分析
  20. 新变种Emotet恶意样本分析

热门文章

  1. 智能家庭监控开发框架
  2. Day1-介绍、基本语法、流程控制
  3. CentOS安装星际译王
  4. mSystems | 中科院微生物所东秀珠组发现细菌和古菌协同代谢甜菜碱产甲烷
  5. [分布式]:分布式系统的CAP理论
  6. 探索性分析——某医院18年销售数据分析
  7. CVE-2022-1388 BIG-IP_POC-YAML
  8. 学术综合英语计算机国际会议开幕词,会议开幕词英文.doc
  9. 站住,Maven依赖的scope作用域,还记得几个?
  10. Linux--date命令