Mock.js 数据生成器
解决了什么问题?
- 问题:前后端分离项目,前端和后端人员都是根据 API 文档进行开发项目的,不应该直接相互依赖, 前端人员不应该等 待后端开发好接口后再进行测试,既然不依赖后端接口,那前端人员应该如何测试呢?
- 解决:可以通过模拟数据生成器,通过一定规则 (API文档)生成模拟数据接口, 提供给前端人员进行测试
什么是Mock.js
官网:mockjs.com/
文档:github.com/nuysoft/Moc…
Mock.js 是用于生成随机数据,拦截 Ajax 请求。
通过拦截 Ajax 请求,根据数据模板生成并返回模拟数据,让前端攻城师独立于后端进行开发,帮助编写单元测试。
Mock.js 作用
- 前后端分离 让前端工程师独立于后端进行开发
- 增加单元测试得真实性 通过随机数据,模拟各种场景
- 开发无侵入 不需要修改已有代码,就可以拦截AJAX请求,返回模拟得响应数据
- 用法简单 符合直觉得接口
- 数据类型丰富 支持生成随机得文本,数字,布尔值,日期,邮箱,链接等
- 方便扩展 支持扩展更多数据模型,支持自定义函数和正则
安装Mock.js
在命令提示符窗口,用npm安装mock.js
- cnpm install mockjs
简单模板:如下
const data = Mock.mock({
'memberList|4': [
{
'id': 1,
'name': '发财'
}
]
})
// stringify(数据, 数据转换函数,缩进空格数)
console.log(JSON.stringify(data, null, 2))
//查看效果,执行命令 node demo1.js
3.4.2 语法规则
Mock.js 的语法规范包括两部分:
- 数据模板定义规范(Data Template Definition,DTD)
- 数据占位符定义规范(Data Placeholder Definition,DPD)
数据模板定义规范 DTD
属性名 和 生成规则 之间用竖线 | 分隔。
生成规则 是可选的,生成规则 有 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
- 'name|count': string
通过重复 string 生成一个字符串,重复次数等于 count 。 - 'name|min-max': string
通过重复 string 生成一个字符串,重复次数大于等于 min ,小于等于 max
代码
const data = Mock.mock({
'memberList|4': [
{
'id': 1,
'name|1-3': '发财', // String, 随机生成 1到3个重复发财
'phone|11': '8' // String, 生成 11 个 8
}
]
})
属性值是数字 Number
- 'name|+1': number
属性值自动加 1,初始值为 number 。 - 'name|min-max': number
生成一个大于等于 min 、小于等于 max 的整数,属性值 number 只是用来确定类型。 - 'name|min-max.dmin-dmax': number
生成一个浮点数,整数部分大于等于 min 、小于等于 max ,小数部分保留 dmin 到 dmax 位。
代码:
const data = Mock.mock({
'memberList|4': [
{
'id|+1': 1, // Number, 自增 1
'name|1-3': '发财', // String, 随机生成 1到3个重复发财
'phone|11': '8', // String, 生成 11 个 8
'age|1-120': 1, // Number, 随机生成 1到120
'salary|6000-8000.1-3': 0, // Number, 随机生成6000到8000, 有随机小数1到3位
}
]
})
属性值是布尔型 Boolean
- 'name|1': boolean
随机生成一个布尔值,值为 true 的概率是 1/2,值为 false 的概率同样是 1/2。 - 'name|min-max': value
随机生成一个布尔值,值为 value 的概率是 min / (min + max) ,值为 !value 的概率是 max / (min + max) 。
代码:
const data = Mock.mock({
'memberList|4': [
{
'id|+1': 1, // Number, 自增 1
'name|1-3': '小梦', // String, 随机生成 1到3个重复小梦
'phone|11': '8', // String, 生成 11 个 8
'age|1-120': 1, // Number, 随机生成 1到120
'salary|6000-8000.1-3': 0, // Number, 随机生成6000到8000, 有随机小数1到3位
'status|1': true, // Boolean, 生成 true 或 false 概率都是 1/2
'open|2-4': true, // Boolean, 生成 true 概率 2/(2+4), false 概率 4/(2+4)
}
]
})
属性值是对象 Object
- 'name|count': object
从属性值 object 中随机选取 count 个属性。 - 'name|min-max': object
从属性值 object 中随机选取 min 到 max 个属性。
代码:
const data = Mock.mock({
'memberList|4': [
{
'id|+1': 1, // Number, 自增 1
'name|1-3': '小梦', // String, 随机生成 1到3个重复小梦
'phone|11': '8', // String, 生成 11 个 8
'age|1-120': 1, // Number, 随机生成 1到120
'salary|6000-8000.1-3': 0, // Number, 随机生成6000到8000, 有随机小数1到3位
'status|1': true, // Boolean, 生成 true 或 false 概率都是 1/2
'open|2-4': true, // Boolean, 生成 true 概率 2/(2+4), false 概率 4/(2+4)
'order|2': { id: 1, name: '订单1', price: 68.8 }, // 随机取对象中的2个属性
'order2|2-3': { id: 1, name: '洗发水', price: 68.8 }, //对象中的2到3个属性
}
]
})
属性值是数组 Array
- 'name|min-max': array
通过重复属性值 array 生成一个新数组,重复次数大于等于 min ,小于等于 max 。 - 'name|count': array
通过重复属性值 array 生成一个新数组,重复次数为 count 。
代码:
const data = Mock.mock({
'memberList|2-5': [ // Array, 随机生成数组中的元素 2到5 个
{
'id|+1': 1,
'name|1-3': '小梦',
'phone|11': '8',
'age|1-120': 1,
'salary|6000-8000.1-3': 0
'status|1': true,
'open|2-4': true,
'order|2': { id: 1, name: '订单1', price: 68.8 },
'order2|2-3': { id: 1, name: '订单2', price: 68.8 },
}
]
})
值是正则表达式 RegExp
- 'name': regexp
根据正则表达式 regexp 反向生成可以匹配它的字符串。用于生成自定义格式的字符串。 注意 regexp 是没有引号的
代码:
const data = Mock.mock({
'memberList|2-5': [ // Array, 随机生成数组中的元素 2到5 个
{
'id|+1': 1, // Number, 自增 1
'name|1-3': '小梦', // String, 随机生成 1到3个重复小梦
'phone|11': '8', // String, 生成 11 个 8
'age|1-120': 1, // Number, 随机生成 1到120
'salary|6000-8000.1-3': 0, // Number, 随机生成6000到8000, 有随机小数1到3位
'status|1': true, // Boolean, 生成 true 或 false 概率都是 1/2
'open|2-4': true, // Boolean, 生成 true 概率 2/(2+4), false 概率 4/(2+4)
'order|2': { id: 1, name: '订单1', price: 68.8 }, // 随机取对象中的2个属性
'order2|2-3': { id: 1, name: '订单2', price: 68.8 }, //对象中的2到3个属性
'idCard': /\d{15}|\d{18}/ // 随机生成身份证号, 注意:正则表达式没有单引号 ''
}
] })
数据占位符定义规范 DPD
Mock.Random 是一个工具类,用于生成各种随机数据。
Mock.Random 类中的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) 。 占位符 的格式为:
'属性名':@占位符
Type(类型) Method(占位符)
- Basic
boolean , natural (自然数,大于等于 0 的整数), integer , float , character , string ,range (整型数组),
- Date
date (年月日), time (时分秒), datetime (年月日时分秒)
- Image
image, dataImage
- Color
color
5.Text
paragraph, sentence, word, title, cparagraph, csentence, cword, ctitle
6.Name
first, last, name, cfirst, clast, cname
- Web
url, domain, email, ip, tld
8.Address
area, region
- Helper
capitalize, upper, lower, pick, shuffle
- Miscellaneous
guid, id
基本类型占位符
- 随机生成基本数据类型的数据。
常用的占位符:natural/integer/string/float/boolean
代码:
const Mock = require('mockjs')
const data = Mock.mock({
'empList|3': [{
'id|+1': 1,
'name': '@string',
'price': '@float',
'status': '@boolean',
}]
})
console.log( JSON.stringify(data, null, 2))
日期占位符
- 随机生成日期类型的数据,
占位符:
date/date(format)
time/time(format)
datetime/datetime(format)
代码:
const data = Mock.mock({
'empList|3': [{
'id|+1': 1,
'name': '@string',
'price': '@float',
'status': '@boolean',
'birthday': '@date', // 默认 yyyy-MM-dd
'entryDate': '@date("yyyy/MM/dd")', // 指定日期格式 yyyy/MM/dd
'createDate': '@datetime', // 默认 yyyy-MM-dd HH:mm:ss
'updateDate': '@datetime("yyyy/MM/dd HH:mm:ss")' //默认yyyy/MM/dd HH:mm:ss
}]
})
图像占位符
- 随机生成图片地址, 生成的浏览器可以打开
占位符: image
代码:
const data = Mock.mock({
'empList|3': [{
'id|+1': 1,
'name': '@string',
'price': '@float',
'status': '@boolean',
'birthday': '@date', // 默认 yyyy-MM-dd
'entryDate': '@date("yyyy/MM/dd")', // 指定日期格式 yyyy/MM/dd
'createDate': '@datetime', // 默认 yyyy-MM-dd HH:mm:ss
'updateDate': '@datetime("yyyy/MM/dd HH:mm:ss")', //默认yyyy/MM/dd HH:mm:ss
'pic': '@image',
}]
})
文本占位符
- 随机生成一段文本
占位符:
ctitle 随机生成一句中文标题。
csentence(mix?, max?) 随机生成一段中文文本
名称占位符
- 随机生成名称。
占位符:
first 英文名。
last 英文姓。
name 英文姓名。
cfirst 中文名。
clast 中文姓。
cname 中文姓名
代码:
const data = Mock.mock({
'empList|3': [{
'id|+1': 1,
'name': '@cname', //中文姓名
'price': '@float',
'status': '@boolean',
'birthday': '@date', // 默认 yyyy-MM-dd
'entryDate': '@date("yyyy/MM/dd")', // 指定日期格式 yyyy/MM/dd
'createDate': '@datetime', // 默认 yyyy-MM-dd HH:mm:ss
'updateDate': '@datetime("yyyy/MM/dd HH:mm:ss")', //默认yyyy/MM/dd HH:mm:ss
'pic': '@image', // 图片地址
'title': '@ctitle(3, 6)', // 中文标题(3到6个字)
'content': '@csentence(8, 12)', // 一段中文文本(8到12个字)
'first': '@cfirst', // 中文名
'last': '@last', // 英文姓
}]
})
地址占位符
- 随机生成区域、省市县、邮政编码
占位符:
region 区域。如: 华南
county(true) 省市县。
zip 邮政编码。
代码:
const data = Mock.mock({
'empList|3': [{
'id|+1': 1,
'name': '@cname', //中文姓名
'price': '@float',
'status': '@boolean',
'birthday': '@date', // 默认 yyyy-MM-dd
'entryDate': '@date("yyyy/MM/dd")', // 指定日期格式 yyyy/MM/dd
'createDate': '@datetime', // 默认 yyyy-MM-dd HH:mm:ss
'updateDate': '@datetime("yyyy/MM/dd HH:mm:ss")', //默认yyyy/MM/dd HH:mm:ss
'pic': '@image', // 图片地址
'title': '@ctitle(3, 6)', // 中文标题(3到6个字)
'content': '@csentence(8, 12)', // 一段中文文本(8到12个字)
'first': '@cfirst', // 中文名
'last': '@last', // 英文姓
'url': '@url("http", "mengxuegu.com")', // URL
'domain': '@domain', // 域名
'ip': '@ip', // IP
'email': '@email', // 邮箱地址
'area': '@region', // 区域
'address': '@county(true)', // 省市县
'zipCode': '@zip' // 邮政编码
}]
})
EasyMock数据接口
1.什么是EasyMock
Easy Mock 是一个可视化,并且能快速生成模拟数据的服务。是杭州大搜车无线团队出品的一个极其简单、高效、
可视化、并且能快速生成模拟数据的在线 Mock 服务 。
现在 Easy Mock 内置了 Mock.js,我们可以更愉快的伪造数据了。
官网:www.easy-mock.com/
文档:www.easy-mock.com/docs
2.EasyMock基本使用
登录或注册
访问 www.easy-mock.com 后,点击 开始 后输入用户名和密码。如果不存在会自动注册。
注意:没有找回密码功能,请牢记密码!