如何在循环运行时从json数组读取数据并将其传递给Gatling

时间:2019-06-28 01:39:47

标签: scala gatling scala-gatling

我是加特林和斯卡拉的新手。我正在尝试做以下事情:-

test.json:
[
  {
    "code": "AML",
    "data": "aaasdfgghh"
  },
  {
    "code": "ABC",
    "data": "aaasdfgghh"
  },
  {
    "code": "SDF",
    "data": "aaasdfgghh"
  }
]

现在,我想循环读取此json键/值。目前,我正在这样做:

请求正文和Feeder:-

   val jsonFileFeederFundsDoc: SourceFeederBuilder[Any] = 
                  jsonFile("test.json").circular

   //Saves locally and to S3
   val upload_fund_s3: HttpRequestBuilder =
    http("upload Fund docs Locally")
   .post(onboarding_url_perf + "/document/passfort")
   .headers(basic_headers)
   .headers(auth_headers)
   .body(StringBody(
    """{
      "code":  "${code}",
      "data":  "${data}"
  }"""
  )).asJson
  .check(status.is(200))
  .check(jsonPath("$.id").saveAs("id"))

我的情况是:-

val newFundScenario: ScenarioBuilder = scenario("Company Fund Scenarios exists")
.exec(TokenScenario.getCompanyUsersGwtToken).exitHereIfFailed
.exec(CompanyProfileRequest.check_company_exists).exitHereIfFailed
.doIf("${COMPANY_NOT_FOUND}") {
  exec(CompanyProfileRequest.create_company_fund_profile).exitHereIfFailed
}
.feed(UploadFundDocsInPassfort.jsonFileFeederFundsDoc)
.exec(UploadFundDocsInPassfort.upload_fund_s3).exitHereIfFailed
.exec(UploadFundDocsInPassfort.upload_fund_passfort).exitHereIfFailed
.exec(OfficersRequest.create_director).exitHereIfFailed   

我的测试模拟是:

  class TestCompanySimulation extends Simulation {

   private val generalCompanyTestCases = GeneralCompanyScenarios
    .newFundScenario
    .inject(rampUsers(Integer.getInteger("users", 1)) during 
    (Integer.getInteger("ramp", 1) minutes))

    setUp(
      generalCompanyTestCases.protocols(httpConf),
    )
 }

现在的问题是,对于一个用户,我想在我的newFundScenario中循环读取数据,但在这种情况下,它只是从json文件中选择第一个值。

类似

 foreach(read data from json file){
 //Pass Data in run time and execute
 .exec(UploadFundDocsInPassfort.upload_fund_s3).exitHereIfFailed
 .exec(UploadFundDocsInPassfort.upload_fund_passfort).exitHereIfFailed
}

非常感谢您的帮助。

关于, Vikram Pathania

1 个答案:

答案 0 :(得分:1)

如果要让每个用户在Feeder中循环,则需要在循环中包含feed命令。例如,如果您要发出5个请求...

val upload_fund_s3: ChainBuilder =
repeat(5) {
  feed(jsonFileFeederFundsDoc)
  .exec(
    http("upload Fund docs Locally")
    .post(onboarding_url_perf + "/document/passfort")
    .headers(basic_headers)
    .headers(auth_headers)
    .body(StringBody("""{"code":  "${code}", "data":  "${data}"}""")).asJson
    .check(status.is(200))
    .check(jsonPath("$.id").saveAs("id"))
  )
} //include all the actions you want in the loop

,然后从方案定义中删除提要。当您同时定义了Feeder和使用Feeder的操作时,这样也更容易理解。

请注意,如果您开始在模拟中运行多个用户,他们将全部从同一供稿器中提取值。您已指定.circular,因此它不会用完值,但是每个用户可能会发出不同的请求(可能很好,具体取决于您的建模对象)

如果您的列表很小,您也可以考虑仅拥有一个Map并将其推送到会话中,以使用.foreach进行迭代