MockServer(API First)-构建独立的本地服务模拟环境

MockServer 可以帮助前端开发人员快速建立服务端的模拟环境;通过模拟环境,前端可以实施独立、稳定的测试,以尽早发现问题,并且在前后端集成前就解决掉。

  1. 要想模拟环境发挥出最大效用,首先得把 API 设计好,即:API First Strategy(API 优先策略);
  2. 一旦 API 设计完毕,则前后端可以并行开发;
  3. 假如你的 API 数据格式一致的话,比如都是 json,使用 mockserver 那是很方便的;
  4. 作者 James D Bloom
    本文涉及到的三个软件包源码都托管在 Github:mockservermockserver-client-nodemockserver-grunt@ Google +
安装 node 和 npm

我们使用 node 和 npm 来安装、使用 mockserver,请首先安装好 node 和 npm;

安装 mockserver-grunt

npm install mockserver-grunt --save-dev

  • 安装这个包的时候,jar 包也会自动下载到 node_modules/mockserver-grunt 下;

    mockserver-netty-3.10.4-jar-with-dependencies.jar

  • java 运行这个 jar 包即启动了 mockserver;
安装 mockserver-client

npm install mockserver-client --save-dev

配置 MockServer(start-mockserver.js)
/* start-mockserver.js */
var mockserver = require('mockserver-grunt');
mockserver.start_mockserver({
    serverPort: 2080,
    proxyPort: 2090,
    verbose: true
});
  • 本地 serverPort 端口起一个 模拟 WebServer;
  • 本地 proxyPort 端口起一个代理服务器,这样可以直接透明代理一些 API 请求到远程服务器(因为通常并不需要在本地模拟所有 API 接口);
启动 MockServer
  • node start-mockserver.js 即可启动 mockserver;

java -Dfile.encoding=UTF-8 -Dmockserver.logLevel=WARN -jar node_modules/mockserver-grunt/mockserver-netty-3.10.1-jar-with-dependencies.jar -serverPort 2080 -proxyPort 2090

准备模拟接口数据
/* 准备模拟接口数据:demo-my-mock-responses.js */
/* 导入模拟接口数据 の 示例代码:node demo-my-mock-responses.js */
var mockServer = require('mockserver-client'),
    mockServerClient = mockServer.mockServerClient,
    proxyClient = mockServer.proxyClient;

var local = mockServerClient('localhost', 2080),
    localProxy = proxyClient('localhost', 2090);

local.reset();

local.mockSimpleResponse('/api/demo', {name:'value'}, 203);

local.mockAnyResponse({
  httpRequest: {
    method: 'GET',
    path: '/index.php',
    queryStringParameters: [
      { 'name': 'r', 'values': ['j'] },
      {
        'name': 'username',
        'values': ['michael']
      },
    ],
  },

  'httpResponse': {
    'statusCode': 200,
    'body': JSON.stringify({"username": "michael"}),
    'delay': {
      'timeUnit': 'MILLISECONDS',
      'value': 250
    }
  },
  'times': {
    'remainingTimes': 1,
    'unlimited':true
  }
});
  • expectation A:一个 mockSimpleResponse 就是一个 Expectation
  • expectation B:一个 mockAnyResponse 也是一个 Expectation;
  • 从 API 角度看,每个 mockAnyResponse 就对应模拟了一个 API,当然可以使用正则;
  • 熟悉 Nginx 的,可以对照 mockAnyResponse 为一个 Location 的寻址规则;
导入模拟接口数据

node demo-my-mock-responses.js

使用本地模拟环境示例小结
  1. java 运行 mockserver;
  2. node demo-my-mock-responses.js
    node 执行 demo-my-mock-responses.js:
    注意:mock responses js 文件修改后,要重新 node 导入;
  3. curl 访问:curl -v -X GET 'http://localhost:2080/index.php?r=j&username=michael'

OK!到这里,你已经搞定了本文示例!

将每个 mockAnyResponse 独立成一个文件便于维护
  • my-mock-responses.js 主文件;
  • expes.mock/a08-r-city-list-forward.js 是一个独立的 mockAnyResponse;
  • 前后端共同设计出 API 接口;
  • 前端人员将每个接口实现为 mockAnyResponse 文件;
  • 前后端开发人员、测试开发人员都会阅读该 js 文件;
  • a08-r-city-list.md 文件继续保留;
参考
单独安装 MockServer 的方法

MockServer 可以不依赖于 node 环境而单独运行,方法如下:

  • 下载 jar 包:mockserver-netty-3.10.4-jar-with-dependencies.jar
    wget http://search.maven.org/remotecontent?filepath=org/mock-server/mockserver-netty/3.10.4/mockserver-netty-3.10.4-jar-with-dependencies.jar
  • java 运行 MockServer;
    java -Dfile.encoding=UTF-8 -Dmockserver.logLevel=WARN -jar mockserver-netty-3.10.1-jar-with-dependencies.jar -serverPort 2080 -proxyPort 2090
  • 测试 MockServer 是否启动成功?
    使用 nc、telnet 等命令测试端口是否连通:nc -z -w 1 localhost 2080
  • 安装 java 运行环境
    如果没有 java,请安装 yum install java;当下 1.8 版本;
使用 grunt 启动 mockserver 的方法

mockserver-grunt 是 Grunt 的一个插件(plugin),除了可以使用 node 启动 mockserver 外,还可以通过 grunt 来运行 mockserver;
如果你使用 gulp 构建前端,当然就没有必要使用 grunt 了;

npm 包 mockserver-client 和 mockserver-grunt 的 安装日志
[git@i-rylroi1n wbs]$ npm i
npm WARN peerDependencies The peer dependency grunt@~0.4 included from mockserver-client will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency 
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN peerDependencies The peer dependency grunt@~0.4 included from mockserver-grunt will no
npm WARN peerDependencies longer be automatically installed to fulfill the peerDependency 
npm WARN peerDependencies in npm 3+. Your application will need to depend on it explicitly.
npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
grunt@0.4.5 node_modules/grunt
├── eventemitter2@0.4.14
├── dateformat@1.0.2-1.2.3
├── which@1.0.9
├── getobject@0.1.0
├── async@0.1.22
├── colors@0.6.2
├── lodash@0.9.2
├── rimraf@2.2.8
├── hooker@0.2.3
├── grunt-legacy-util@0.2.0
├── exit@0.1.2
├── coffee-script@1.3.3
├── iconv-lite@0.2.11
├── underscore.string@2.2.1
├── nopt@1.0.10 (abbrev@1.0.9)
├── minimatch@0.2.14 (sigmund@1.0.1, lru-cache@2.7.3)
├── glob@3.1.21 (inherits@1.0.2, graceful-fs@1.2.3)
├── grunt-legacy-log@0.1.3 (grunt-legacy-log-utils@0.1.1, lodash@2.4.2, underscore.string@2.3.3)
├── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.16)
└── findup-sync@0.1.3 (lodash@2.4.2, glob@3.2.11)

mockserver-client@1.0.10 node_modules/mockserver-client
└── q@2.0.3 (weak-map@1.0.5, pop-iterate@1.0.1, asap@2.0.4)

mockserver-grunt@1.0.30 node_modules/mockserver-grunt
├── q@2.0.3 (weak-map@1.0.5, pop-iterate@1.0.1, asap@2.0.4)
└── glob@5.0.15 (path-is-absolute@1.0.0, inherits@2.0.1, inflight@1.0.5, once@1.3.3, minimatch@3.0.3)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容