JMeter的 WebSocket负载测试

后端开发 2026-07-09

我想通过WebSocket API的响应,完全动态地使用JSR223后置处理器(Groovy语言)来构造WS Play API请求。应该怎么实现?

WS Play API请求:

{
  "guidance_order": [
    0,
    2,
    4
  ],
  "session_type": 3,
  "session_start_mood": "calm",
  "session_end_mood": "calm",
  "genre": "Hip Hop",
  "sub_genre": "Hip Hop / Rap",
  "playlist_recommender": "PlaylistContinuator v1.6.3",
  "confidence_score": 0.5389271378517151,
  "video_category": "",
  "guidance_category": "Breathwork",
  "audio_playlist_urls": [
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/GBCBR0700022/config_44/70a62d169c6dde5ca218.m3u8",
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/GBCBR0700021/config_44/b88aa4b71dfeba37732a.m3u8",
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/USIR28700379/config_44/06bc853058a2db54e084.m3u8",
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/GBCBR0700020/config_44/f83b8153c9de17c27aa7.m3u8"
  ],
  "video_playlist_urls": [

  ],
  "guidance_playlist_urls": [
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_guidance/Ian/CALM_BREATHWORK_478Breathwork_Elise_1.m3u8",
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_guidance/Ian/CALM_BREATHWORK_478Breathwork_Elise_3.m3u8",
    "https://s3.us-west-1.wasabisys.com/dbapp/converted_guidance/Ian/CALM_BREATHWORK_478Breathwork_Elise_5.m3u8"
  ],
  "artist_name_list": [
    "Run D.M.C.",
    "Run D.M.C.",
    "Eric B. & Rakim",
    "Run D.M.C."
  ],
  "track_id_list": {
    "iscrs": [
      "GBCBR0700022",
      "GBCBR0700021",
      "USIR28700379",
      "GBCBR0700020"
    ],
    "video_ids": [

    ],
    "guidance_ids": [
      "18",
      "20",
      "22"
    ],
    "audio_ids": [
      "14246",
      "13604",
      "7633",
      "12593"
    ]
  },
  "track_name_list": {
    "song_titles": [
      "King Of Rock (Live)",
      "Medley: Rock Box  Sucker MC's  Freestyle  Here We Go  Beats To The Rhyme (Live)",
      "Paid In Full (Seven Minutes Of Madness - The Coldcut Remix)",
      "It's Tricky (Live)"
    ],
    "video_titles": [

    ],
    "guidance_titles": [
      "CALM_BREATHWORK_478Breathwork_Elise_1",
      "CALM_BREATHWORK_478Breathwork_Elise_3",
      "CALM_BREATHWORK_478Breathwork_Elise_5"
    ]
  },
  "video_metadata": {
    "videos_duration": [

    ],
    "videos_length": [

    ],
    "videos_start_time": [

    ]
  },
  "track_durations": {
    "audio_durations": [
      172.173333,
      314.52,
      430.213696,
      214.586667
    ],
    "video_durations": [

    ],
    "guidance_durations": [
      110.36025,
      29.904875,
      10.844167
    ]
  },
  "playlist_id": "a2a304d9-6623-413b-aa96-89d5fb1e0f94",
  "playlist_thumbnail_image": "https://s3.us-west-1.wasabisys.com/dbapp/playlists/artwork_a2a304d9-6623-413b-aa96-89d5fb1e0f94.jpg"
}

WebSocket API响应:

会话类型可以是音频、视频和指引,在WS Play API请求中以1、2和 3传递。

{
  "session_type": "guidance",
  "genre": "Pop",
  "sub_genre": "Pop",
  "infused_music": [
    {
      "id": "1498",
      "emotion": "Perform_v1",
      "distribution_url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/USUM70729755/config_54/08c110a021be67c992dc.m3u8",
      "duration": 211.08,
      "ISRC": "USUM70729755",
      "tags": "",
      "genre": "Pop",
      "subgenre": "Modern Pop",
      "artist_name": "Maroon 5",
      "album_title": "Makes Me Wonder",
      "title": "Makes Me Wonder",
      "explicit": true,
      "artwork_URL": "https://s3.us-west-1.wasabisys.com/dbapp/converted_artwork/album/album_2168_artwork.jpg"
    },
    {
      "id": "4019",
      "emotion": "Perform_v1",
      "distribution_url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/USJAY0300079/config_54/6639e93fcab9ea96a174.m3u8",
      "duration": 174.804469,
      "ISRC": "USJAY0300079",
      "tags": "",
      "genre": "Pop",
      "subgenre": "Modern Pop",
      "artist_name": "Maroon 5",
      "album_title": "Top Of The Spot 2004",
      "title": "Harder To Breathe",
      "explicit": true,
      "artwork_URL": "https://s3.us-west-1.wasabisys.com/dbapp/converted_artwork/album/album_2321_artwork.jpg"
    },
    {
      "id": "489",
      "emotion": "Perform_v1",
      "distribution_url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/USUG12202492/config_54/5fd2fb2250cbac8acae8.m3u8",
      "duration": 75.546213,
      "ISRC": "USUG12202492",
      "tags": "",
      "genre": "Pop",
      "subgenre": "Modern Pop",
      "artist_name": "Justin Bieber",
      "album_title": "I Feel Funny",
      "title": "I Feel Funny",
      "explicit": true,
      "artwork_URL": "https://s3.us-west-1.wasabisys.com/dbapp/converted_artwork/album/album_456_artwork.jpg"
    },
    {
      "id": "17780",
      "emotion": "Perform_v1",
      "distribution_url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_music/USUM70737444/config_54/8d3f75f38259afd777f6.m3u8",
      "duration": 214.826667,
      "ISRC": "USUM70737444",
      "tags": "Pop",
      "genre": "Pop",
      "subgenre": "Modern Pop",
      "artist_name": "Maroon 5",
      "album_title": "Makes Me Wonder",
      "title": "Makes Me Wonder (Harry Choo Choo Romero's Bambossa Mix  Edit)",
      "explicit": true,
      "artwork_URL": "https://s3.us-west-1.wasabisys.com/dbapp/converted_artwork/album/album_2168_artwork.jpg"
    }
  ],
  "thumbnail_image": "https://s3.us-west-1.wasabisys.com/dbapp/playlists/artwork_0b6608a5-0d71-4052-beaa-e51cbb6eb068.jpg",
  "count": 4,
  "user_id": "61",
  "playlist_id": "0b6608a5-0d71-4052-beaa-e51cbb6eb068",
  "starting_emotion": "Perform_v1",
  "ending_emotion": "Perform_v1",
  "mood": "Perform_v1",
  "is_video_present": false,
  "music_recommendation": 0.5834436416625977,
  "playlist_recommender": "PlaylistContinuator v1.6.3",
  "video": "",
  "music_visuals": [

  ],
  "guidance": "Breathwork",
  "music_guidance": [
    {
      "index": 0,
      "id": "32",
      "title": "MOTVT_BREATHWORK_Movement_Elise_1",
      "url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_guidance/Ian/MOTVT_BREATHWORK_Movement_Elise_1.m3u8",
      "tags": null,
      "emotion": "Perform",
      "duration": 91.257833
    },
    {
      "index": 4,
      "id": "36",
      "title": "MOTVT_BREATHWORK_Movement_Elise_5",
      "url": "https://s3.us-west-1.wasabisys.com/dbapp/converted_guidance/Ian/MOTVT_BREATHWORK_Movement_Elise_5.m3u8",
      "tags": null,
      "emotion": "Perform",
      "duration": 9.217542
    }
  ]
}

此外,指引的顺序也可以是动态的。

解决方案

  1. 在需要动态创建数据的请求下添加 JSR223 PreProcessor 作为子组件
  2. 将以下代码放入Script区域:

``` import groovy.json.JsonSlurper import groovy.json.JsonOutput

def prevResponse = prev.getResponseDataAsString()
def json = new JsonSlurper().parseText(prevResponse)

def infusedMusic = json.infused_music ?: []
def musicGuidance = json.music_guidance ?: []

def guidanceOrder = musicGuidance.collect { it.index as int }

def requestBody = [
        guidance_order      : guidanceOrder,

        session_type        : (vars.get("session_type") ?: "3") as int,
        session_start_mood  : vars.get("session_start_mood") ?: "calm",
        session_end_mood    : vars.get("session_end_mood") ?: "calm",
        genre               : json.genre ?: vars.get("genre") ?: "",
        sub_genre           : json.sub_genre ?: vars.get("sub_genre") ?: "",

        playlist_recommender: json.playlist_recommender ?: "",
        confidence_score    : json.music_recommendation as double,
        video_category      : "",
        guidance_category   : json.guidance ?: "",

        audio_playlist_urls : infusedMusic.collect { it.distribution_url },
        video_playlist_urls : [],
        guidance_playlist_urls: musicGuidance.collect { it.url },

        artist_name_list    : infusedMusic.collect { it.artist_name },

        track_id_list: [
                iscrs       : infusedMusic.collect { it.ISRC },
                video_ids   : [],
                guidance_ids: musicGuidance.collect { it.id as String },
                audio_ids   : infusedMusic.collect { it.id as String }
        ],

        track_name_list: [
                song_titles     : infusedMusic.collect { it.title },
                video_titles    : [],
                guidance_titles : musicGuidance.collect { it.title }
        ],

        video_metadata: [
                videos_duration  : [],
                videos_length    : [],
                videos_start_time: []
        ],

        track_durations: [
                audio_durations   : infusedMusic.collect { it.duration as double },
                video_durations   : [],
                guidance_durations: musicGuidance.collect { it.duration as double }
        ],

        playlist_id             : json.playlist_id ?: "",
        playlist_thumbnail_image: json.thumbnail_image ?: ""
]

def bodyStr = JsonOutput.toJson(requestBody)
vars.put("next_request_body", bodyStr)

`` 3. 需要使用生成的请求数据时,请使用${next_request_body}`。

更多信息:

  1. Apache Groovy:JSON的解析与生成
  2. Apache Groovy:Groovy的用途是什么?
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章