如何在Gatling(Scala)中获取For循环返回值并传入StringBody
问题描述
我在Gatling的Scala代码中编写了一个含for循环的方法,用于生成字符串数组,代码如下:
def main(args: Array[String]): Unit = { var AddTest: Array[String] = Array[String]() for (i <- 0 to 3) { val TestBulk: String = s"""{\"name\": \"Perftest ${Random.alphanumeric.take(6).mkString}\", \"testID\": \"00000000-0000-0000-0000-000000006017\", \"typeId\": \"00000000-0000-0000-0000-000000011001\", \"statusId\": \"00000000-0000-0000-0000-000000005058\"};""" AddTest = TestBulk.split(",") // val TestBulk2: Nothing = AddTest.mkString(",").replace(';', ',') // println(TestBulk) } }
现在我希望将该循环的返回值传入以下HTTP请求的.body(StringBody(session => ...))中:
.exec(http("PerfTest Bulk Json") .post("/PerfTest/bulk") .body(StringBody(session => s"""[(Value from the for loop).mkString(",").replace(';', ',') ]""".stripMargin)).asJson
可行实现方案
1. 抽离单个测试对象生成逻辑
先把生成单个JSON测试对象的代码封装成独立方法,让逻辑更清晰:
import scala.util.Random // 生成单个符合要求的测试对象JSON字符串 def generateTestItem(): String = { s"""{ "name": "Perftest ${Random.alphanumeric.take(6).mkString}", "testID": "00000000-0000-0000-0000-000000006017", "typeId": "00000000-0000-0000-0000-000000011001", "statusId": "00000000-0000-0000-0000-000000005058" }""" }
2. 在请求体中直接生成批量数据
在Gatling的HTTP请求体中,直接通过集合操作生成批量数据并拼接成JSON数组,不需要额外的main方法(Gatling场景执行不需要main入口):
.exec(http("PerfTest Bulk Json") .post("/PerfTest/bulk") .body(StringBody(_ => { // 生成4个测试对象(对应原循环0 to 3的次数) val testItems = (0 to 3).map(_ => generateTestItem()) // 拼接为标准JSON数组格式 s"[${testItems.mkString(",")}]" })).asJson)
原代码问题说明
- 原循环中
AddTest = TestBulk.split(",")是覆盖数组而非累加,最终只会保留最后一次循环的分割结果,无法得到多个测试对象 - 原代码末尾的
;属于冗余字符,直接生成正确的JSON对象字符串,再拼接成数组更规范,无需后续替换操作
内容的提问来源于stack exchange,提问作者RUDRA GANESH SUBBARAYULU
相关产品推荐
相关产品推荐

