JMeter中如何用JSR223(Groovy)实现WS Play API请求全动态化
基于WebSocket响应动态生成WS Play API请求(Groovy + JSR223 PostProcessor)
需求说明
需要通过JSR223 PostProcessor(Groovy语言),完全依赖WebSocket API的响应内容,实现WS Play API请求的全动态化,包括动态生成guidance_order等核心字段。
实现步骤
一、前置准备
- 确保JMeter测试计划中已添加WebSocket Request Sampler用于获取WebSocket响应,并将JSR223 PostProcessor挂载到该Sampler下。
- JMeter默认自带Groovy支持,无需额外配置依赖。
二、核心Groovy脚本实现
将以下代码粘贴到JSR223 PostProcessor的脚本编辑框中:
// 1. 获取并解析WebSocket响应内容 def wsResponse = prev.getResponseDataAsString() def jsonSlurper = new groovy.json.JsonSlurper() def responseData = jsonSlurper.parseText(wsResponse) // 2. 映射session_type字段:audio→1,video→2,guidance→3 def sessionTypeMap = [ "audio": 1, "video": 2, "guidance": 3 ] def sessionType = sessionTypeMap[responseData.session_type] ?: 3 // 缺失时默认取3 // 3. 动态生成guidance_order:提取music_guidance中的index值 def guidanceOrder = responseData.music_guidance.collect { it.index } // 4. 提取并组装音乐相关字段 def infusedMusic = responseData.infused_music ?: [] def audioPlaylistUrls = infusedMusic.collect { it.distribution_url } def artistNameList = infusedMusic.collect { it.artist_name } def iscrs = infusedMusic.collect { it.ISRC } def audioIds = infusedMusic.collect { it.id } def songTitles = infusedMusic.collect { it.title } def audioDurations = infusedMusic.collect { it.duration } // 5. 提取并组装引导相关字段 def musicGuidance = responseData.music_guidance ?: [] def guidancePlaylistUrls = musicGuidance.collect { it.url } def guidanceIds = musicGuidance.collect { it.id } def guidanceTitles = musicGuidance.collect { it.title } def guidanceDurations = musicGuidance.collect { it.duration } // 6. 映射其他基础字段 def sessionStartMood = responseData.starting_emotion?.replace("_v1", "") ?: "calm" def sessionEndMood = responseData.ending_emotion?.replace("_v1", "") ?: "calm" def genre = responseData.genre ?: "" def subGenre = responseData.sub_genre ?: responseData.subgenre ?: "" def confidenceScore = responseData.music_recommendation ?: 0.0 def guidanceCategory = responseData.guidance ?: "" def playlistId = responseData.playlist_id ?: "" def playlistThumbnailImage = responseData.thumbnail_image ?: "" def playlistRecommender = responseData.playlist_recommender ?: "" // 7. 组装完整请求JSON def playApiRequest = [ guidance_order: guidanceOrder, session_type: sessionType, session_start_mood: sessionStartMood, session_end_mood: sessionEndMood, genre: genre, sub_genre: subGenre, playlist_recommender: playlistRecommender, confidence_score: confidenceScore, video_category: "", guidance_category: guidanceCategory, audio_playlist_urls: audioPlaylistUrls, video_playlist_urls: [], guidance_playlist_urls: guidancePlaylistUrls, artist_name_list: artistNameList, track_id_list: [ iscrs: iscrs, video_ids: [], guidance_ids: guidanceIds, audio_ids: audioIds ], track_name_list: [ song_titles: songTitles, video_titles: [], guidance_titles: guidanceTitles ], video_metadata: [ videos_duration: [], videos_length: [], videos_start_time: [] ], track_durations: [ audio_durations: audioDurations, video_durations: [], guidance_durations: guidanceDurations ], playlist_id: playlistId, playlist_thumbnail_image: playlistThumbnailImage ] // 8. 将请求JSON保存为JMeter变量,供后续请求使用 def jsonBuilder = new groovy.json.JsonBuilder(playApiRequest) vars.put("wsPlayApiRequest", jsonBuilder.toPrettyString()) // 可选:打印生成的请求到日志用于调试 // log.info("Generated WS Play API Request: " + jsonBuilder.toPrettyString())
三、后续使用
在WS Play API的请求Sampler中,直接引用变量${wsPlayApiRequest}作为请求体即可。
四、关键注意事项
- 空值处理:脚本中通过
?:设置默认值,避免因响应字段缺失导致脚本报错。 - 字段映射一致性:根据业务规则调整字段转换逻辑(比如
starting_emotion去掉_v1后缀)。 - 调试:开启脚本末尾的日志打印,可在JMeter日志中验证生成的请求是否符合预期。
内容的提问来源于stack exchange,提问作者Kavita
相关产品推荐
相关产品推荐

