导读:作为一名测试,我们知道不是任何情况都可以用真实对象来测,比如我们要测一个地方PM2.5超过900的情况,我们不能每天等着PM2.5的指数超过900再测试,这个时候可以用一个虚拟对象来创建测试,做一个Mock。如何构造Mock使用场景?如何使用Mock提效,不用老加班?
11月2日,阿里巴巴研发效能事业部-云效平台技术专家孙琛,在云效Work Like Alibaba系列直播上,结合视频演示为大家分享了Mock平台的功能实践,让大家在测试开发过程中用Mock提效。
为什么会需要Mock?
传统架构下的一些银行、保险、证券等金融类客户,存在很多的第三方的接口会用于代付、转账等,当对方提供的测试环境不稳定时,我们自身的研发效能就会受到影响。比如说联调,如果对方系统挂了,我们肯定要Delay一天,这种环境不稳定的情况是传统架构比较容易出现的。还有种情况,假设我们要测一个账户,他一天内有100多次转账记录的数据准备,如果让银行准备的话,可能会拿这个用户来回来回转账,会非常麻烦。
另外,现在比较流行的互联网架构下,有一种分布式实践,就是把自己的业务拆成很多的服务,有提供者、消费者,粒度非常细。例如下图,有非常复杂的依赖关系,在开发过程中,如果同时让菱形和三角形来开发,那在三角形还没有准备好的时候,我们怎么保证菱形的业务能正确走下去?还有一种现在比较提倡的前后端分离,如何在后端代码还没有准备好,或者说接口还没有提供出来的时候,可以先做前端页面的一个逻辑?这些是Mock需要解决的问题。
Mock解决方案
1.Mock解决不稳定的问题。Mock服务非常简单,没有业务逻辑,所以它足够稳定。比如说银行那边的接口挂了,全都接到Mock平台的话,所有的请求权会从Mock平台出,而不会跟银行的接口有什么关联。
2.快速构造复杂数据。我们可以自定义一个返回结果,有了自定义的返回结果后,就可以构造非常复杂的数据,不需要银行或者其他第三方给我们准备数据,完全可以用我的数据在返回里面把它定义好,再继续做业务的一个验证。
3.快速构造异常场景。对于一些异常的情况,比如网络延迟高,或者返回特殊异常的时候,也可以用Mock来构造。
服务端Mock平台
服务端Mock平台主要是在服务调用者和服务提供者中间,让调用者不再直接调用那个提供者,而去调用我们的Mock平台,目前Mock平台支持Http、Dubbo、Sofa、Hsf(Edas)。Mock能让测试以及联调不受环境的影响,提升研发测试效率,并且对于开发也没有任何侵入性,不需要额外编写代码,只需要在页面配置就可以完成接口的Mock,同时也可以支持一些业务复杂情况下,在Mock里模拟各类场景。
Mock平台基础功能
- 多协议支持:Http(s)、Dubbo、Sofa、Hsf(Edas),还有一些rpc的请求。
- 多格式支持:支持一些常见的Json,Xml,还有其他一些自定义格式都是支持。
- 标签化:对管理来说,有一个标签化的管理,能快速定位到我们需要的Mock。
- 动态表达式:如果我们希望返回结果不是最简单的,就这么一个静态文本,我们希望是它可以输出当前的日期,或者是一些简单的逻辑运算,希望他有一个最简单的动态化的功能,或者再简单的举个例子,就是说我们希望他跟入参会有一些互动。
- 多端口:支持任意端口请求,避免开发修改代码。
- 异常Mock:Http异常Code,Rpc异常类
以一个Http的例子来做一个演示。
这是一个获取天气的接口,比如说我传city=杭州,它就会返回杭州的天气情况,比如温度、pm指数等,这个很常见。假设接到的需求要模拟pm2.5超过900的情况,看下我自身的业务逻辑会怎么走?我们不能每天在那里等pm2.5超过900才去做测试,所以可以做一个Mock。
我们新增一个天气的Mock,然后选择Http,填个Mock名字,然后API的话,把接口url填这里。那返回值的话,我们可以先从真实的返回值里面做修改,把真实调用的返回结果拷贝下,我们希望pm2.5非常高,那把原先的pm2.5值修改为999。这样子的话,一个最简单的Mock就定义好了。
我们接着做一次对域名的切换,比如说原先是指向真实的服务器,现在改成我们的一个Mock服务器,我们把这个域名指向Mock服务器,然后再做次刷新,可以看到pm2.5就变成999,我们的Mock就生效了,这就是一个最简单的Http的Mock使用场景。
Mock平台高级功能
基础功能基本上可以解决大部分的日常使用问题,Mock平台还有一些比较高级的特性。比如说我们
支持动态Mock。当我们需要写一些很复杂的逻辑时,例如:希望当参数没传的时候,返回一个error信息,我们可以在这里用Java的一个返回结果,然后在这里写具体的一个脚本。比如说city=杭州。
这就是举一个最简单的例子,你可以在这里写任意的一个代码。
然后再讲一下
匹配规则。比如说当city=罗马的时候,我们会输出一个失败,因为还没有罗马这个城市的支持情况。当Admin来访问的时候,我们会打出另外一种情况,这里大家注意到有权重的问题,就是说当Mock匹配到了以后,它会以权重值来决定它的优先级。比如说当city=罗马时,它会说我们还不支持的城市,但是当city=罗马&admin,会输出管理员你说了算,因为管理员的权重比罗马要高。这就是一个匹配规则。
前置步骤:主要是做一些自定义的解析。比如在前置步骤里,我先定义一些变量,比如说a=hello,那可以直接在表达式里面直接引用这个a。"你说了算${a}",最终输出为"你说了算hello",这就是前置步骤的一个用法。
Mock录制:你可以在没有任何Mock的情况下,先把你的域名绑定到Mock平台,它会先请求Mock平台,然后把你的入参拿到一个真实的服务器平台去请求,拿到一个具体的返回值,这样有了入参和返回值,还有具体的API后,就会生成一个具体的Mock。这在初期快速建立Mock的一些数据的时候会用到。
内置模块:主要是基于动态Mock的基础上,我们内置了很多模块:随机字符串,Json或者Xml的解析,Http调用,数据库等。
回调:有些服务希望在Mock请求到以后,由Mock发起一个新的请求到一个具体的地址,做一些回调用。
这里有个报文的演示。
一般情况下会用的比较多。比如说参数是一个很大的报文,结果里面也是一个报文,但是返回结果里面的某些值,假设这个返回结果的这个城市,它需要根据入参的城市来做一个定义,就可以用这种形式。
比如再看这个例子,可以看到它的包里是这么一个报文,Mock以后,就是我们Mock它的一个报文。刚才看到,城市是可以动态的根据入参报文的那个动态修改,比如说查看北京的,那它就会报北京的数据,对于金融类企业,这种是比较有用的。
试用体验,
请先点击进入专有云咨询入口,
填写需求后我们会尽快与您联系!
常见问题
问1:如果我希望不同的入参,能返回不同的值,那我们具体要怎么做呢?
答1:其实Mock平台是支撑三种不同的做法。一个动态表达式,还有编程模式,还有匹配规则,那这三个分别在什么场景下用呢?
动态表达式比较适合于你的返回值是一个模板,就是有模板可套的,比如是一个很大的报文,只是里面状态或者说里面的code,会随着入参的不同而不同。在这种情况下,你完全可以把入参中的code或者是状态,用动态表达式的方式来做。
第二种就是它的返回值完全不一样,就完全不是同一套模板,格式也可能不一样。这种情况下,可以用之前的if else来写,比如说当入参等于多少的时候,你返回这样一个模板。
第三种情况,就是当你觉得写代码比较困难,或者觉得没必要的时候,可以用匹配规则。比如说入参等于多少的时候,你可以设置一个规则,它返回什么样的参数,当入参等于另外一个规则的时候,返回另外一个参数。
以上三种情况可以根据具体情况结合操作。
问2:用了这个Mock平台以后,开发代码要怎么配合修改呢?
答2:我觉得开发代码一般情况下是不用改的。对于http类型,开发经常会用一些域名加端口加API的方式访问,你完全可以把API配到Mock平台上,然后通过修改这个域名对应的host,或者说DNS来切换一个真实的测试环境和Mock环境。对于rpc类型的话,我们一般会有自己的一些配置,会选择直连一个提供者,他可以把提供者的IP,也就是Mock平台的IP配进去。
问3:假设我是同一个接口,然后我有不同的项目在并行开发,但我希望A项目的调用,返回的是A,B项目的话返回是B,那我们Mock平台,只能配一个Mock怎么办?
答3:这里可以用IP来区分,我们可以用匹配规则的IP属性,当IP等于A项目,我们可以给它返回A项目的一个数据,如果IP是B项目,那就是返回B项目的一个数据。
问4:对于rpc请求,可能就是把API包上传到mock平台上。有些同学可能会说他的API包,不在一个里面,是分散到各个Jar包里面的怎么办?
答4:我们其实也考虑到这个情况,让那个Jar包管理模块里面有一个添加依赖的方式,你可以把多个Jar包同时上传到平台上。
问5:假设我现在刚开始做,只需要Mock服务里的一个方法,怎么办?
答5:这个不用担心。比如说你有5个方法,你只实现了其中1个Mock方法,其余4个会真实调用你的测试环境,所以你可以理解这4个是不变的,只是某1个你用了Mock。
问6:可能会有一些同学发现,就是我Mock一个请求过来,可能会有非常多个Mock全都匹配到,那调用的时候到底调用哪一个呢?
答6:上面也说过,我们有一个匹配规则的权重,权重数字大的肯定会比权重小的优先调用,如果没有匹配规则的话,会有一个新旧的顺序,新的Mock会覆盖旧的Mock的返回值。
PDF下载:
点击附件下载
直播回顾:
点击查看