在之前的几天,抽空完成了浏览器请求重放的基础功能,今天得空写了一个多链路性能测试实践的Demo,顺便也解决了之前一直遗留的重放浏览器性能测试中关于多接口请求顺序的问题。

旧文如下:

整体思路

下面进入正题,主要思路如下:

这个思路比较朴实没啥可讲的,只是在最后一步需要自己写一个多线程类,实现一下循环请求从文件中获取到的List<HttpRequestBase>中的HttpRequestBase对象。由于每一个链路的请求耗时各不相同,所以难以采取固定请求次数的模式,故而智能采取固定请求时间的模式,这里默认了固定线程而非固定QPS的压测模型。

测试 Demo

package com.okayqa

import com.alibaba.fastjson.JSONObject
import com.fun.base.constaint.ThreadLimitTimeCount
import com.fun.base.exception.FailException
import com.fun.base.interfaces.MarkThread
import com.fun.frame.httpclient.FanLibrary
import com.fun.utils.FileUtil
import com.okayqa.common.Common
import com.okayqa.composer.base.OkayBase
import org.apache.http.client.methods.HttpRequestBase

import static com.fun.utils.CurlUtil.getRequests

class TTT extends OkayBase {


    public static void main(String[] args) {
        //path为文件的绝对路径+文件名
        String path = ""
        //time是压测时间,单位秒(s)
        def time = 1000
        //用例描述,控制在20个字以内
        def desc = "FunTester多链路压测Demo"
        //获取多链路日志
        def file = FileUtil.getAllFile(path)
        def tasks = []
        file.each {
            tasks << new FunTester(it, time, null)
        }

        new Concurrent(tasks, desc).start()

        FanLibrary.testOver()
    }

    /**
     * FunTester测试类
     */
    static class FunTester extends ThreadLimitTimeCount<String> {

        List<HttpRequestBase> reqs

        FunTester(String s, int time, MarkThread markThread) {
            super(s, time, markThread)
            reqs = getRequests(s)
        }

        @Override
        void before() {
            super.before()
            //初始化标记字符,防止空指针异常
            threadmark = threadmark == null ? EMPTY : threadName
        }

        @Override
        protected void doing() throws Exception {
            reqs.each {
                it.removeHeaders(Common.REQUEST_ID.getName())
                def header = Common.getRequestIdHeader()
                it.addHeader(header)
                threadmark << header + CONNECTOR
                JSONObject simlple = FanLibrary.executeSimlple(it)
                if (!isRight(simlple)) FailException.fail("响应错误!" + it.getURI().toString())
            }
        }
    }


}

这里我添加了threadmark初始化工作,以及在doing()方法中进行标记的处理,以及每一个请求的通用业务验证。如果对于部分接口有更加细致的验证需求,可以自己实现一下,我这里先抛砖引玉。

控制台输出

INFO-> 当前用户:fv,IP:10.60.193.37,工作目录:/Users/fv/Documents/workspace/okay_test/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍  16.41%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  32.83%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  49.25%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  65.67%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  82.08%
INFO-> FunTester多链路压测Demo进度:▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍▍  100%
INFO-> 线程:FunTester多链路压测Demo0,执行次数:37, 失败次数: 0,总耗时: 30.024 s
这里省略大部分无用日志
INFO-> 线程:FunTester多链路压测Demo24,执行次数:38, 失败次数: 0,总耗时: 31.095 s
INFO-> 总计50个线程,共用时:31.121 s,执行总数:1917,错误数:0,失败数:0
INFO-> 数据保存成功!文件名:/Users/fv/Documents/workspace/okay_test/long/data/FunTester多链路压测Demo031618,50
INFO-> 数据保存成功!文件名:/Users/fv/Documents/workspace/okay_test/long/mark/FunTester多链路压测Demo031618
INFO-> 
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
>  {
>  ① . "rt":796,
>  ① . "total":1917,
>  ① . "qps":62.814,
>  ① . "failRate":0.0,
>  ① . "threads":50,
>  ① . "startTime":"2021-02-03 16:18:14",
>  ① . "endTime":"2021-02-03 16:18:45",
>  ① . "errorRate":0.0,
>  ① . "executeTotal":1917,
>  ① . "mark":"FunTester多链路压测Demo031618",
>  ① . "table":"eJzj5VIgDNxK80JSi0tSi54umfVy8r4X29c/7et+trXbJTU338DY0MzQwtSACGN4uXjx2xaUWlyQn1ecqhCSmZtqpVChW5xalJmYo5BXmqujUKmbm5qSmZhHyA6CzsjNzFOAGGVlbGiqkFusk5tYYWVoZAFiE+MLwmooAI+mdQAR7Wx5NK0JiGDW0NS2R9OagQjNKtrZiNVntLX10bRWIMJrJdVtfjStEYiAVDsQEWM1dV3waFoLEJFgL/VdQXyo084lRCQ2erqIwlihhauoE0vUdRm5eYdOLqRFoqKyK2kfq5S7lN6xTKGL4c4dSHeS5moaFjc0czk8cw2CVEGGDwaobKCmLwa27KCOTwZT2UIFH+Frog8xCuarwVs2UeSz4ectuO+GZrlAmg8HgTNGfTjqw1EfDrwzRn046kO8PgQAblRBew=="
>  }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
INFO-> 
                                   FunTester多链路压测Demo03161850                                   

                             Response Time: x-serial num, y-median                              
                                 min median:315 ms,max:1285 ms                                  

这里省略文本图像,下文中有效果展示

Process finished with exit code 0

FunTester多链路压测Demo


FunTester,非著名测试开发,文章记录学习和感悟,欢迎关注,交流成长。


↙↙↙阅读原文可查看相关链接,并与作者交流