介绍

前后端分离项目,前端和后端人员都是根据 API 文档进行开发项目的,不应该直接相互依赖, 前端人员不应该等待后端开发好接口后再进行测试,既然不依赖后端接口,那前端人员应该如何测试呢?

可以通过模拟数据生成器,通过一定规则 (API文档)生成模拟数据接口, 提供给前端人员进行测试。

官网:http://mockjs.com/

文档:https://github.com/nuysoft/Mock/wiki

Mock.js 是用于生成随机数据,拦截 Ajax 请求。通过拦截 Ajax 请求,根据数据模板生成并返回模拟数据,让前端攻城师独立于后端进行开发,帮助编写单元测试。

Mock.js 作用:

  • 前后端分离:让前端攻城师独立于后端进行开发。
  • 增加单元测试的真实性:通过随机数据,模拟各种场景。
  • 开发无侵入:不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据。
  • 用法简单
  • 数据类型丰富:支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。
  • 方便扩展:支持扩展更多数据类型,支持自定义函数和正则。
安装
npm install mockjs

简单使用

需求:生成 6 条列表数据。

创建一个mock.js的文件,写入如下代码

const Mock = require('mockjs')  // 导入mock
const data = Mock.mock({
    // 定义数据生成规则
    'memberList|6': [  // 管道符|后面的6表示生成6条数据
        {
            'id':1,
            'name': '邹邹'
        }
    ]
})
console.log(data) // 打印数据

这样写浏览器无法帮我们解析,可以在mock.js目录下执行node mock.js

Vue--MockJs

 我们也可以让格式化后显示,更改最后一行

const Mock = require('mockjs')  // 导入mock
const data = Mock.mock({
    // 定义数据生成规则
    'memberList|6': [  // 管道符|后面的6表示生成6条数据
        {
            'id':1,
            'name': '邹邹'
        }
    ]
})
console.log( JSON.stringify(data, null, 2)) // stringfy(数据,数据转换函数,缩进空格数)

Vue--MockJs

上面生成的4条数据是一样的,如果希望它按一定规律生成随机数据,就需要按 Mock.js 的语法规范来定义。

Mock.js 的语法规范包括两部分:

  • 1. 数据模板定义规范(Data Template Definition,DTD)
  • 2. 数据占位符定义规范(Data Placeholder Definition,DPD)

数据模板定义规范 DTD

 数据模版中的每个属性 由三部分构成:属性名,生成规则,属性值。

// '属性名|生成规则': 属性值
'name|rule': value

注意:

  • 属性名和生成规则之间用管道符 | 分割。
  • 生成规则是可选的,生成规则有7种格式
'name|min-max': value
'name|count': value
'name|min-max.dmin-dmax': value
'name|min-max.dcount': value
'name|count.dmin-dmax': value
'name|count.dcount': value
'name|+step': value

生成规则 的 含义 需要依赖 属性值的类型 才能确定。

属性值 中可以含有  @占位符 。属性值 指定了最终值的初始值和类型。

属性值是字符串 String

1. 'name|count': string

通过重复 string 生成一个字符串,重复次数等于 count 。

2. 'name|min-max': string

通过重复 string 生成一个字符串,重复次数大于等于 min ,小于等于 max 。

属性值是数字 Number

1. 'name|+1': number

属性值自动加 1,初始值为 number 。

2. 'name|min-max': number

生成一个大于等于 min 、小于等于 max 的整数,属性值 number 只是用来确定类型。

3. 'name|min-max.dmin-dmax': number

生成一个浮点数,整数部分大于等于 min 、小于等于 max ,小数部分保留 dmin 到 dmax 位。

属性值是布尔型 Boolean

1. 'name|1': boolean

随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。

2. 'name|min-max': value

随机生成一个布尔值,值为 value 的概率是 min / (min + max) ,值为 !value 的概率是 max / (min + max) 。

属性值是对象 Object

1. 'name|count': object

从属性值 object 中随机选取 count 个属性。

2. 'name|min-max': object

从属性值 object 中随机选取 min 到 max 个属性。

属性值是数组 Array

1. 'name|min-max': array

通过重复属性值 array 生成一个新数组,重复次数大于等于 min ,小于等于 max 。

2. 'name|count': array

通过重复属性值 array 生成一个新数组,重复次数为 count 。

属性值是正则表达式 RegExp

. 'name': regexp

根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串。

注意 regexp 是没有引号的

const Mock = require('mockjs')  // 导入mock
const data = Mock.mock({
    // 定义数据生成规则
    'memberList|6': [  // 管道符|后面的6表示生成6条数据
        {
            'id|+1':2,  // 自增长1,初始值为2
            'name|1-3': '邹邹', // 随机生成1-3个重叠邹邹
            'job|2': 'IT',  // 生成两个IT
            'age|1-120': 1,  // 随机生成1-120之间的整数
            'salary|6000-8000.1-3':1 ,  // 随机生成6000到8000之间的数字,并且小数部分是1到三位,后面的1只是说明是number型
            'status|1': true,  // 随机生成true或false,并且概率都是1/2
            'open|2-4':false, // 生成的概率。true的概率为4/(2+4),false的概率2(2+4)
            'order|2':{id:1,name:'小微',age:18}, // 在对象中随机生成两个属性进行返回
            'orde2|2-3':{id:1,name:'小微',age:18}, // 在对象中随机生成两个或三个属性进行返回 
            'idCard': /\d{15}|\d{18}/  // 指定正则表达式,当前生成省份证号,注意,不要用单引号引起来
        }
    ]
})
console.log( JSON.stringify(data, null, 2)) // 打印数据
{
  "memberList": [
    {
      "id": 2,
      "name": "邹邹邹邹",
      "job": "ITIT",
      "age": 120,
      "salary": 6507.56,
      "status": true,
      "open": true,
      "order": {
        "name": "小微",
        "age": 18
      },
      "orde2": {
        "name": "小微",
        "age": 18,
        "id": 1
      },
      "idCard": "019559495798340"
    },
    {
      "id": 3,
      "name": "邹邹",
      "job": "ITIT",
      "age": 112,
      "salary": 6911.3,
      "status": false,
      "open": false,
      "order": {
        "name": "小微",
        "age": 18
      },
      "orde2": {
        "name": "小微",
        "age": 18
      },
      "idCard": "363103436670144776"
    },
    {
      "id": 4,
      "name": "邹邹邹邹",
      "job": "ITIT",
      "age": 89,
      "salary": 7028.76,
      "status": false,
      "open": false,
      "order": {
        "age": 18,
        "name": "小微"
      },
      "orde2": {
        "age": 18,
        "name": "小微"
      },
      "idCard": "484071382771567"
    },
    {
      "id": 5,
      "name": "邹邹邹邹",
      "job": "ITIT",
      "age": 39,
      "salary": 6427.85,
      "status": true,
      "open": true,
      "order": {
        "name": "小微",
        "age": 18
      },
      "orde2": {
        "age": 18,
        "id": 1
      },
      "idCard": "946240463874191"
    },
    {
      "id": 6,
      "name": "邹邹",
      "job": "ITIT",
      "age": 65,
      "salary": 7635.88,
      "status": false,
      "open": true,
      "order": {
        "name": "小微",
        "id": 1
      },
      "orde2": {
        "age": 18,
        "name": "小微",
        "id": 1
      },
      "idCard": "241267827845265523"
    },
    {
      "id": 7,
      "name": "邹邹邹邹",
      "job": "ITIT",
      "age": 99,
      "salary": 6071.23,
      "status": true,
      "open": false,
      "order": {
        "age": 18,
        "id": 1
      },
      "orde2": {
        "name": "小微",
        "id": 1,
        "age": 18
      },
      "idCard": "122687462329326"
    }
  ]
}
生成的结果

相关文章: