如何用Node.js写接口的并发测试?

在项目上遇到一个需要对一个接口做200的编发测试,本来享用Postman来进行并发测试但是从网上看到这个工具好像并不具有编发测试的功能。考虑到Node.js天生的异步特性就想到了用Node.js写脚本来进行一个并发的测试。

这里考虑到了一个数据多个请求的并发(例如查询),以及每个请求都不同数据。不管是这两种情况的那种,我们的接口数据类型都是相对固定的,所以在下面的代码中的一个思路就是,每次请求体中的数据由一个固定函数生成,返回的数据就是这个请求用到的数据。组装的时候是将每次请求的个性化数据写入到请求参数模板中。

希望下面的内容对各位有用,有问题的话可以留言沟通。

var request = require('request');

//请求动态数据源
let DynamicDatas = [
    {
        "C0": "1",
        "PK_RUZH": "1001X61*****00000G3I7",
        "CARDNO": "5224272****77051",
        "PSNNAME": "耿*巡",
        "NATION": "汉族",
        "BIRTHDAY": "20010627",
        "SEX": "1",
        "ADDR": "贵州省威宁彝族回*******金钟镇冒水村冒水组"
    },
    {
        "C0": "1",
        "PK_RUZH": "1001X61*****00000G3I7",
        "CARDNO": "5224272****77051",
        "PSNNAME": "耿*巡",
        "NATION": "汉族",
        "BIRTHDAY": "20010627",
        "SEX": "1",
        "ADDR": "贵州省威宁彝族回*******金钟镇冒水村冒水组"
    }
];
//请求参数模型
let ParamsDataModel = {"PersonType":0,"pk_ruzh":"1001X61000000000G3I7","psnname":"耿*巡","sex":"男","nation":"汉族","birthday":"20010627","cardno":"522427200106277051","addr":"贵州省威宁彝族回族苗族自治县金钟镇冒水村冒水组","telephone":"18862283082","height":"145","weight":"122","politicaloutlook":"群众","nativeplace":"河北省","nature":"农村","nowaddr":"里河新村","marriage":"未婚","healthy":"健康","inway":"校园招聘","viewaddr":"台虹厂","computerlevel":"一般","englishlevel":"良好","salary":"2343","jtpsnname1":"柳任天","jtrelation1":"父母","jtunitname1":"宇航局","jtpostname1":"局长","jttelephone1":"13837999871","jjpsnname":"柳任天","jjdeptname":"父母","jjdutyname":"宇航局","jjrelationship":"13837999871","jystarttime1":"2021-02-04","jyendtime1":"2021-04-24","jyschoolname1":"常熟理工","jyxueli1":"本科","jymajor1":"计算机科学与技术","jystudyway1":"全日制","jystarttime2":"2021-02-04","isdisease":"无","issurgery":"无","isdecline":"无","isliver":"无","isallergy":"无","isspirit":"无","isquit":"无","iscrime":"无","iscompanyanpai":"有","agreement":true,"imageBase64":"data%3Aimage%2Fjpeg%3Bbase64%2C%2F9"};
//并发数,如果并发数为null,则根据数据量设置请求的并发数,CONCURRENCY_COUNT与DynamicDatas两个数据项有一个要为空
let CONCURRENCY_COUNT = null;
//请求路径
let REQUEST_URL = "http://*******.com:8000/******";
//请求方式
let REQUEST_TYPE = "POST";


let REQUEST_DATA_GEN = function(DynamicDatas,ParamsDataModel,Request_Time){
    if(!(DynamicDatas instanceof Array))return ParamsDataModel;
    let Index = Request_Time-1;
    //数据个性化生成匹配区,将个性化数据源匹配给请求参数体
    {
        ParamsDataModel.pk_ruzh=DynamicDatas[Index].PK_RUZH;
        ParamsDataModel.sex = DynamicDatas[Index].SEX==1?"男":"女";
        ParamsDataModel.nation = DynamicDatas[Index].NATION;
        ParamsDataModel.birthday= DynamicDatas[Index].BIRTHDAY;
        ParamsDataModel.cardno= DynamicDatas[Index].CARDNO;
        ParamsDataModel.addr= DynamicDatas[Index].ADDR;
    }
    return ParamsDataModel;
}//请求数据伪造函数,参数是初始化的数据,返回值是这次请求要用的数据


let REQUEST_METHOD = function () {
    let req = function(Request_Time){
        request({
            url: REQUEST_URL,
            method: REQUEST_TYPE,
            json: true,
            headers: {
                "content-type": "text/plain",
                "Accept-Encoding": "gzip, deflate, br",
            },
            //body: REQUEST_DATA_GEN(DynamicDatas,ParamsDataModel,Request_Time-1)
            body: REQUEST_DATA_GEN(DynamicDatas,ParamsDataModel,Request_Time)
        }, function(error, response, body) {
            if (error==null && response.statusCode == 200) {
                LogUtils("suc",Request_Time+"请求成功:",body)
            }else{
                LogUtils("err",Request_Time+"请求失败:",error);
            }
        });
    }
    let Request_Time = 1;
    if(CONCURRENCY_COUNT==null)CONCURRENCY_COUNT=DynamicDatas.length;
    while (true){
        LogUtils("suc","开始第"+Request_Time+"次请求")
        req(Request_Time);
        Request_Time++;
        if (Request_Time>CONCURRENCY_COUNT)break;
    }
}
let LogUtils = function(type,mes,data){
    switch (type) {
        case "err" :console.log("Error--"+mes);break;
        case "suc" :console.log("Success--"+mes);break;
        case "war" :console.log("Warning--"+mes);break;
        default:console.log("~~LogUtils()类型输入错误");
    }
    if(data!=undefined&&data!=null)console.log(data);
}

//开始执行请求测试
REQUEST_METHOD();

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我们的项目是一个基于Node.js和Vue.js的电商后台管理系统源码,旨在帮助开发人员快速构建和管理电商网站的后台系统。 我们的项目源码结合了Node.js和Vue.js这两个流行的技术框架,以提供高效、可扩展和可靠的Web应用程序。 首先,我们使用了Node.js作为后端开发语言和运行环境。Node.js是一个基于Chrome V8引擎的JavaScript运行时,具有非阻塞I/O和事件驱动的特点。Node.js的优势在于其高性能和可伸缩性,使得我们的后台系统能够处理大量的并发请求,并提供快速的响应速度。 其次,我们采用了Vue.js作为前端开发框架。Vue.js是一个轻量级的JavaScript框架,用于构建用户界面。Vue.js具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得我们的前端界面具有良好的可维护性和可扩展性。同时,Vue.js还提供了丰富的插件和工具,以帮助开发人员快速构建出美观、交互性强的用户界面。 我们的项目源码还使用了一些其他的技术和工具,以提高系统的性能和可靠性。我们使用了数据库来存储和管理商品信息、订单信息等数据。我们还使用了RESTful API来处理前后端的数据交互,以实现前后端的解耦和灵活性。此外,我们还采用了认证和授权等安全机制,以保护用户的隐私和数据安全。 我们的项目源码具有良好的可读性和可维护性,采用了模块化的开发方式和面向接口的编程原则。我们使用了MVC(Model-View-Controller)架构来分离业务逻辑和界面展示,以提高代码的可复用性和可测试性。我们还使用了依赖注入和单元测试等技术,以降低代码的耦合度和提高代码的质量。 总之,我们的电商后台管理系统源码基于Node.js和Vue.js,采用了一系列先进的技术和框架,以提供高效、可扩展和可靠的电商后台管理系统。无论您是初学者还是经验丰富的开发人员,我们相信我们的源码将能够帮助您快速构建出功能强大的电商后台管理系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值