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

FunTester · 2020年09月13日 · 最后由 FunTester 回复于 2020年09月14日 · 3684 次阅读

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

简单功能描述

第一个接口功能是根据知识点 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 热文精选

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

测试 2 个接口还是测试这个场景?这 2 个还是要分开来的吧,毕竟短板的那个接口会影响另外一个接口的性能数据

这个业务有点特殊,单个资源单个用户创建的 id 是一样的,第二次创建会报重复。如果单测一个接口的话,很难造数据。之前的一个类似场景就是分开测的,先测试创建,然后把几万个 id 取出来,再去删除。之前有一个消息队列的测试就是这么搞的。

压测用 jmeter 和用代码去压测哪个更好,怎么去比较优劣去选择呢?

路小圣 回复

长远来看,代码更好。但是门槛更高。如果追求实用,短期效果的话,JMeter 最佳。

如果再考虑到其他因素,比如说功能、自动化、CI/CD 的话,JMeter 就远远不如代码方便了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册