常见接口测试工具

  1. 插件类(可以在chrome应用商店下进行下载)
    • postman
    • DHC
    • REST client
  2. 平台类(浏览器访问,不用下载任何终端,但是不能请求本地接口)
    • Yapi
    • DOClever
    • RAP2
    • EasyMock
    • Swagger
  3. 终端类(需要下载软件)
    • postman
    • SoapUI
    • DOClever

mock作用:

  1. 模拟真实接口——实现效率开发,前后端同步,特别是分布式系统
  2. 模拟交互与全过程——有些开发场景非常难触发,还要一些异常逻辑、交互逻辑
  3. 全量数据测试极端情况——压力测试

mock数据工具:

  1. Yapi
  2. DOClever
  3. Easy Mock
  4. Fast Mock

Mock数据开发流程:

  1. 前端定义接口
  2. 完成静态页面
  3. 完成UI交互
  4. 对接真实数据
  5. 页面/逻辑测试
  6. 线上部署

如何部署DOsClever统一管理接口?

DOClever github网址

  1. 本地下载部署
  2. linux上使用docker进行部署
  3. 在线控制台

Mock.js

mockjs官方文档

github

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

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

基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
var Mock = require('mockjs')
var data = Mock.mock({
"string|1-10": "abc", //重复1-10次abc
"string|3": "abc", //重复3次abc
"number|+1": 202, //number每次加1
"number|1-100": 100, //number整数为1-100
"number|1-100.1-10": 1, //number整数为1-100,小数为1-10位
"number|123.1-10": 1, //number整数123,小数为1-10位
"number|123.3": 1, //number整数123,小数为3位
"number|123.10": 1.123, //number整数123,小数为10位
"boolean|1": true, //随机生成一个布尔值,true 和 false 的概率同样是 1/2
"boolean|1-2": true, //随机生成一个布尔值,值为 value 的概率是 min / (min + max),值为 !value 的概率是 max / (min + max)
//随机取其中2项
"object|2": {
"310000": "上海市",
"320000": "江苏省",
"330000": "浙江省",
"340000": "安徽省"
},
//随机取其中2-4项
"object|2-4": {
"110000": "北京市",
"120000": "天津市",
"130000": "河北省",
"140000": "山西省"
},
//随机取其中1项
"array|1": [
"AMD",
"CMD",
"UMD"
],
//取上次的后1项
"array|+1": [
"AMD",
"CMD",
"UMD"
],
//array数组包括1-10项,其中name每次取上次的后1项
"array|1-10": [{
"name|+1": [
"Hello",
"Mock.js",
"!"
]
}],
// 数组元素重复1-10次
"array|1-10": [
"Mock.js"
],
// 数组元素重复1-10次
"array|1-10": [
"Hello",
"Mock.js",
"!"
],
// name为函数返回值
'name': function() {
return this.foo
},
// 使用正则表达式随机生成字符串
'regexp': /[a-z][A-Z][0-9]/,
'regexp': /\w\W\s\S\d\D/,


// 用 @ 来标识其后的字符串是 占位符。
// 占位符 引用的是 Mock.Random 中的方法。
// 通过 Mock.Random.extend() 来扩展自定义占位符。
// 占位符 也可以引用 数据模板 中的属性。
// 占位符 会优先引用 数据模板 中的属性。
// 占位符 支持 相对路径 和 绝对路径。

// Random.boolean( min?, max?, current? )
// Random.boolean()
example: {
// 基础类
boolean1: '@boolean',
boolean2: '@boolean(1, 9, true)',

natural1: '@natural',
natural2: '@natural(10000)',
natural3: '@natural(1,10000)',

integer1: '@integer',
integer1: '@integer(10000)',
integer1: '@integer(1,10000)',

float1: '@float',
float2: '@float(0)',
float3: '@float(1,10000)', //Random.float( min, max )
float4: '@float(1,10000,3)', //Random.float( min, max, dmin )
float5: '@float(1,10000,3,5)', //Random.float( min, max, dmin, dmax )

character1: '@character("lower")',
character2: '@character("upper")',
character3: '@character("number")',
character4: '@character("symbol")',

string1: '@string("lower",5)',
string2: '@string("upper",5)',
string3: '@string("number",5)',
string4: '@string("symbol",5)',
string5: '@string(7, 10)',

array1: '@range(3, 7)',
array2: '@range(1, 10, 2)',

// 时间类
date1: '@date',
date2: '@date("yyyy-MM-dd")',
date3: '@date("yy-MM-dd")',
date4: '@date("y-MM-dd")',
date5: '@date("y-M-d")',

time1: '@time',
time2: '@time("A HH:mm:ss")',
time3: '@time("a HH:mm:ss")',
time4: '@time("HH:mm:ss")',
time5: '@time("H:m:s")',

datetime1: '@datetime',
datetime2: '@datetime("yyyy-MM-dd A HH:mm:ss")',
datetime3: '@datetime("yy-MM-dd a HH:mm:ss")',
datetime4: '@datetime("y-MM-dd HH:mm:ss")',
datetime5: '@datetime("y-M-d H:m:s")',

now1: '@now',
now2: '@now("yyyy-MM-dd HH:mm:ss SS")',

// 图片类
// Random.image()
// Random.image( size )
// Random.image( size, background )
// Random.image( size, background, text )
// Random.image( size, background, foreground, text )
// Random.image( size, background, foreground, format, text )
// Random.image('200x100', '#894FC4', '#FFF', 'png', '!')
images1: '@image("200x100")',
images2: '@image("200x100","#FF6600")',

// 颜色类
color: '@color',

// 文字类
// @cparagraph中文,@paragraph英文
paragraph1: '@paragraph',
paragraph2: '@paragraph(2)',
paragraph3: '@paragraph(1,3)',
// @csentence中文,@sentence英文
sentence1: '@sentence',
sentence2: '@sentence(2)',
sentence3: '@sentence(1,3)',
// @cword中文,@word英文
word1: '@word',
word2: '@word(2)',
word3: '@word(1,3)',
// @ctitle中文,@title英文
title1: '@title',
title2: '@title(2)',
title3: '@title(1,3)',

// 姓名类
first: '@first',
last: '@last',
name: '@name',
cfirst: '@cfirst',
clast: '@clast',
cname: '@cname',

// web类
url: '@url',
domain: '@domain',
protocol: '@protocol',
email: '@email',
ip: '@ip',


// 地址类
region: '@region',
province: '@province',
city1: '@city', // Random.city() "滁州市"
city2: '@city(true)', // Random.city( prefix ) "台湾 云林县"
county1: '@county', // Random.county()
county2: '@county(true)', // Random.county( prefix )
zip: '@zip', // 邮编

// helper类
// @capitalize
// @upper
// @lower
// @pick
// @shuffle
},

})

// 输出结果
console.log(JSON.stringify(data, null, 2))