Mock 技术原理

1. 什么是mock?

  • 在软件测试过程中,对于一些不容易构造、获取的对象,用一个虚拟的对象来替代它,以达到相同的效
    果,这个虚拟的对象就是Mock。

  • 在前后端分离项目中,当后端工程师还没有完成接口开发的时候,前端开发工程师利用Mock技术,自
    己用mock技术先调用一个虚拟的接口,模拟接口返回的数据,来完成前端页面的开发。

  • 其实,接口测试和前端开发有一个共同点,就是都需要用到后端工程师提供的接口。所以,当我们做接
    口测试的时候,如果后端某些接口还不成熟、所依赖的接口不稳定或者所依赖的接口为第三方接口、构
    造依赖的接口数据太复杂等问题时,我们可以用mock的方式先虚拟这些接口返回来代替。提高工作效
    率。

2. moco介绍

实现mock的技术很多,这些技术中,可以分为两类,mock数据和mock服务:

  • mock数据:即 mock 一个对象,写入一些预期的值,通过它进行自己想要的测试。常见的有:
    EasyMock、Mockito 、WireMock、JMockit。主要适用于单元测试。

  • mock 服务:即mock 一个 sever,构造一个依赖的服务并给予他预期的服务返回值,适用范围
    广,更加适合集成测试。如 moco框架。

Moco 是类似一个 Mock 的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个JAR包。
有如下特点:

  • 只需要简单的配置 request、response 等即可满足要求

  • 支持 http、https、socket 协议,可以说是非常的灵活性

  • 支持在 request 中设置 Headers , Cookies , StatusCode 等 对 GET、POST、PUT、DELETE 等请求方式都支持

  • 无需环境配置,有 Java 环境即可

  • 修改配置后,立刻生效。只需要维护接口,也就是契约即可

  • 支持多种数据格式,如 JSON、Text、XML、File 等

  • 可与其他工具集成,如 Junit、Maven等

3. 下载moco

链接:https://pan.baidu.com/s/1DzHKtkduENSwF3W4YURoKA
提取码:g8k78

4. 配置json文件

我们需要先编辑一个json文件,用来模拟不同的请求,返回不同的响应。新建一个文件,格式改为json,然后打开这个文件进行编辑,内容如下:

 [{
  "description":"demo",
  "request":{
   "uri":"/demo1"
   },
  "response":{
   "text":"Hello,demo1"
  }
 }]

其中

  • description是注释(描述),由于json无法写注释,所以提供了用这个key

  • uri就是我们这个接口的统一资源标识符,可以根据模拟的接口自行定义

  • response里的内容即为返回的值

  • 这是一个非常简单的mock

5. 启动moco

moco项目是采用java开发的,所以启动moco前,需要安装jdk。未安装请先安装

把我们下载下来的moco的jar包和刚刚编辑好的json文件放到同一个文件夹路径下,如图:

image.png

然后在该路径下打开cmd命令行,如图:

image.png

方法:在该路径下,输入cmd,按回车,弹出命令行。

输入命令

java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json

其中

  • jar包的名称可根据自己下载的jar包版本来写

  • http代表这个模拟的是http请求

  • -p 9090 定义是端口号

  • -c test.json 是我们编辑的那个json文件名。

执行命名后,如图:

image.png

此时我们mock的服务以及启动成功了,相当于在我们本地的9090端口上启动的,所以我们可以通过浏览器访问一下http://localhost:9090/demo 来看看返回的结果,注意,这里/demo就是我们在json文件中定义的uri。

image.png

如图,我们访问后得到了json文件中编辑的返回值。以上我们就完成了用moco来帮助我们生成mock。

6. 配置不同的请求

Demo1:约定URI
 [{
  "description":"demo1=约定URI",
  "request":{
   "uri":"/demo1"
   },
  "response":{
   "text":"Hello,demo1"
  }
demo2:约定请求参数
 [{
  "description":"demo2=约定请求参数",
  "request":{
   "queries":{
    "key1":"abc",
    "key2":"123"
     }
   },
  "response":{
   "text":"Hello,demo2"
  }
 }]
demo3:约定请求方法
 [{
  "description":"demo3=约定请求方法",
  "request":{
   "method":"DELETE"
   },
  "response":{
   "text":"Hello,demo3"
  }
 }]
demo4:约定请求头
 [{
  "description":"demo4=约定请求头",
  "request":{
   "headers":{
    "Content-Type":"application/xml"
    }
   },
  "response":{
   "text":"Hello,demo4"
  }
 }]

demo5:约定请求体参数-form

 [{
  "description":"demo5=约定请求体参数-form",
  "request":{
   "forms":{
    "key1":"abc"
    }
   },
  "response":{
   "text":"Hello,demo5"
  }
 }]

demo6:约定请求体参数-json

 [{
  "description":"demo6=约定请求体参数-json",
  "request":{
   "headers":{
    "Content-Type":"application/json"
    }, 
   "json":{
     "key1":"value1",
     "key2":"value2"
    }
   },
  "response":{
   "text":"Hello,demo6"
  }
 }]x`

demo7 uri-startsWith匹配(以什么字段开头)

[{
  "description":"demo7=uri-startsWith匹配", 
  "request":{ "uri":{
   "startsWith":"/sq" 
 }
}, 
  "response":{
  "text":"Hello,demo7" 
}
}]

demo8 uri-endWith匹配(以什么字段结尾)

[
{
    "description":"demo8=uri-endsWith匹配",
    "request":{
        "uri":{
        "endsWith":"sq" 
        } 
        }, 
    "response":{
    "text":"Hello,demo8"
    }
}]

demo9 uri-contain包含

[{
    "description":"demo9=uri-contain匹配",
    "request":{
        "uri":{
            "contain":"fcl"
        }
    },
    "response":{    
        "text":"Hello,demo9"  
    }
}]

Demo10:返回状态码

[{
    "description":"demo10=响应状态码",
    "request":{
        "uri":"demo10"
    },
    "response":{
        "status":200 }
}]

Demo11:返回响应头

[{
    "description":"demo11=响应头",
    "request":{
        "uri":"demo11"
    },
    "response":{
        "headers":{
            "Content-Type":"application/json"
        }
    }
}]

Demo12:重定向

[{
    "description":"demo12=重定向",
    "request":{
        "uri":"demo12"
    },
    "redirectTo":"http://www.baidu.com"
}]

Demo13:返回JSON格式的数据

[{
    "description":"demo13=返回json格式的数据",
    "request":{
        "uri":"/demo13" },
    "response":{
        "json":{
            "key1":"value1","key2":"value2"}
    } 
}]

7. 附:json脚本关键字

  • request

    \circ method

    \circ uri

    \circ headers

    \circ cookies

    \circ queries

    \circ forms、json、text

  • response

    \circ status

    \circ headers

    \circ cookies

    \circ text、json

    \circ redirectTo

8. moco总结

  • Moco还可以通过在json文件中添加cookies、header、重定向这些参数,来模拟各种情况下的请求和返回值,可以根据自己工作的需求去对这些东西进行了解。

  • Moco是热更新的,所以启动了jar包的服务之后,即使修改了json文件中的内容,也不需要重启服务就生效。

  • 掌握了mock测试的技术,可以让我们在开发没有完成对应接口的时候,有接口文档就提前进入到测试状态,是现在敏捷模式下不可或缺的技术,也是持续集成中一个重要的组成部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351