• 如何同时压测创建和删除接口


    在最近的工作中,遇到了一批需要压测的接口,其中两个接口比较特殊:一个是创建资源接口,另外一个是删除该资源的接口。

    简单功能描述

    第一个接口功能是根据知识点ID类型学科ID素材ID等创建一个资源。

    接口参数如下:

            params.put("kid", kid)
            params.put("class_id", class_id)
            params.put("class_type", 3)//0 -行政班        3-教学班
            params.put("course_type", course_type)
            params.put("subject_id", subject_id)
            params.put("minicourse_id", minicourse_id)
            params.put("activity_name", activity_name)
            params.put("page_index", 1)
            params.put("page_size", 10)
    

    请求成功响应:

    ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
    >  {
    >  ① . "data":{
    >  ② . . . "activity_id":674
    >  ① . },
    >  ① . "meta":{
    >  ② . . . "emsg":"",
    >  ② . . . "ecode":0
    >  ① . }
    >  }
    ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
    

    第二个接口就是根据第一个接口返回的ID,删除该ID对应的资源。

    参数如下:

            JSONObject params = getParams()
            params.put("activity_id", activity_id)
    

    返回信息如下:

    ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
    >  {
    >  ① . "data":{
    >  ② . . . 
    >  ① . },
    >  ① . "meta":{
    >  ② . . . "emsg":"",
    >  ② . . . "ecode":0
    >  ① . }
    >  }
    ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
    
    • 这里有一个特殊的地方,对于同样一个minicourse_id,同样的创建数据,只能得到同一个ID,删除操作落到数据库里面,其实是一个update。为了保证多个线程之间不发生错乱干扰测试结果,依然采取了,线程绑定用户绑定测试数据的方案。

    方法封装

    首先封装创建删除两个方法,暴露相关参数,这里我用到了默认参数值的方法,省得调用时候得一个个修改了。

    /**
     * 创建备课
     * @param kid
     * @param class_id
     * @param course_type
     * @param subject_id
     * @param minicourse_id
     * @param activity_name
     * @return
     */
        public JSONObject createPre(int kid = 68, int class_id = 50167, int course_type = 4, int subject_id = 6, int minicourse_id = 2109354, String activity_name = "FunTester") {
            String url = MirroApi.CREATE_PRE
            JSONObject params = getParams()
            params.put("kid", kid)
            params.put("class_id", class_id)
            params.put("class_type", 3)//0 -行政班        3-教学班
            params.put("course_type", course_type)
            params.put("subject_id", subject_id)
            params.put("minicourse_id", minicourse_id)
            params.put("activity_name", activity_name)
            params.put("page_index", 1)
            params.put("page_size", 10)
            JSONObject response = getPostResponse(url, params)
            output(response)
        }
    
    /**
     * 删除备课
     * @param activity_id
     * @return
     */
        public JSONObject delPre(int activity_id = 343) {
            String url = MirroApi.DEL_PRE
            JSONObject params = getParams()
            params.put("activity_id", activity_id)
            JSONObject response = getPostResponse(url, params)
            output(response)
        }
    

    压测脚本

    package com.okayqa.composer
    
    import com.fun.base.constaint.ThreadLimitTimesCount
    import com.fun.frame.excute.Concurrent
    import com.okayqa.composer.base.OkayBase
    import com.okayqa.composer.function.Mirro
    
    class COMT extends OkayBase {
    
        public static void main(String[] args) {
    
            def res = []
    
            200.times {
    
                def base1 = getBase(it)
                def mirro1 = new Mirro(base1)
                res << new TT(mirro1,50)
            }
            new Concurrent(res,"创建备课删除备课").start()
    
            allOver()
        }
    
        static class TT extends ThreadLimitTimesCount{
    
            Mirro m
    
            int aid = 0
    
            public TT(Mirro mirro,int times) {
                super()
                this.m = mirro
                this.times = times
            }
    
            @Override
            protected void doing() throws Exception {
                def pre = m.createPre()
                if (aid == 0) {
                  aid = pre.getJSONObject("data").getIntValue("activity_id")
                }
                m.delPre(aid)
            }
        }
    }
    
    

    可以参考其他压测脚本的实现:

    压测结果展示



    上面三图是用Java工具类完成的,参考:性能测试中图形化输出测试数据


    公众号FunTester首发,原创分享爱好者,腾讯云和掘金社区首页推荐,知乎七级原创作者,欢迎关注、交流,禁止第三方擅自转载。

    FunTester热文精选

  • 相关阅读:
    AVL树的java实现
    request和response的setCharacterEncoding()方法
    几种常用数据库连接池的使用
    String类、static关键字、Arrays类、Math类
    QT学习笔记(day02)
    QT学习笔记(day01)
    STL中栈和链表的不同实现方式的速度对比
    C++泛化双端队列
    C++泛化队列
    C++泛化栈
  • 原文地址:https://www.cnblogs.com/FunTester/p/13660664.html
Copyright © 2020-2023  润新知