使用wiremock实现动态的结果返回

达芬奇密码2018-08-07 15:03

前言

在金融应用的测试过程中,总是会面临一些与合作方交互的情况,最常见的就是http调用合作方服务。合作初期测试工作通常比较顺利,合作方会积极的提供测试环境供调用,但是上线之后,合作方不再维护/提供测试环境,这个时候就需要mock来代替合作方提供服务,应对这种场景,能够支持动态返回的mock是必须的。

简单实现

先说重点,如何让wiremock动态的处理请求,wiremock(1.57,最新的2.X版本wiremock应该有些变化,还未细看)中提供了自定义返回结果的类ResponseTransformer,要做的就是继承这个类并实现自己的处理方法,在示例代码中写了一个将POST请求body原样返回的mock接口

  • wiremock中的ResponseTransformer类,如果要自定义多个transformer,applyGlobally需要重载返回false
  • 自定义一个Response方法,包含各种response数据的写入,这里我把请求的body直接放到返回的body里了
  • 通过引入wiremock的jar包,通过程序启动wiremock客户端,指定mock端口18800,并mock了一个POST请求/sample,重点在于withTransformer中指定了使用自定义的Transformer来处理请求与返回结果,注意这里的disableRequestJournal可以保证mock长久运行,否则wiremock会保留每次请求的数据
  • 启动wiremock,发起POST请求curl '127.0.0.1:18800/sample' -d 'a=3&b=3' ,返回结果就是a=3&b=3

  • 到这里一个最简单的动态返回mock就完成了,之后只需要根据需要进行改写 gitlab:ssh://git@g.hz.netease.com:22222/hzchengziliang/mock-pub.git

需求与平台化的实现

金融mock的接口大多是后台服务器间的接口,动态返回属于最基本的需求
拿一个接口举例,某合作方的开户接口 > /trade/open POST //XX开户接口

请求参数为msg+sign,msg为json串base64后的结果,sign为签名
msg在base64前的数据 > {
"user":"userA",
"account":"userA@163.com",
"order_type":"1"
}

需要的返回结果中的json如下 > {
"user":"userA",
"account":"userA@163.com",
"tradeId":"20160808trade12345",
"date":"当前日期",
"order_type":"1"
}

是将请求中的user,account,orderType原样返回,并生成一个随机的订单号,同样将这个jsonbase64编码成msg,并对msg进行RSA加密并返回最终结果,处理流程如下图

 

  1. 再说明下我们这边的平台化mock服务如何应对这类mock需求,mock服务分为mock客户端与mock配置端,客户端提供mock服务,配置端提供配置服务,使用了springboot+wiremock+redis来实现能够通过页面配置的mock服务,设计如下 通过springboot起一个简单的web服务来控制mock客户端,在服务端配置mock并更新到redis并通知web服务重启mock客户端,客户端在重启的时候会重新加载redis中的数据来加载新的mock配置,大致功能如下:  
         1、提供平台化的mock配置,只需要在页面上配置好mock就可以直接使用  
         2、基于常规的mock进行扩展,支持动态的返回结果  
         3、依业务需求对返回结果进行处理/加密/延迟返回等   
    
    • 如上述需求,在平台配置界面就可以很快配一个出来,结果验证

发起请求(可以自己调一下)
curl 'http://jrqa.netease.com/trade/open' -d 
'msg=eyAgDQogICAgInVzZXIiOiJ1c2VyQSIsICANCiAgICAiYWNjb3VudCI6InVzZXJBQDE2My5jb20iLCAgDQogICAgIm9yZGVyX3R5cGUiOiIxIiAgDQp9'
返回结果
msg=eyJ1c2VyIjoidXNlckEiLCJhY2NvdW50IjoidXNlckFAMTYzLmNvbSIsInRyYWRlSWQiOiIyMDE2MDgxMnRyYWRlMDQ3MD
QiLCJkYXRlIjoiMjAxNjA4MTIxNDAyMjMiLCJvcmRlcl90eXBlIjoiMSJ9&sign=ULAAjRLBW/
zneRq2Ls0cXZrMd96zR4xMBynBRksiN/Y9GgXoReWph7YlVJtq4yj4Y93YCpMxrE2WJEhO/
FVcZTA9FLuKW2pshnFa7AVHQmfbdB+ivD1ax1HXWXoSZzd077qRWosu6lrYUnBzukkRwscS9gem9jMnqhlb6fqR42Q=
  1. 简单的FAQ
    Q:如果是https的接口,如何绕过https校验
    A:wiremock本身提供了对https的支持,不过这种支持不够灵活,我们的平台mock使用nginx来处理https请求并proxy_pass给后台的mock服务,使用mock的主机绑定host到nginx服务器。
    Q:压测也需要动态的返回结果,能支持吗
    A: 扛不住 wiremock本身承载能力不强,加上这边又做了杂七杂八的工作,所以单台的TPS是不高的,不过可以部署多台mock服务然后通过nginx负载均衡强化承载能力。(这方面moco的处理效率很高)

  2. 最后是广告
    平台mock的配置在金融质量平台(marvel)上,marvel平台是金融事业部QA的工作管理平台,集测试效率提升、测试工具平台化、测试技术创新、测试流程规范化、测试数据可视化等于一体,关于该平台详细介绍后续会单独起一篇文章来介绍,有兴趣的同学可以关注下金融QA的知识圈,即互联网金融QA,关注后续的更新,


网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者程子量授权发布。