分享一个简单强大的生成测试数据的工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qiu8310
V2EX    Node.js

分享一个简单强大的生成测试数据的工具

  •  
  •   qiu8310 2015-04-28 07:40:01 +08:00 7466 次点击
    这是一个创建于 3825 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址

    源码地址

    在线演示

    背景

    • 前端程序员会因为后端没有接口数据,开发某些功能可能就不太方便
    • 后端程序员常会被前端程序员催促给接口,给数据

    用 yod-mock 解决

    使用它非常简单

    • 第一步定义结构类型:yod.type('xxx', {...})
    • 第二步使用你定义的类型生成随机的数据:yod('@xxx.repeat(10)')

    可以看个 DEOM

    // 定义一个用户类型 yod.type('User', { firstName: '@First', myFirstNameLength: '@Self.firstName.length', lastName: '@Last', '@Self.lastName': 'is my family name', fullName: '@Self.firstName @Self.lastName', nickName: '@Nick', chineseName: '@ChineseName', age: '@Age(adult)', to100: '` 100 - @Self.age `', telephone: '@Tel', avatar: '@Avatar', others: { words: 'My name is @Parent.fullName, call me @Parent.nickName.', bestFriends: '@Nick.repeat(2, 3).join(", ")', favouriteLetter: '@([A, B, C]).sample' } }); // 重复生成 2 - 4 个用户 console.log(yod('@User.repeat(2, 4)')); 

    它会用你定义的 User 结构体去生成一个数组,包含 2-4 个 User

    你可以在线查看或修改上面的 DEMO

    yod-mock 的主要特点

    • 语法简洁,学习成本低,功能强大
    • 支持所有 JS 原生的函数
    • 支持所有 lodash 的函数
    • 支持处定义新的 type 和 modifier
    • 支持配置系统现有的数据(使用 yod.config('system.xxx', ...) )
    • 支持在浏览器、NodeJS 或 命令行上使用
    24 条回复    2015-06-06 15:02:01 +08:00
    endoffight
        1
    endoffight  
       2015-04-28 07:42:16 +08:00 via Android
    下次前端再催我,我就给他看这个
    qiu8310
        2
    qiu8310  
    OP
       2015-04-28 10:48:33 +08:00
    @endoffight 哈哈,赞。不过记得要先由后台确认好数据的结构。
    kepenj
        3
    kepenj  
       2015-04-28 12:17:47 +08:00
    下次后端在没有,我就给他看这个
    lincanbin
        4
    lincanbin  
       2015-04-28 12:26:11 +08:00
    以前我就是这样的,先放一些假数据给前端用着先直接按照文档放数据上去。
    另外node.js作为后端,在国内并不多见。
    Mcatt
        5
    Mcatt  
       2015-04-28 12:48:47 +08:00
    好东西,下次试用一下
    qiu8310
        6
    qiu8310  
    OP
       2015-04-28 13:20:41 +08:00
    @lincanbin 嗯,是的,这是个问题。

    不过此版本是支持游览器上直接 Mock 数据的,不需要后台,如果用 jquery 可以用它自带的 ajaxBefore 劫持请求,生成 mock 数据。

    另外,我是有计划写个后端的网站程序来支持此工具。
    Nick
        7
    Nick  
       2015-04-28 13:45:06 +08:00
    躺着被@
    whwei
        8
    whwei  
       2015-04-28 13:51:19 +08:00
    写过一个响应指定数据的服务器,正好缺这样一个工具产生 mock 数据,感觉 LZ 这个比 mockjs 简单直接好多。。已 star。
    qiu8310
        9
    qiu8310  
    OP
       2015-04-28 14:21:54 +08:00
    @whwei 我就是用 mockjs 不爽才想到自己写一个的。 你的的响应指定数据的服务器是 open sourced 的吗?
    qiu8310
        10
    qiu8310  
    OP
       2015-04-28 14:22:53 +08:00
    @Nick 哈哈。。。说明你更应该用它
    fising
        11
    fising  
       2015-04-28 14:25:01 +08:00
    Fiddler 不就行了么
    zlexdl
        12
    zlexdl  
       2015-04-28 14:44:25 +08:00
    看样子挺好的,暂时用不上,给你一个星,留着以后用。
    whwei
        13
    whwei  
       2015-04-28 14:50:09 +08:00
    @qiu8310 是,其实就是一个 express 写的服务器,因为就自己用用,文档什么都还没写。https://github.com/whwei/mockserver
    thisnull
        14
    thisnull  
       2015-04-28 23:55:48 +08:00
    正好需要这个.
    qiu8310
        15
    qiu8310  
    OP
       2015-04-29 07:29:49 +08:00
    @whwei 谢谢,可以参考下。 我后期打算做个类似的服务端放到 heroku 或 bae 上给普通用户用,这样他们可以直接 ajax 请求远程服务,就不用在本地 mock 了。

    不过最近太忙了,不知道什么时候可以腾出时间来做。
    qiu8310
        16
    qiu8310  
    OP
       2015-04-29 07:32:06 +08:00
    @fising fiddler 还是需要你手动定义好替换文件吧,它的文件内容只有你改动才会变化。

    用 yod-mock 生成的内容都是随机变化的,而且接近真实数据(我是爬了一些论坛的数据)。
    qiu8310
        17
    qiu8310  
    OP
       2015-05-01 08:00:06 +08:00
    更新了一个版本,添加了测试,并且修复了上一个版本中的一些很明显的问题!
    UG1u8zhQxhvqXNrk
        18
    UG1u8zhQxhvqXNrk  
       2015-06-03 23:35:15 +08:00
    yod.type('User', {
    firstName: '@First',
    lastName: '@Last',
    sex: '@Sex',
    fullName: '@Self.firstName @Self.lastName',
    nickName: '@Nick',
    chineseName: '@ChineseName',
    age: '@Age(adult)',
    to100: '` 100 - @Self.age `', // 执行 JS 语句
    telephone: '@Tel',
    avatar: '@Avatar',
    others: {
    words: 'Hello, my name is @Parent.fullName, you can call me @Parent.nickName.',
    bestFriends: '@Nick.repeat(2, 3).join(", ")',
    myFirstNameLength: '@Parent.firstName.length',
    favouriteLetter: '@([A, B, C]).sample',
    nc:{nike:['@Nick']}
    }
    });

    @qiu8310 处理这样的结构 nc:{nike:['@Nick']} 会出问题,不知道什么情况
    qiu8310
        19
    qiu8310  
    OP
       2015-06-05 16:55:24 +08:00
    @burgleaf 我测试没有问题,你复制到 [http://qiu8310.github.io/yod-mock/](http://qiu8310.github.io/yod-mock/) 这里看下
    qiu8310
        20
    qiu8310  
    OP
       2015-06-05 16:56:18 +08:00
    @burgleaf url 写错了,以为它用了 markdown,重发一下地址: http://qiu8310.github.io/yod-mock/
    UG1u8zhQxhvqXNrk
        21
    UG1u8zhQxhvqXNrk  
       2015-06-05 21:55:42 +08:00   1
    yod.type('User', {
    firstName: '@First',
    lastName: '@Last',
    sex: '@Sex',
    fullName: '@Self.firstName @Self.lastName',
    nickName: '@Nick',
    chineseName: '@ChineseName',
    age: '@Age(adult)',
    to100: '` 100 - @Self.age `', // 执行 JS 语句
    telephone: '@Tel',
    avatar: '@Avatar',
    others: {
    words: 'Hello, my name is @Parent.fullName, you can call me @Parent.nickName.',
    bestFriends: '@Nick.repeat(2, 3).join(", ")',
    myFirstNameLength: '@Parent.firstName.length',
    favouriteLetter: '@([A, B, C]).sample',
    nc:[{nike:'@Nick'},{cName:'@ChineseName'}]
    }
    });


    // 重复生成 2 - 4 个用户
    console.log(yod({
    status: 'ok',
    list: '@User.repeat(2, 4)'
    }))


    是这样有问题。。nc:[{nike:'@Nick'},{cName:'@ChineseName'}] 我也发错了
    UG1u8zhQxhvqXNrk
        22
    UG1u8zhQxhvqXNrk  
       2015-06-05 21:56:12 +08:00
    Nick
        23
    Nick  
       2015-06-05 22:35:59 +08:00 via iPhone
    又躺着被@ T_T
    qiu8310
        24
    qiu8310  
    OP
       2015-06-06 15:02:01 +08:00
    @burgleaf 谢谢指出问题,是我没处理数组中的对象,已经更新了,你可以看 http://qiu8310.github.io/yod-mock/

    你只要删除现在的 yod-mock 模块,重新安装即可(yod-mock 的代码没改,主要是改了它的核心模块 https://github.com/qiu8310/yod 的代码)

    PS: 有什么好的建议随时可以告诉我!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6355 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 02:27 PVG 10:27 LAX 19:27 JFK 22:27
    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