首页 > 解决方案 > Gatling 如何为以后的请求存储和加载值

问题描述

我想构建一个负载测试,其中第二个请求来自第一个响应。数据提取是在一种方法中完成的,因为它不仅仅是一行代码。我的问题是存储值(id)并稍后加载。值应该如何存储和加载?我尝试了一些不同的方法,并想出了这段代码。文档对我没有帮助。

    object First {
        val first = {
            exec(http("first request")
            .post("/graphql")
            .headers(headers_0)
            .body(RawFileBody("computerdatabase/recordedsimulation/first.json"))
            .check(bodyString.saveAs("bodyResponse"))
            )
            .exec {
              session =>
                    val response = session("bodyResponse").as[String]
                    session.set("Id", getRandomValueForKey("id", response))
                session}
            .pause(1)
        }
    }

    object Second {
        val second = {
            exec(http("Second ${Id}")
                .post("/graphql")
                .headers(headers_0)
                .body(RawFileBody("computerdatabase/recordedsimulation/second.json"))
            )
            .pause(1)
        }
    }

    val user = scenario("User")
        .exec(
            First.first,
            Second.second
        )

    setUp(user.inject(
        atOnceUsers(1),
    )).protocols(httpProtocol)

标签: gatling

解决方案


您的问题是您没有正确使用会话。

文档中:

警告

会话实例是不可变的!

为什么呢?因为 Session 是多线程并发处理的消息,所以不依赖于同步和阻塞,不可变是处理状态的最佳方式。

一个非常常见的陷阱是忘记 set 和 setAll 实际上返回新实例。

这正是您正在做的事情:

exec { session =>
  val response = session("bodyResponse").as[String]
  session.set("Id", getRandomValueForKey("id", response))
  session
}

它应该是:

exec { session =>
  val response = session("bodyResponse").as[String]
  session.set("Id", getRandomValueForKey("id", response))
}

推荐阅读