scala - 从 Gatting 表达式中获取字符串

标签 scala vaadin gatling

我想编写一个函数来格式化 Vaadin 消息。这些消息的格式为

108|0ff1255e-e2be-4e7b-ac5c-1ff2709ce886[["0_11_12_13_login_username","v","v",["text",["s","Agent00232"]]]]

第一个数字是长度,然后是某种 session ID(后来称为 vaadin_security_key),后面是有效负载。 (在此示例中,我将值“Agent00232”设置为连接器 ID“0_11_12_13_login_username”的文本字段)我编写了一个如下函数:

 def sendMessage(name: String, vaadinCommand: String) = {
    def createMessage(session: Session) = {
      val message = session("vaadin_security_key").as[String] + "\u001d" + vaadinCommand
      val message2 = ELCompiler.compile(message)(classTag[String])(session).toString
      val message3 = message2.substring(8, message2.length - 2)
      val len = message3.length
      val completeMessage = len.toString() + "|" + message3
      completeMessage
    }
    exec(
      ws(name)
        .sendText(createMessage)
        .check(wsAwait
          .within(Vaadin.defaultTimeout)
          .until(1)
          .regex("""(.+)""")
          .saveAs("lastResult")))
      .exec { session =>
        println(session("lastResult").as[String])
        session
      }
  }

我想像这样使用这个方法并在字符串中使用 EL 表达式:

exec(Vaadin.sendMessage("setting Name", "[[\"0_11_12_13_login_username\",\"v\",\"v\",[\"text\",[\"s\",\"${username}\"]]]]"))

因此我必须在计算长度之前评估字符串。方法 ELCompiler.compile()... 返回一个 Expression[String]。问题是我需要这个字符串并将其与计算的长度连接起来。当我执行 message2.toString 它返回 成功(0ff1255e-e2be-4e7b-ac5c-1ff2709ce886[["0_11_12_13_login_username","v","v",["text",["s","Agent00232"]]]])因此我必须使用 substring(8, message2.length - 2) 来获取评估的有效负载(带有安全 key )来计算它的长度。

是否有比使用 substring(...) 更好(更优雅)的方法从表达式中提取字符串?

最佳答案

  1. 不要显式地将 classTag 传递给 ELCompiler.compile。如果您确实要自己使用它,请使用 ELCompiler.compile[String]。
  2. ELCompiler.compile 返回一个 Expression[String],将 Session 的函数别名为 Validation[String],因此如果应用它,您会得到一个 Validation[String](因为评估可能会失败),因此 toString 会打印 Success ,而不是它包含的值。您想要的是映射此验证容器。
  3. 在每次函数执行时,您都会一遍又一遍地编译表达式。将其移到函数之外。
  4. 请注意,如果无法保存 lastResult,session("lastResult").as[String] 将会崩溃。请改用验证。
  5. 使用三引号,这样就不必转义内部双引号。

代码的第一部分将如下所示:

import io.gatling.core.session._
import io.gatling.core.session.el._

def sendMessage(name: String, vaadinCommand: String) = {

  val message = ("${vaadin_security_key}\u001d" + vaadinCommand).el[String]

  def createMessage = message.map { resolvedMessage =>
    resolvedMessage.length + "|" + resolvedMessage
  }

  exec(
    ws(name)
      .sendText(createMessage)
      .check(wsAwait
        .within(Vaadin.defaultTimeout)
        .until(1)
        .regex("""(.+)""")
        .saveAs("lastResult")))
    .exec { session =>
      println(session("lastResult").validate[String])
      session
    }
}

然后你可以这样调用它:

exec(Vaadin.sendMessage("setting Name", """[["0_11_12_13_login_username","v","v",["text",["s","${username}"]]]]"""))

关于scala - 从 Gatting 表达式中获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344554/

相关文章:

layout - 占用 Vaadin Gridlayout 中的可用空间,但考虑换行

scala - Gatling-scala 检查 2 个状态代码(或)

scala - IntelliJ 中 Scala 2.13.0 的 Gatling 兼容性问题

scala - 在 Rx(或 RxJava/RxScala)中,如何制作一个自动重置的有状态锁存器映射/过滤器来测量流中耗时以触及障碍?

java - 并行程序在scala中运行

string - 将括号的子集映射到字符

java - Vaadin 和 JPA 容器,是否存储 beans

java - Vaadin 复选框——在标题上添加换行符

scala - 使用同一用户的后续请求的 Feeder 中的一个请求的 Ga特林 Feeder 内生成的值

scala - 在 IntelliJ 中链接到外部 Scala API 文档