1、Mock.js數據生成器
1.1 解決什么問題
問題:
前后端分離項目,前端和后端人員都是根據API文檔進行項目開發的,不應該直接相互依賴,前端人員不應該等待后端開發好接口再進行測試,既然不依賴后端接口,那么前端人員應該如何測試呢?
解決:
可以通過模擬數據生成器,通過一定規則(API文檔)生成模擬數據接口,提供給前端人員測試。
1.2 什么是Mock.js
-
Mock.js可以生成隨機數據,攔截Ajax請求。
-
通過攔截Ajax請求,根據模板生成並返回模擬數據,讓前端人員獨立於后端人員進行,幫助編寫單元測試。
-
Mock.js的作用:
-
前后端分離
讓前端開發人員獨立於后端進行開發。
-
增加單元測試的真實性
通過生成隨機模擬數據,模擬各種場景。
-
開發無入侵
不需要修改既有代碼,就可以攔截Ajax請求,返回模擬的響應數據。
-
用法簡單
符合直覺的接口。
-
數據類型豐富
支持隨機生成文本、數字、布爾值、日期、郵箱、鏈接、圖片、顏色等等。
-
方便拓展
支持拓展更多數據類型,支持自定義函數和正則。
-
1.3 安裝Mock.js
通過npm
命令就可以安裝Mock.js:
npm install mockjs
1.4 入門案例與語法規范
1.4.1 入門案例
需求:生成4條列表數據。
效果如下:
{
"menberList": [
{
"id": 1,
"name": "staryjie"
},
{
"id": 1,
"name": "staryjie"
},
{
"id": 1,
"name": "staryjie"
},
{
"id": 1,
"name": "staryjie"
}
]
}
編碼實現:
-
新建
E:\Gogs\VueProject\mockjs-demo
目錄,通過命令提示符窗口進入該目錄,初始化項目。npm init -y
-
安裝Mock.js
npm install mockjs
-
新建
demo1.js
,代碼如下:const Mock = require('mockjs') const data = Mock.mock({ //定義數據生成規則 'menberList|4': [{ 'id': 1, 'name': 'staryjie' }] }) console.log(JSON.stringify(data, null, 2))
-
運行該文件,查看效果
node .\demo1.js
1.4.2 語法規則
- Mock.js的語法規范包括兩部分
- 數據模板定義規范(Data Template Definition,DTD)
- 數據占位符定義規范(Data Placeholder Definition, DPD)
1.5 數據模板定義規范 DTD
數據模板中的每個屬性由3部分構成:屬性名、生成規則、屬性值:
// '屬性名|生成規則': 屬性值
'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
- 生成規則的含義需要依賴屬性值的類型才能定。
- 屬性值中可以含有
@占位符
。 - 屬性值指定了最終值的初始值和類型。
1.5.1 屬性值是字符串 String
'name|count': string
,通過重復string
生成一個字符串,重復次數等於``count`。'name|min-max': value
,通過重復string
生成一個字符串,重復次數大於等於min
,小於等於max
。
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
//定義數據生成規則
'menberList|4': [{
'id': 1,
'name|1-3': 'staryjie', // 隨機生成生成1-3個staryjie
'phone|11': '8', // String生成11個8
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.2 屬性值是數字 Number
'name|+1': number
,屬性值自動加1,初始值為``number`。'name|min-max': number
,生成一個大於等於min
、小於等於max
的整數,屬性值number
只是用來確定值的類型。'name|min-max.dmin-dmax': number
,生成一個浮點數,整數部分大於等於min
、小於等於max
,小數部分保留dmin
到dmax
位。
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重復'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.3 屬性值是布爾型 Boolean
'name|1': boolean
,隨機生成值為true
或者false
,兩者概率都是1/2。'name|min-max': value
,隨機生成一個布爾值,值為value
的概率為min / (min + max)
,值為!value
的概率為max / (min + max)
。
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重復'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的1-3位小數的數字
'status|1': true, // Boolean,生成true或false的概率都是1/2。
'open|2-4': true, // Boolean,生成true的概率是2/(2+4),生成false的概率是4/(2+4)
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.4 屬性值是對象 Object
'name|count': object
, 從屬性值object
中隨機選取count
個屬性。'name|min-max': object
,從屬性object
中隨機挑選min
到max
個值。
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重復'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的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: 999
}, // 在對象中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在對象中隨機抽取2-3個屬性進行返回
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.5 屬性值是數組 Array
'name|min-max': array
,通過重復屬性值array
生成一個新數組,重復次數大於等於min
,小於等於max
。'name|count': array
,通過重復屬性值array
生成一個新數組,重復次數為count
。
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|2-5': [{ // Array,隨機生成2-5個數組中的元素
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重復'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的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: 999
}, // 在對象中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在對象中隨機抽取2-3個屬性進行返回
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.5.6 值是正則表達式 RegExp
'name': regexp
,根據正則表達式regexp
反向生成可以匹配它的字符串。用於生成自定義格式的字符串。
注意:regexp是沒有引號的
代碼:
const Mock = require('mockjs')
const data = Mock.mock({
'memberList|4': [{
'id|+1': 1, // Number,自增1,初識值為1
'name|1-3': 'tcc', // String,隨機生成1-3個重復'tcc'
'phone|11': 1, // String,生成11個1
'age|1-120': 20, // Nmuber,隨機生成1-120之間的數字
'salary|6000-10000.1-3': 1, // Number,隨機生成6000-10000的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: 999
}, // 在對象中隨機抽取2個屬性進行返回
'order|2-3': {
id: 1,
name: '訂單1',
price: 999
}, // 在對象中隨機抽取2-3個屬性進行返回
'idCard': /\d{15}|\d{18}/ // 隨機生成15位或者18位的身份證號碼
}]
})
console.log(JSON.stringify(data, null, 2))
執行效果:
1.6 數據占位符定義規范 DPD
Mock.Random是一個工具類,用於生成各種隨機數據。
Mock.Random類中的方法在數據模板中成為{占位符},書寫格式為@占位符(參數 [, 參數])
。
占位符的格式為:
'屬性名': @占位符
Mock.Random類中提供的完整方法(占位符)如下:
Type(類型) | Method(占位符) |
---|---|
Basic | boolean , natural (自然數,大於等於 0 的整數), integer , float , character , string , range (整型數組) |
Date | date (年月日), time (時分秒), datetime (年月日時分秒) |
Image | image, dataImage |
Color | color |
Text | paragraph, sentence, word, title, cparagraph, csentence, cword, ctitle |
Name | first, last, name, cfirst, clast, cname |
Web | url, domain, email, ip, tld |
Address | area, region |
Miscellaneous | guid, id |
1.6.1 基本類型占位符
-
隨機生成基本數據類型的數據
常用占位符:
- 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))
-
執行效果:
1.6.2 日期占位符
-
隨機生成日期類型的數據
常用占位符:
- date/date(format)
- time/time(format)
- datetime/datetime(format)
-
代碼:
const Mock = require('mockjs') 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 }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.3 圖像占位符
-
隨機生成圖片地址,生成的地址在瀏覽器可以正常打開。
占位符:
- image
-
代碼:
const Mock = require('mockjs') 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', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.4 文本占位符
-
隨機生成一段文本
占位符:
- ctitle 隨機生成一句中文標題
- csentence(mix?, max?) 隨機生成一段中文文本
-
代碼
const Mock = require('mockjs') 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', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文本(8到12個字) }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.5 名稱占位符
-
隨機生成名稱。
占位符:
- first 英文名
- last 應為姓
- name 英文姓名
- cfirst 中文名
- clast 中文姓
- cname 中文姓名
-
代碼
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ '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', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文本(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.6 網絡占位符
-
隨機生成URL、域名、IP地址、郵件地址
占位符:
- url(protocol?, host?) 生成url
- protocol:協議,如
http
- host:域名和端口號,如
staryjie.com
- protocol:協議,如
- domain 生成域名
- ip 生成IP
- email 生成email地址
- url(protocol?, host?) 生成url
-
代碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ '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', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文本(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', 'url': '@url("https", "api.staryjie.com")', 'domain': '@domain', 'ip': '@ip', 'email': '@email', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果:
1.6.7 地址占位符
-
隨機生成區域、省市縣、郵政編碼
占位符:
- region 區域。如:華南。
- county(true) 省市縣。
- zip 郵政編碼。
-
代碼:
const Mock = require('mockjs') const data = Mock.mock({ 'empList|2': [{ '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', // 圖片地址 'title': '@ctitle(3, 6)', // 中文標題(3到6個字) 'content': '@csentence(8, 12)', // 一段中文文本(8到12個字) 'first': '@first', 'last': '@last', 'name': '@name', 'cfirst': '@cfirst', 'clast': '@clast', 'cname': '@cname', 'url': '@url("https", "api.staryjie.com")', 'domain': '@domain', 'ip': '@ip', 'email': '@email', 'area': '@region', 'address': '@county(true)', 'zipcode': '@zip', }] }) console.log(JSON.stringify(data, null, 2))
-
執行效果: