java - 为什么我在 Ga特林 中执行两个场景时得到 Value is Null?

标签 java scala gatling scala-gatling

我的脚本中有两个场景第一个“getAssets”场景将获取所有 Assets ID 并将其保存在列表中,第二个场景“fetchMetadata”将迭代这些 ID。

我只需执行一次“getAssets”场景即可获取所有 ID,然后“fetchMetadata”场景将执行到给定的持续时间。

这是“/api/assets;limit=$limit”请求的 Json 响应(我们使用 $.assets[*].id 从这里获取 id),

{
  "assets": [
    {
      "id": 3010411,
      "name": "Asset 2016-11-22 20:06:07",
      ....
      ....
    },
    {
      "id": 3010231,
      "name": "Asset 2016-11-22 20:07:07",
      ....
      ....
    }, and so on..

这是代码

import java.util.concurrent.ThreadLocalRandom
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._

class getAssetsMetadata extends Simulation {
    val getAssetURL = System.getProperty("getAssetURL", "https://performancetesting.net")
    val username = System.getProperty("username", "performanceuser")
    val password = System.getProperty("password", "performanceuser")
    val limit = Integer.getInteger("limit", 1000).toInt
    val userCount = Integer.getInteger("userCount", 100).toInt
    val duration = Integer.getInteger("duration",1).toInt //in minutes

    var IdList: Seq[String] = _   

    val httpProtocol = http
        .basicAuth(username, password)
        .baseURL(getAssetURL)
        .contentTypeHeader("""application/vnd.v1+json""")

    // Scenario 1 get assets
    val getAssets = scenario("Get Assets")
            .exec(http("List of Assets")
            .get(s"""/api/assets;limit=$limit""")
            .check(jsonPath("$.assets[*].id").findAll.transform {v => IdList = v; v }.saveAs("IdList"))
            )

    // Scenario 2 Fetch Metadata
    val fetchMetadata = scenario("Fetch Metadata")
        .exec(_.set("IdList", IdList))
        .exec(http("Metadata Request")
            .get("""/api/assets/${IdList.random()}/metadata""")
            )

    val scn = List(getAssets.inject(atOnceUsers(1)), fetchMetadata.inject(constantUsersPerSec(userCount) during(duration minutes)))
    setUp(scn).protocols(httpProtocol) 
}   

:::错误:::

它抛出“Value is null”(虽然我们这里有 1000 万个 Assets ID)。这是加特林日志

14883 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  io.gatling.http.config.HttpProtocol - Warm up done
14907 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  io.gatling.http.config.HttpProtocol - Start warm up
14909 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  io.gatling.http.config.HttpProtocol - Warm up done
14911 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - Total number of users : 6001
14918 [GatlingSystem-akka.actor.default-dispatcher-6] INFO  i.g.c.r.writer.ConsoleDataWriter - Initializing
14918 [GatlingSystem-akka.actor.default-dispatcher-3] INFO  i.g.c.result.writer.FileDataWriter - Initializing
14923 [GatlingSystem-akka.actor.default-dispatcher-6] INFO  i.g.c.r.writer.ConsoleDataWriter - Initialized
14928 [GatlingSystem-akka.actor.default-dispatcher-3] INFO  i.g.c.result.writer.FileDataWriter - Initialized
14931 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG i.g.core.controller.Controller - Launching All Scenarios
14947 [GatlingSystem-akka.actor.default-dispatcher-12] ERROR i.g.http.action.HttpRequestAction - 'httpRequest-2' failed to execute: Value is null
14954 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG i.g.core.controller.Controller - Finished Launching scenarios executions
14961 [GatlingSystem-akka.actor.default-dispatcher-4] DEBUG i.g.core.controller.Controller - Setting up max duration
14962 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-0
14963 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-1
14967 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - End user #7187317726850756780-1
14970 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-2
14970 [GatlingSystem-akka.actor.default-dispatcher-5] INFO  io.gatling.http.ahc.HttpEngine - Sending request=List of Assets uri=https://performancetesting.net/api/assets;limit=1000: scenario=Get Assets, userId=7187317726850756780-0
14970 [GatlingSystem-akka.actor.default-dispatcher-7] ERROR i.g.http.action.HttpRequestAction - 'httpRequest-2' failed to execute: Value is null
14972 [GatlingSystem-akka.actor.default-dispatcher-7] INFO  i.g.core.controller.Controller - End user #7187317726850756780-2
14980 [GatlingSystem-akka.actor.default-dispatcher-7] ERROR i.g.http.action.HttpRequestAction - 'httpRequest-2' failed to execute: Value is null
14980 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-3
14984 [GatlingSystem-akka.actor.default-dispatcher-4] INFO  i.g.core.controller.Controller - End user #7187317726850756780-3
.....
.....
.....
61211 [GatlingSystem-akka.actor.default-dispatcher-12] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-4626
61211 [GatlingSystem-akka.actor.default-dispatcher-7] ERROR i.g.http.action.HttpRequestAction - 'httpRequest-2' failed to execute: Value is null
61211 [GatlingSystem-akka.actor.default-dispatcher-7] INFO  i.g.core.controller.Controller - End user #7187317726850756780-4626
61224 [GatlingSystem-akka.actor.default-dispatcher-2] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-4627
61225 [GatlingSystem-akka.actor.default-dispatcher-5] INFO  io.gatling.http.ahc.HttpEngine - Sending request=Metadata Request uri=https://performancetesting.net/api/assets/3010320/metadata: scenario=Fetch Metadata, userId=7187317726850756780-4627
61230 [GatlingSystem-akka.actor.default-dispatcher-12] INFO  i.g.core.controller.Controller - Start user #7187317726850756780-4628
61230 [GatlingSystem-akka.actor.default-dispatcher-7] INFO  io.gatling.http.ahc.HttpEngine - Sending request=Metadata Request uri=https://performancetesting.net/api/assets/3009939/metadata: scenario=Fetch Metadata, userId=7187317726850756780-4628
61233 [GatlingSystem-akka.actor.default-dispatcher-2] INFO  i.g.core.controller.Controller - End user #7187317726850756780-0
61233 [New I/O worker #12] DEBUG c.n.h.c.p.netty.handler.Processor - Channel Closed: [id: 0x8c94a1ae, /192.168.100.108:56739 :> performancetesting.net/10.20.14.176:443] with attribute INSTANCE

---- Requests ------------------------------------------------------------------
> Global                                                   (OK=261    KO=40    )
> Metadata Request                                         (OK=260    KO=40    )
> List of Assets                                           (OK=1      KO=0     )
---- Errors --------------------------------------------------------------------
> Value is null                                                      40 (100.0%)
================================================================================

谢谢。

最佳答案

ID列表不会传递给其他场景,因为它是由另一个“用户”( session )获取的。

您的模拟如下所示

  • 1 个用户正在获取 ID 列表(并为自己保留该列表)
  • 同时,n 个用户尝试使用(未定义的)ID 列表获取 Assets

第一个用户不与其他用户交谈,两个场景注入(inject)是相互独立的。

解决此问题的一种方法是将列表存储在共享容器(即 AtomicReference)中,并从第二个场景访问该容器。 为了确保容器已填充,请在第二个场景开始时注入(inject) nothingFor 步骤,以等待第一个场景完成。

另一种方法是在第二个场景开始时获取 ID 列表 - 如果之前尚未获取过(请参阅上面的容器)。

我确信也有方法可以实现这一点(即在实际测试之前使用一些 feeder 并获取 id 列表)

关于java - 为什么我在 Ga特林 中执行两个场景时得到 Value is Null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027377/

相关文章:

html - 加特林机 : get the first element of the first object in a JSON Array

Java - PaintComponent 导致我的程序变慢

java - 如何使用 portainer 名称作为主机名连接到 mongodb?

java - 使用多个脚本引擎

scala - 用于从集合中检索特定类型项的通用强类型 Scala 方法

scala - Scala 中类参数声明的区别

java - 收集器.toMap IllegalStateException : Duplicate key when no duplication is possible

generics - 有没有使用泛型无法实现的 scala 抽象类型使用示例?

testing - Gatling 脚本引发错误 "type mismatch"

http - 如何在gatling中检索响应 header 并多次执行http调用?