重放瀏覽器請求多鏈路性能測試實踐

在之前的幾天,抽空完成了瀏覽器請求重放的基礎功能,今天得空寫了一個多鏈路性能測試實踐的Demo,順便也解決了之前一直遺留的重放瀏覽器性能測試中關於多接口請求順序的問題。

舊文如下:

整體思路

下面進入正題,主要思路如下:

  • 複製不同鏈路的請求,保存不同名字的文件
  • 通過工具類 FileUtil獲取某一目錄下全部文件
  • 通過工具類 CurlUtil將文件轉換成 List<HttpRequestBase>對象
  • 賦值多線程對象,執行 FunTester性能測試框架

這個思路比較樸實沒啥可講的,只是在最後一步需要自己寫一個多線程類,實現一下循環請求從文件中獲取到的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,非著名測試開發,文章記錄學習和感悟,歡迎關注,交流成長。
  • Gitee地址 https://gitee.com/fanapi/tester
  • GitHub地址 https://github.com/JunManYuanLong/FunTester

點擊閱讀原文,查看公衆號歷史文章


本文分享自微信公衆號 - FunTester(NuclearTester)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章