繁体   English   中英

如何在 Gatling 的 SSE 请求中使用从检查中保存的会话属性?

[英]How can I use a Session attribute saved from a Check in an SSE request in Gatling?

请参阅底部的工作 Java 代码。

我正在尝试创建一个使用客户端 ID 的 SSE 连接测试场景,该客户端 ID 是对先前 REST POST 调用的响应。 这是斯卡拉代码:

package computerdatabase

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class ssetest extends Simulation {

  val registration = scenario("registration")
    .exec(http("endpoint1")
      .post("http://localhost:7070/api/register")
      .body(RawFileBody("./Stocks.json")).asJson
      .check(status is 201)
      .check(jsonPath("$.id").saveAs("clientId")))

  setUp(scn.inject(constantUsersPerSec(200).during(180))).assertions(global.failedRequests.count.is(0))

  val sseConnection = scenario("ServerSentEvents")
    .exec { session =>
      sse("GET messages")
        .connect("/api/sse/" + session("clientId").as[String])
        .await(1)(
          sse.checkMessage("ConnectionCheck").matching(substring("connection established"))
            .check(bodyString.saveAs("InitialMessage"))
        )
    }
}

我想在第一个场景中使用保存在 Session 中的客户端 ID 来配置 SSE 端点以在第二个场景中连接。 目前,在运行场景时,我得到:

19:35:50.086 [ERROR] i.g.c.ZincCompiler$ - /home/dingo/Downloads/gatling-charts-highcharts-bundle-3.7.6/user-files/simulations/computerdatabase/SseSimulation.scala:21:15: type mismatch;
 found   : io.gatling.http.request.builder.sse.SseConnectRequestBuilder
 required: io.gatling.commons.validation.Validation[io.gatling.core.session.Session]
        .await(1)(
              ^
19:35:50.135 [ERROR] i.g.c.ZincCompiler$ - one error found
19:35:50.145 [ERROR] i.g.c.ZincCompiler$ - Compilation crashed
xsbt.InterfaceCompileFailed: null
    at xsbt.CachedCompiler0.handleErrors(CompilerBridge.scala:183)
    at xsbt.CachedCompiler0.run(CompilerBridge.scala:172)
    at xsbt.CachedCompiler0.run(CompilerBridge.scala:134)
    at xsbt.CompilerBridge.run(CompilerBridge.scala:39)
    at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
    at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:192)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
    at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:247)
    at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:182)
    at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
    at sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
    at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
    at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:210)
    at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:528)
    at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:528)
    at sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:177)
    at sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:175)
    at sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:461)
    at sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:116)
    at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
    at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
    at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:263)
    at sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:416)
    at sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:503)
    at sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:403)
    at sbt.internal.inc.Incremental$.apply(Incremental.scala:169)
    at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:528)
    at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:482)
    at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
    ... 5 common frames omitted
Wrapped by: sbt.internal.inc.CompileFailed: Compilation failed
    at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:335)
    at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:420)
    at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
    at io.gatling.compiler.ZincCompiler$.doCompile(ZincCompiler.scala:218)
    at io.gatling.compiler.ZincCompiler$.main(ZincCompiler.scala:226)
    at io.gatling.compiler.ZincCompiler.main(ZincCompiler.scala)

我怎样才能解决这个问题?

免责声明:我不了解 Scala。

所采取的行动:

  • 在我的项目中为 Gatling 创建了一个新的文件夹结构
  • 将模拟类放在./src/gatling/java/computerdatabase
  • 将 Stocks.json 放在./src/gatling/resources/Stocks.json中,并将代码中的文件路径设为绝对路径
  • Gatling Gradle 插件添加到 build.gradle
  • 检查此示例模拟以获取灵感
  • 摆弄了一下代码,阅读了Session 函数语法
package computerdatabase;

import io.gatling.javaapi.core.ScenarioBuilder;
import io.gatling.javaapi.core.Simulation;
import io.gatling.javaapi.http.HttpProtocolBuilder;

import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

public class SseSimulation extends Simulation {
    HttpProtocolBuilder httpProtocol = http
            .baseUrl("http://localhost:7070");

    ScenarioBuilder scn = scenario("Scenario Name")
            .exec(http("client id registration")
                    .post("/api/register/")
                    .body(RawFileBody("Stocks.json")).asJson()
                    .check(status().is(201))
                    .check(jsonPath("$.id").saveAs("clientId")))
            .exec(
                    sse("open channel")
                            .connect(session -> "/api/sse/" + session.getString("clientId"))
            );

    {
        setUp(scn.injectOpen(constantUsersPerSec(200).during(1)).protocols(httpProtocol)).assertions(global().failedRequests().count().is(0L));
    }
}

免责声明:我不了解 Scala。

然后切换到Java。 Gatling 3.7(您正在使用)也支持它,官方文档官方在线课程都很好地解释了它。

很多事情都错了:

  • 您提供的代码可能无法编译。 里面没有任何名为scn的东西。 请修复它,以便有人可以帮助您。
  • 您的编译错误与您提供的代码无关。 当您提供一个名为ssetest的类时,编译器会抱怨SseSimulation中的错误。 再次,请先修复您的代码示例
  • RawFileBody("./Stocks.json")是错误的。 您不应该使用相对路径。 让 ClassLoader 解析您的文件。 这个Stocks.json文件应该放在user-files/resources​​中,你应该写RawFileBody("Stocks.json")
  • 检查将数据保存到执行请求的虚拟用户的会话中。 您不能使用不同的场景,因为它们会执行不同的虚拟用户集。 您必须在同一场景中执行注册和 SSE 连接。

我建议你应该花一些时间阅读文档和查看在线课程,你最终会节省很多时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM