如何在Gatling/Scala中编辑来自api响应的值(条目列表)以在请求正文中使用

k97glaaz  于 2022-12-04  发布在  Scala
关注(0)|答案(1)|浏览(172)

我有一个问题,我希望有人能帮助我。我是相当新的编码和加特林,所以我不知道如何进行。
我正在使用Gatling(和Scala一起)创建一个包含两个API调用的性能测试场景。
1.获取信息
1.发送信息
我正在存储GetInformation响应中的一些值,以便可以在SendInformation请求的正文中使用它们。问题是GetInformation响应中的一些信息在包含在SendInformation的正文中之前需要编辑/删除。
GetInformation回应的摘录:

{
  "parameter": [
    {
      "name": "ResponseFromGetInfo",
      "type": "document",
      "total": 3,
      "entry": [
        {
          "fullUrl": "urn:uuid:4ea859d0-daa4-4d2a-8fbc-1571cd7dfdb0",
          "resource": {
            "resourceType": "Composition"
          }
        },
        {
          "fullUrl": "urn:uuid:1b10ed79-333b-4838-93a5-a40d22508f0a",
          "resource": {
            "resourceType": "Practitioner"
          }
        },
        {
          "fullUrl": "urn:uuid:650b8e7a-2cfc-4b0b-a23b-a85d1bf782de",
          "resource": {
            "resourceType": "Dispense"
          }
        }
      ]
    }
  ]
}

我想要的是将列表存储在“entry”中,并删除resourceType =“Dispense”的条目,这样我就可以在SendInformation的正文中使用它。
如果条目列表始终具有相同的条目数和顺序,这是可以接受的,但事实并非如此。条目数可以是几百个,条目顺序也可以变化。条目数等于GetInformation响应中包含的“total”值。
我想了几种方法来解决这个问题,但现在我被卡住了。一些替代方案:
1.使用.check(jsonPath("$.parameter[0].entry").saveAs("entryList"))提取整个“entry”列表,然后遍历列表以删除resourceTypes =“Dispense”的条目。但是我不知道如何遍历io.gatling.core.session.SessionAttribute类型的值,或者如果这是可能的话。如果我可以遍历条目列表并检查parameter[0].entry[0].resourceType = "Dispense"是否为真,如果语句为真则删除条目,那就太好了。
1.我也在考虑我是否可以以某种方式使用StringBuilder。也许我可以用.check(parameter[0].entry[X].resourceType != dispense检查一个条目,如果是,就把它附加到stringBuilder中。
有没有人知道我怎么能做到这一点?要么通过我列出的替代方案之一,要么以不同的方式?所有的帮助都很感激:)
所以最后它可能会看起来像这样:

val scn = scenario("getAndSendInformation")

    .exec(http("getInformation")
      .post("/Information/$getInformation")
      .body(ElFileBody("bodies/getInformtion.json"))
      
      // I can save total, så I know the total number of entries in the entry list
      .check(jsonPath("$.parameter[0].total").saveAs("total"))
      
      //Store entire entry list
      .check(jsonPath("$.parameter[0].entry").saveAs("entryList"))
      
      //Or store all entries separatly and check afterwards who have resourceType = "dispense"? Not sure how to do this..
      .check(jsonPath("$.parameter[0].entry[0]").saveAs("entry_0"))
      .check(jsonPath("$.parameter[0].entry[1]").saveAs("entry_1"))
      //...
      .check(jsonPath("$.parameter[0].entry[X]").saveAs("entry_X"))
    )

    //Alternativ 1
    .repeat("${total}", "counter") {
      exec(session => {
        //Do some magic here 
        //Check if session("parameter[0]_entry[counter].resourceType") = "Dispense" {
        // if yes, remove entry from entry list}  
        session})}
  
    //Alternativ 2
      val entryString = new StringBuilder("")
      .repeat("${total}", "counter") {
        exec(session => {
          //Do some magic here 
          //Check if session("parameter[0]_entry[counter].resourceType") != "Dispense" {
          // if yes, add to StringBuilder}  
          // entryString.append(session("parameter[0]_entry[counter]").as[String] + ", ")
          session})}
        
       .exec(http("sendInformation")
         .post("/Information/$sendInformation")
         .body(ElFileBody("bodies/sendInformationRequest.json")))
waxmsbnn

waxmsbnn1#

我对编码很陌生,我正在使用Gatling(使用Scala)
使用Java的Gatling对您来说可能是一个更容易的解决方案。
参数[0].entry”).另存为(“条目列表”)
这将捕获一个字符串,而不是列表。为了能够迭代,必须使用ofXXX/ofType[],请参见https://gatling.io/docs/gatling/reference/current/core/check/#jsonpath
然后,为了生成下一个请求的主体,可以考虑使用模板引擎,例如PebbleBody(https://gatling.io/docs/gatling/reference/current/http/request/#pebblestringbody),或者实际上使用StringBody和StringBuilder的函数。

相关问题