前端开发,需要和后台联调;很多时候,前端开发并不需要等后台完全写好接口在去联调,自己可以写死数据,渲染数据,加样式。后台人员有时会很忙,他没有时间写好返回所有的数据等等,特别是新开一个项目,从零开始的那种,前端要是等后台写好,开发效率就不高了。所以自己造数据很重要。有一段时间,我每天早上来就催后台给我开服务器,应该不开的话,代码不好写,效率不快,会影响每天的任务的,影响了的话就要苦逼的加班。

我做过一个项目,进件新增编辑的,表单字段,一个表单页面有20~30来个字段,填写完最快都要半首歌的时间,页面刷新又得重新填,又得花那个时间。后来同事小强建议写死一个json数据自动填写,填都不用填了。其实省下不少时间。突然间我就意识到写假数据对于一个前端来说,挺重要,可以节省时间,多出来的时间,可以休息,测试项目的功能或者学习新东西。

在上一家体育公司中,我写了一个体测数据的页面,一个页面很长,密密麻麻的全是体测的数据。记得当时页面的每一部分的数据,我都是用同一个数据,其实这样子不好,因为页面需要的最终数据(比如文字的长度,是否符合该字段正则表达式等等)和写的假数据有时很大出入,会影响页面效果的。如果有问题,你就要重新写样式,加班加点。之前写过一个大屏直播的页面,用户的那个名称,一般人都是2到3个汉字,所以我自然没有考虑到4个汉字的名称,结果悲剧了,真有4个字的人名,然后那一块样式排版乱掉,我又得改。这种场景就需要一个js工具帮我随机生成2到4字的名字。



上图为2019年的工作环境

研究了一个专门造假数据的库,叫mock。其实这个东西我在2018年的年初就已经知道了,有一次面试,面试官问过这个问题(结果是流泪的),后来只不过看了2天的官方文档,就让它在一边吃灰,因为在上一家体育公司的项目中应用场景不多。最近项目闲下来,我花了1天的时间(其实就是半天)写了一个工具类js,方便自己以后在新开项目时或者特别需要假数据时使用。

mock有两个好处:1. 随机的生成假数据,每次页面刷新都不一样;2. 它可以拦截ajax请求,就是说当你定义在mock里面的接口路径和真实的后台接口路径一样时,前者就把后者拦截。

代码如下面所示哈:

import Mock from 'mockjs';
let Random = Mock.Random; //枚举的工具对象
//其实就是`map`方法遍历一个数组,生成一个数组和一个`code`数组,`code`和新数组的序号是一致的,所以就可以轻易的输入`code`拿到想要的值
class EsEnum {
constructor(arr) {
let typeArr = [];
if (!Array.isArray(arr)){
throw 'arr is not an array!';
return;
} arr.map(element => {
if(!element.code || !element.name) {
return;
}
// 保存code值组成的数组,方便A.getName(name)类型的调用
typeArr.push(element.code);
// 根据code生成不同属性值,以便A.B.name类型的调用
this[element.code] = element;
}); // 保存源数组
this.arr = arr;
this.typeArr = typeArr;
} // 根据code得到对象
valueOf(code) {
return this.arr[this.typeArr.indexOf(code)];
} // 根据code获取name值
getNameByCode(code){
let prop = this.valueOf(code);
if (!prop){
throw 'No enum constant' + code;
return;
} return prop.name;
} // 返回源数组
getValues() {
return this.arr;
}
} // 配置拦截 ajax 的请求时的行为,支持的配置项目有 timeout。
Mock.setup({
timeout: '200 - 400'
}) //接口api
/**
* * @description: 通用工具类
* * @author: StephenWu5
* * @paras 接口链接,接口类型,返回数据结构,返回数据的长度
* * @date: 2019-12-3 15:38:27
*/
export const createApiByMock = function(apiUrl,apiType,paraSet) {
let data = []; //等下要返回的数据
let returnData ={};
let dataLength = paraSet.dataLength || 10; for (let i = 0; i < dataLength; i++) {
let images = [1,2,3].map(x=>Random.image('200x100', Random.color(), Random.word(2,6))); //随机成长3个图片信息 尺寸 颜色 和随机字母的数组
let paraSetNew = JSON.parse(JSON.stringify(paraSet))
let dataTypeEnum = new EsEnum([
//==============================================配置的开始==========================================================
{code: '0', i}, //id 唯一性
{code: '1', name: Random.cname()}, //中文姓名 cfirst 模拟姓氏 clast 模拟名字 name 英文名字
{code: '2', name: Random.cword(8,20)}, //标题 8和20是长度
{code: '3', name: Random.integer(100,5000)}, // 100到5000的随机整数 natural 返回随机的自然数
{code: '4', name: images.slice(0,Random.integer(1,3))},//截取随机一到三个图片
{code: '5', name: Random.image('200x100', '#4A7BF7', 'picture')}, //模拟图片 宽高不指定则随机
{code: '6', name: Random.date()}, //日期 yyyy-MM-dd yyyy-mm-dd是指定格式
{code: '7', name: Random.time()}, //时间
{code: '8', name: Random.province()}, //省
{code: '9', name: Random.city()}, //市 Mock.mock('@city(true)') 加参数true会有奇效哈
{code: '10', name: Random.county()}, //区 Mock.mock('@county(true)')
{code: '11', name: Mock.mock('@EMAIL()')}, //邮箱
{code: '12', name: Mock.mock(/^1[0-9]{10}$/)}, //手机(座机) 这里可以正则
{code: '13', name: Mock.mock('13531544954')}, //身份证 Mock.mock({ code: '14', "name|1":['精品语文班','精品作业A班','英语班','语文班']}), //身份证包括一切的枚举,使用率最高 {code: '21', name: Random.csentence(5, 10)}, //生成一条随机的中文句子
{code: '22', name: Random.cparagraph(0, 10)}, //随机生成0到10段句子
{code: '23', name: Random.url()}, //url
{code: '24', name: Random.ip()}, //ip
//==============================================配置的结束==========================================================
])
for(let key in paraSetNew){
if(!key){
return;
}
if(key === 'dataLength'){
continue;
}
paraSetNew[''+key] = dataTypeEnum[""+paraSet[""+key]]['name']
} delete paraSetNew.dataLength; //就看你想不想留dataLength;
data.push(
//{allData: (dataTypeEnum)}, //这里就是精华所在哈
paraSetNew
)
} //利用assign添加默认值 status message
returnData = Object.assign({
status: 200,
message: 'success',
length: data.length,
}, {data}); // Mock.mock( url, post/get , 返回的数据);
Mock.mock(apiUrl,apiType, returnData); // 获取验证码
}

使用就是新建一个js文件,把它导入到项目中,使用如下:

这一步只是在项目注册这个api,还要写一个调用该api的方法才可以。真有一个下午,就是今天,我在项目中引入这个工具类,也注册了,看不到效果,我以为是这两个地方写错了,找来找去,原来是缺了调用该api的方法(就是最后一步下方的代码)。半小时就这样折腾没了。西湖啊,我的泪。

import {createApiByMock} from './mock';

//使用实例   dataLength 是返回数组的长度哈
let paraSet = {
name: 1,
age: 3,
dataLength: 10
}
createApiByMock('http://localhost:8080/getMockData','get',paraSet);

最后一步,调用该api

其实这个代码和mock无关,只不过我的接口名和项目的不一样,所以就写成这样子。

//得到mock数据,
export const getMockData = (data) => Request.get(`/getMockData`, data, createHeader());

这样子就可以快速拿到自己想要的数据,简单。需要特别注意的是,和mock相关的代码,特别是第2部分的代码,生产,测试环境不能提交,要是不小心提交了,领导会很生气的,他会让你不能下班或者不上班,所以还需要在项目中加上环境判断的代码,决定是否使用注册api那部分的代码哈。

写到这里,我突然感觉,那些vuejqueryreact其实就是和我这个js是类似的啊,只不过前者就是很多技术大佬写出来,维护,功能强大,可以做很多事情,文件体积大,经过了单元测试,使用的话不会出什么问题;而我这个体积小,功能单一,只能做一件事情,比较辣鸡。前者是优秀电视剧《甄嬛传》的话,后者就是抖音短视频。前者后者只不过都是前端工程师开发的工具,让我们快速的写页面,和那些ppt模版,编辑器vscode,vim没有什么两样都属于工具来的,类似父亲的泥水刀,农民耕田用的水牛,厨师的菜刀。

以后有空闲的话,再搞axiosutils,vue组件echart等几个常用的工具类出来吧。方便你我她他它使用,顺便假装大佬哈哈哈哈哈哈哈。

最后,欢迎关注我的公众号。

mock造数据的更多相关文章

  1. 前端工具mock的使用 - 造数据模拟网络请求

    前后端同步开发过程中,有时候前端页面完成了,需要等待后端接口完成部署后才能联调. 这个时候如果不想等待,想自己造数据模拟网络请求,这种情况就能用到mock工具了. mock工具可以用在web网站,也能 ...

  2. SQL Server 用表中已有数据造数据

    从表中选择数据再插入到表中(select XXX into 与insert into XXX select的结合) 在做性能测试时需要大量的业务数据.完全从画面造数据比较费时间,使用SQL文批量插入数 ...

  3. 【vue】vue +element 搭建项目,mock模拟数据(纯干货)

    1.安装mockjs依赖 (c)npm install mockjs --save-dev 2.安装axios(Ajax) (c)npm install --save axios 3.项目目录 4.设 ...

  4. mysql--构造数据、导入导出

    一.mysql造数据脚本     DELIMITER $$ DROP PROCEDURE IF EXISTS `test3`$$ CREATE     /*[DEFINER = { user | CU ...

  5. 深入浅出的webpack4构建工具---比mock模拟数据更简单的方式(二十一)

    如果想要了解mock模拟数据的话,请看这篇文章(https://www.cnblogs.com/tugenhua0707/p/9813122.html) 在实际应用场景中,总感觉mock数据比较麻烦, ...

  6. python之工作举例:通过复制NC文件来造数据

    # 通过对NC文件复制来造数据 import os, shutil # 遍历的根目录 root_dir = "D:\\test_data\\DISASTER\\" # 获取NC文件 ...

  7. 性能测试四十:Mysql存储过程造数据

    性能测试是基于大量数据的,而进行性能测试之前肯定没那么多数据,所以就要自己准备数据 数据构造方法: 1.业务接口 -- 适合数据表关系复杂 -- 优点:数据完整性比较好2.存储过程 -- 适合表数量少 ...

  8. Jmeter(二十三)Jmeter-Question之“批量造数据”

    日常工作中,无论是在做功能测试.接口测试还是性能测试,经常会有这么一个场景出现,“那个谁谁谁,帮我加几条订单”,“那个某某某,给购物车增添几个产品”,“在数据库加几百条数据”...等等,通常少数量,或 ...

  9. oi造数据

    #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #includ ...

随机推荐

  1. 小程序clearinterval无效解决

    小程序clearinterval无效解决 小程序clearinterval清除定时器无效,原因是定时器使用与清除方法不对导致的,我们应将定时器绑定变量,这样在关闭页面清空定时器clearinterva ...

  2. torch中的copy()和clone()

    torch中的copy()和clone() 1.torch中的copy()和clone() y = torch.Tensor(2,2):copy(x) ---1 修改y并不改变原来的x y = x:c ...

  3. POJ 2763"Housewife Wind"(DFS序+树状数组+LCA)

    传送门 •题意 一对夫妇居住在 xx村庄,给村庄有 $n$ 个小屋: 这 $n$ 个小屋之间有双向可达的道路,不会出现环,即所构成的图是个树: 从 $a_i$ 小屋到 $b_i$ 小屋需要花费 $w_ ...

  4. 前端开发之JavaScript

    JavaScript JS是一种脚本语言,浏览器执行,用于渲染HTML网页,实现网页的动画效果. JavaScript的引用方式: 1,在HTML文件中script标签中写JS代码 <scrip ...

  5. SQL2008 R2安装完成后开启services服务指引和 sa账号启用、数据类型

  6. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  7. junit 测试套件Suite

    junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...

  8. jquery自己写的带左右箭头自动播放幻灯插件,简化

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Python3_函数参数传递、可变与不可变对象、变量作用域、函数返回值

    参数传递: 在 python 中,类型属于对象,变量是没有类型的:(变量都仅仅是一个对象的引用,没有类型之分)a=[1,2,3] a="Runoob" 以上代码中,[1,2,3] ...

  10. 使用Sklearn-train_test_split 划分数据集

    使用sklearn.model_selection.train_test_split可以在数据集上随机划分出一定比例的训练集和测试集 1.使用形式为: from sklearn.model_selec ...