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 · 11601 次点击
    这是一个创建于 2785 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前后端分离之后, 接口文档还不够, 以前是假数据时代, 现在 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  
       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   ·   我们的愿景   ·   实用小工具   ·   2706 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 05:16 · PVG 13:16 · LAX 22:16 · JFK 01:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.