为什么你需要一个 mock server - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
ufologist
V2EX    Javascript

为什么你需要一个 mock server

  •  
  •   ufologist 2016-09-03 14:02:39 +08:00 12426 次点击
    这是一个创建于 3381 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前后端分离之后, 接口文档还不够, 以前是假数据时代, 现在 mock server 才是未来, 最终我们需要一个统一的接口管理平台.

    puer-mock

    npm install puer-mock --save-dev puer -a _mockserver.js 
    { "api": { "GET /api/users": { "response": {} } } } 

    puer-mock-example

    puer-mock-api-doc-html

    为什么你需要一个 mock server

    第 1 条附言    2016-09-14 17:06:31 +08:00

    v1.2.0 2016-9-14

    特此中秋佳节之际, 发布新版本, 祝大家中秋节快乐.

    22 条回复    2016-09-18 15:18:39 +08:00
    rainysia
        1
    rainysia  
       2016-09-03 17:13:20 +08:00
    有 swagger , 为什么还要 mock
    ufologist
        2
    ufologist  
    OP
       2016-09-03 18:48:48 +08:00 via iPhone
    @rainysia 据我所知 swagger 可以定义接口,做为接口文档,但如果后端接口还没有开发完,前端难道不需要 mock 吗?
    这时候前端一般的做法就是自己手工做假数据,但这样做的效率和方式都不理想,所以才做了 puer-mock 项目
    majinjing3
        3
    majinjing3  
       2016-09-03 19:07:04 +08:00 via Android
    支持下,最近正在找这类工具,
    chrishine
        4
    chrishine  
    &bsp;  2016-09-03 21:35:00 +08:00 via Android
    13 年的时候用过 tw 一个人写的 moco
    int64ago
        5
    int64ago  
       2016-09-03 22:31:42 +08:00
    既然你用了我司大神的作品 puer , 那为什么不直接用 http://nei.netease.com/

    说实话,你造的这个轮子可用性很差
    majinjing3
        6
    majinjing3  
       2016-09-03 23:36:44 +08:00 via Android
    @int64ago nei 开源么?
    microchang
        7
    microchang  
       2016-09-03 23:38:33 +08:00 via Android
    话说回来。。不看看 fake.llchangll.com 这边么?正在测试,还没准备好正式上~
    ufologist
        8
    ufologist  
    OP
       2016-09-04 16:02:59 +08:00
    @microchang 试用了一下 fake.llchangll.com , 可是没有找到在哪里可以定义接口的参数?

    http://storage1.imgchr.com/images/fakeapi.png
    ufologist
        9
    ufologist  
    OP
       2016-09-04 16:36:10 +08:00
    @int64ago 感谢你的分享, 长知识了, puer-mock 相比 NEI, 根本是没法比了, NEI 是一个完善的接口管理平台, 而 puer-mock 仅仅是为了方便大家快速定义接口做一个 mock server 而已.

    说到造轮子, 可能是我见识少, 没有看见过 puer-mock 这样的轮子, 纯粹是为解决自己遇到的问题, 如果要论可用性, 我自己觉得很方便, 已经够用了, 其他准备使用的小伙伴们如果有问题可以发 issue 或者 pr, 或者再造一个更好的也无妨.

    另外看了一圈 NEI , 不知是否可以算是网易公司(内部?)级别的东西, 感叹大公司就是好啊, 如果所有团队都能够这样统一作业, 可谓是行业的又一大进步, 值得我们学习. 感觉和阿里系的 RAP 有部分功能类似.
    https://github.com/thx/RAP
    ufologist
        10
    ufologist  
    OP
       2016-09-04 17:05:52 +08:00
    @chrishine 有缘啊, 我也用过 moco, 但貌似不能做动态可变的假数据, 只能是写死的假数据, 配置起来也不是很直观, 是基于 Java 实现的, 对于前端来说可能不太方便定制.

    https://github.com/dreamhead/moco
    int64ago
        11
    int64ago  
       2016-09-04 17:30:22 +08:00   1
    @ufologist 主要还是内部用,其实 NEI 目前已经很强大了,特别是最近新出的版本,已经可以自定义函数

    但是,作为使用者,内部还是很多反馈并不是那么好,所以任重道远吧


    造轮子挺好的,至少对自己而言学习了很多东西,这种技术驱动型的作品本身也很好的

    我说的可用性差仅仅是我平时开发中遇到的场景太多了,发现 NEI 很多时候都不能满足,而你的方案就目前来说我基本无法应用到项目中……

    实际项目的 mock 应该这样:

    - 应该有个平台( Web 形式也好,客户端形式也行)来同时提供给前后端使用,并且对双方都友好,因为定义接口通常是多个团队的事情
    - 平台的修改应该很容易反应到本地 Mock 数据,并且可以有多种选择(这个需求本身并不好实现)
    - Mock 生成的数据应该同时对 iOS/Android/... 都友好,而且不应该有入侵性
    - Mock 数据的定义应该可以自己插入一些简单逻辑,比如某个字段只返回 1-10 之间的数字
    - Mock 数据的定义应该考虑到可复用性,因为很多接口和数据结构本身就是重复的……
    - Mock 的管理应该区分用户权限,而且在生成过程中也有体现
    - Mock 接口和数据定义后,应该可以有条件直接生成文档
    - ....

    太多了,很多时候使用一个东西时候就应该考虑到各个情况,如果项目中使用了一个有很多缺陷的东西,可能后面项目的推进都会被这个牵制
    ufologist
        12
    ufologist  
    OP
       2016-09-04 19:39:05 +08:00 via iPhone   2
    @int64ago 感谢你提出的这些顾虑,也引发了我的思考,希望和大家共同探讨下

    -----------------

    在做 puer-mock 的时候,我参考了很多接口规范和接口平台,主要是从 Swagger 和 RAP 那里获得的灵感,希望可以尽量简单的通过 JSON 配置来定义一个接口,并生成随机数据,继而形成一个标准的接口文档(谁说接口文档只能是 word 之类的)。

    如果形成了接口规范,我想后面的事情都是有可能的。

    > 应该有个平台
    puer-mock 目前比较适合中小型团队的前后端协作,因为是直接编写 JSON 文件做为接口文档的,因此需要双方都熟悉配置,对于技术团队没什么大问题,定义接口的方式也足够简单,基本上熟悉 HTTP 的,看一眼就明白这些接口的定义了。

    如果要更友好些,那就需要做一层 UI ,做一个系统,一个平台,通过可视化的手段来生成接口配置文件就好了。所以说定义好接口规范是最基础最重要的第一步, puer-mock 尝试做好这一步。

    > 平台的修改应该很容易反应到本地 Mock 数据
    puer-mock 支持修改了接口配置后马上生效,应该还是能够满足大部分需求的

    > Mock 生成的数据应该同时对 iOS/Android/... 都友好
    puer-mock 生成的 mock 没有针对某个客户端,属于后端接口规范,对客户端都是友好的,也没有任何侵入性

    > Mock 数据的定义应该可以自己插入一些简单逻辑
    puer-mock 后面是通过强大的 mock.js 来生成 mock 数据,因此针对"某个字段只返回 1-10 之间的数字"这样的需求是完全满足的。
    例如配置方式如下
    "field1": "@integer(1, 10)"

    > Mock 数据的定义应该考虑到可复用性
    puer-mock 在参考 Swagger 规范的时候就意识到了这个问题,但出于简单的考虑,暂时只能复制粘贴那些重复的 response 定义,这确实是埋了个坑,但对于中小型团队应该还好啦,有规范总比没有的好。关于这点, puer-mock 考虑以后是否通过 Swagger ref 的方式来引用预先定义好的数据结构,或者通过上层的接口平台来解决这个问题,将数据结构定义在接口平台,让接口平台来生成重复的数据结构引用,来避免手工复制粘贴造成数据结构出现潜在的不一致性问题

    > Mock 的管理应该区分用户权限
    这个不在 puer-mock 的考虑范围,上层的接口平台可以来做这个事情,这也是为什么越往后统一的接口平台越重要的原因,形成部门级公司级的协作流程

    > Mock 接口和数据定义后,应该可以有条件直接生成文档
    目前 puer-mock 内置了接口文档,可以在线查看,虽然还比较简陋,只是格式化展示了接口定义的 JSON 文件,做了分组便于查看。但根据接口定义的 JSON 输出接口文档完全是可以自定义的,所以想生成一份高大上的接口文档完全没有问题

    -----------------

    最后说下目前 puer-mock 已经在我厂中推行,有 3 个项目(小公司项目本来就不多啊,大家见笑了)使用了,定义了 50 多个后端接口,前端 /App 端 /后端都表示很实用,确实提高了工作效率
    WendellSun
        13
    WendellSun  
       2016-09-05 08:41:41 +08:00 via Android
    关注。
    leqoqo
        14
    leqoqo  
       2016-09-05 13:13:18 +08:00
    不错,已经用了,最开始是用的 mock.js+jsonserver 来实现的,找了好几个 最后找到了 puer-mock,前几天还想看看是不是完整的支持 rest, 想对 form 参数,进行一些过滤
    ufologist
        15
    ufologist  
    OP
       2016-09-05 17:54:42 +08:00   1
    @leqoqo puer-mock 的路由配置是完整支持 RESTful 的

    看到你想对 form 参数进行一些过滤, 是指什么? 是指对请求参数做一些验证吗?

    如果是这个功能, puer-mock 接下来的 1.2.0 版本即将支持这个功能

    例如:
    "request": {
    "querystring": {},
    "header": {},
    "body": {}
    }

    完整说明请参考 example/_mockserver.json
    https://github.com/ufologist/puer-mock/blob/master/example/_mockserver.json
    leqoqo
        16
    leqoqo  
       2016-09-05 20:07:25 +08:00
    @ufologist 谢谢,分页这个需求请求的是一个地址, 第一页:"POST /list" +"request": {
    "param": {"limit":20,"offset":0}, 第二页: "POST /list" +"request": {
    "param": {"limit":20,"offset":20} ,我希望 是 url+参数 来确定一个接口 我可以在 api 里 写两个同名的"POST /list"
    ufologist
        17
    ufologist  
    OP
       2016-09-05 21:45:45 +08:00 via iPhone
    @leqoqo 分页为什么需要定义两个接口呢?难不成需要第一页和第二页返回不同结构的数据?

    puer-mock 只验证客户端是否传入了必要的参数,不承担实际的业务逻辑,毕竟是 mock server ,不考虑实现很复杂的验证逻辑

    因此你可以这样定义接口
    "POST /list": {
    "request": { // 仅验证参数
    "body": {
    "limit": 20,
    "offset": 0
    }
    },
    "response": {
    "data": {
    "list|1-10": [{
    "id": "@id"
    }]
    }
    }
    }
    leqoqo
        18
    leqoqo  
       2016-09-06 11:07:39 +08:00
    @ufologist 确实是,我是用 puer-mock 做 iOS 的 mock Server,谢谢你的 puer-mock
    ufologist
        19
    ufologist  
    OP
       2016-09-14 17:07:12 +08:00
    @leqoqo 已经发布了 1.2.0 版本, 欢迎使用
    no13bus
        20
    no13bus  
       2016-09-15 23:58:29 +08:00
    最近公司也在搞前后端分离, 我一直在寻求提高工作效率的方法. NEi 在一些微信文章里面也看到了. 此外还了解到了契约测试, 还有淘宝 UED 那 6 篇比较出名的文章. 能和你 2 位交流交流吗? @ufologist @int64ago 留个微信号?
    ufologist
        21
    ufologist  
    OP
       2016-09-17 16:30:07 +08:00 via iPhone
    @no13bus 能够交流再好不过了,可以在 puer-mock 的项目中发 issue 来交流下
    ufologist
        22
    ufologist  
    OP
       2016-09-18 15:18:39 +08:00
    @no13bus

    关于 puer-mock 使用过程中的常见问题答疑
    https://github.com/ufologist/puer-mock/blob/master/FAQ.md
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2033 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:57 PVG 08:57 LAX 16:57 JFK 19:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86