2016-10-24   出处:Qtest之道  作/译者:闫耀珍

 

上面的情景是不是似曾相识呢?现今的业务系统已经很少是孤立存在的了,尤其对于一个大公司而言,各个部门之间的配合非常密切,我们或多或少都需要使用兄弟团队或是其他公司提供的接口服务,当然,我们也会给其他兄弟部门提供接口。这样的话,就对我们的联调和测试造成了很大的麻烦。假如各个兄弟部门的步伐完全一致,那么问题就会少很多,但愿望是美好的,现实是残酷的,要做到步伐一致基本是不可能的。所以,对于这种情况,我们的解决方案通常是搭建一个临时的mock server来模拟那些兄弟部门未开发完成的接口,以达到单方面联调测试的效果,我们下面会介绍一些mock小工具。一般来说,搭建这种临时的mock server比较简单,但是往往也意味着功能简单,有时候可能我们得需要为不同的接口进行重复开发以实现特定功能。这样的话问题就来了,随写随仍不是我们互联网人一贯的作风,我们需要将这种基础服务传承下去,要服务于众多的其他互联网人,我们称之为share。那么能不能构建一个通用的mock server呢?自己动手丰衣足食,萌生了自己开发一套mock系统,就有了现在的雏形——xMock,且听我慢慢道来关于mock的二三事。

一、什么是mock?

mock这个单词解释起来,本意就是模拟或者效仿。我们可以把mock理解为一个替身,在软件开发领域,通常就是指模拟对象。

二、为什么需要Mock?Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。

如上图所示,A接口依赖于B、C、D三个接口,如果这三个接口没有都准备好的话,我们必须对它们进行模拟才能继续A接口的开发调试。

三、Mock的好处是什么?

1. 团队可以并行工作

有了Mock,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切;后端与后端之间如果有接口耦合,也同样能被Mock解决;测试过程中如果遇到依赖接口没有准备好,同样可以借助Mock;不会出现一个团队等待另一个团队的情况。这样的话,开发自测阶段就可以及早开展,从而发现缺陷的时机也提前了,有利于整个产品质量以及进度的保证。

2. 开启TDD模式,即测试驱动开发

单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。

3. 可以模拟那些无法访问的资源

比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。

4. 隔离系统

假如我们需要调用一个post请求,为了获得某个响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,我们给他指定返回就好了。

5. 可以用来演示

假如我们需要创建一个演示程序,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。说到演示了,假如你已经做好了一个系统,并且需要给客户进行演示,但是里面有些真实数据并不想让用户看到,那么同样,你可以用Mock接口把这些敏感信息接口全部替换。

6. 测试覆盖度

假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,难道你要千方百计地给系统做各种手脚让他返回以便测试吗?比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让他返回500 。。。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,妈妈再也不用担心我的测试覆盖度了!

四、有哪些mock小工具既然Mock好处这么多,还是赶紧看看有哪些Mock方法吧。下面我介绍下我接触过的一些Mock小方法。

1. Mock Server-Moco这是一个jar包,只要执行该jar包,指定配置文件,就可开启一个http服务器提供服务,并且修改配置文件后也无需重启服务,支持动态加载。我使用的是moco-runner-0.10.2-standalone.jar,运行方式如下:```java -jar moco-runner-0.10.2-standalone.jar start -p 8080 -c ***.json```***.json就是我们的mock配置文件,比如:

具体其他使用方法请参照官方文档:https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md

2. www.jsonohyeah.com

这是一个在线mock网站,操作简单,但url是自动生成的,接口逻辑也无法实现定制化。考虑这样一个场景:前端人员在使用mock接口时,肯定希望接口地址和最终上线的地址完全一样,这样就无需在联调时修改接口地址了,只需配置一个hosts,不然的话,改来改去难免改错。对于这样的场景,这个mock网站就实现不了,更不用说其他更加定制化的需求。

3. fiddlerfiddler大家都很熟了,可谓是居家旅行之必备,在windows环境可以随便自定义返回内容,但一个很大的缺点是,它不跨平台,而我们平时的很多场景下,是需要在Linux下进行mock的。还有一些其他mock工具,大多都是通过编写js代码或者python、java等代码来达到mock目的,此处就不再介绍了。

介绍了这么多mock工具,那么哪个最好使呢?我的要求其实不多,一是数据要好管理,别让我管理一堆文件;二是mock接口最好可以设置成和真实接口完全一致,这样就只需要切换hosts就可以切换mock接口和真实接口,不需要修改代码;三是跨平台,mock接口在windows和Linux下都需要可用。至于跨域、动态加载什么的,这是必须条件。我的要求确实不多,但上面介绍的都没法全部满足。

五、xMock系统诞生始末xMock是BS架构,web页面录入接口信息后,可以在任何平台下调用mock接口,满足了跨平台;接口信息保存在数据库中,解决了文件方式不好管理的问题;web页面录入接口信息,任何人都可以轻松操作,不需要代码知识,使用门槛低;通过nginx访问配置好的mock接口,后台统一处理请求信息,进行url匹配,解决了mock接口和真实接口一致性的问题。xMock系统使用非常简单,只要三步:填写项目信息,在对应项目下填写接口信息,配置hosts即可访问。页面如下:

xMock系统的核心——mockserver,采用nginx作为前端代理,将接收到的所有请求全部转发到后台mockserver,mockserver接收到请求后,对url进行预处理,根据url以及请求方式,在数据库中查找对应的响应并返回,流程如下图:

好,xMock系统搭建起来了,正好有个需求,我们需要调用360移动开放平台的一个获取特定账号下app信息的接口,但是这个接口在测试环境下无法得到想要的信息,好了,我们按照真实接口的返回格式,将我们想要的返回以及其他信息录入xMock,然后在Linux配置hosts,将接口地址指向提供mock服务的ip,web产品页面调用接口,欧耶,顺利返回了设置好的内容!

这就是mock带给我们的便利。

Mock测试,何去何从的更多相关文章

  1. Python单元测试和Mock测试

    单元测试 测试可以保证你的代码在一系列给定条件下正常工作 测试允许人们确保对代码的改动不会破坏现有的功能 测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误 良好的测试要求模块化,解耦代 ...

  2. mock测试到底是什么?

    ​    ​经常听人说mock测试,究竟什么是mock测试呢?mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍,之后会有详细的mock测试,感谢大家对测试梦工厂的持续关注. 概 ...

  3. mock测试框架Mockito

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  4. Spring MVC如何测试Controller(使用springmvc mock测试)

    在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...

  5. mock测试

    看到群里有人说mock测试,究竟什么是mock测试呢?开始自己也没明白,查了下相关资料.还是很有必要了解哈:那么mock测试能解决什么问题?mock测试要如何做呢?今天为大家做简单介绍.mock测试就 ...

  6. Postman入门之Mock测试

    1.什么是Mock测试: mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法. 2.添加要Mock测试的接口为example: 2.1点击r ...

  7. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  8. mock测试SpringMVC controller报错

    使用mock测试Controller时报错如下 java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig at org.spr ...

  9. 【转】MOCK测试

    mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象[mock对象]来创建以便测试的测试方法. mock对象:这个虚拟的对象就是mock对象. mock对象就是真 ...

  10. RPC接口mock测试

    转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1        简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...

随机推荐

  1. ..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init (referred from exti.o). 错误修改

    今天在移植野火的程序到元子的开发平台上时候,发现自己在中断初话中断函数的时候出现了:..\OBJ\LED.axf: Error: L6218E: Undefined symbol EXTI_Init ...

  2. 手机与Arduino蓝牙串口通讯实验及完整例程

    安卓手机与Arduino之间采用蓝牙串口通讯,是很多智能装置和互动装置常用的控制方法,简单而有效,无需网络环境,很实用的技术. 实验采用Arduino UNO板,加了一块1602LCD屏做显示(因为只 ...

  3. 正则表达式模式修正符 比如/esi

    正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...

  4. ES6 之 Math对象的扩展

    1.ES5 http://www.w3school.com.cn/jsref/jsref_obj_math.asp 2.ES6 Math.trunc() - 取整,去掉一个数的小数部分 console ...

  5. 吴裕雄--天生自然 PHP开发学习:超级全局变量

    <!DOCTYPE html> <html> <body> <?php $x = 75; $y = 25; function addition() { $GL ...

  6. SQL基础教程(第2版)第2章 查询基础:2-2 算数运算符和比较运算符&2-3 逻辑运算符

    ● 包含NULL的运算,其结果也是NULL. ● 判断是否为NULL,需要使用IS NULL或者IS NOT NULL运算符. ■算术运算符 ■需要注意NULL ■比较运算符 这些比较运算符可以对字符 ...

  7. Vue 集成环信 全局封装环信WebSDK 可直接使用

    2019-11-25更新 npm install --save easemob-websdk请直接使用官方安装方式即可.import WebIM from 'easemob-websdk' 以下是最开 ...

  8. Python笔记_第四篇_高阶编程_高阶函数_2.filter

    1. filter函数: 原型:filter(fn,lsd) 参数1为函数 参数2为序列 功能:用于过滤序列,把传入的函数一次作用域序列每个元素,根据返回的是True还是False决定是否保留该元素. ...

  9. 瑞芯微RK3399六核-迅为3399开发板介绍

    迅为3399开发板基于瑞芯微的RK3399处理器设计,Rockchip RK3399是瑞芯微推出的一款低功耗.高性能的应用处理器芯片,该芯片基于Big.Little架构,即具有独立的NEON协同处理器 ...

  10. nginx中server块的匹配顺序

    客户端发出一个http请求时,nginx收到后会取出header头中的host,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请 ...