获取字符串了加特林的表达(Getting the String out of a Gatling e

2019-10-21 03:45发布

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

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

第一个数字是则长度有某种后跟净荷会话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()...返回一个表达式[字符串]。 问题是,我需要这个字符串,并用计算出的长度Concat的它。 当我做message2.toString它返回Success(0ff1255e-e2be-4e7b-ac5c-1ff2709ce886[["0_11_12_13_login_username","v","v",["text",["s","Agent00232"]]]])并且为此我必须使用子串(8,message2.length - 2),以获得评估有效载荷(具有安全密钥)来计算的它的长度。

有没有更好的(更优雅)的方式提取出来的字符串表达式,则使用的substring(...)

Answer 1:

  1. 不要明确地传递给classTag ELCompiler.compile。 如果你真的是这种用自己,用ELCompiler.compile [字符串。
  2. ELCompiler.compile返回表达式[字符串],别名会议审定[字符串]功能,所以如果你应用它,你会得到一个验证[字符串](因为评价可能失败),因此打印的toString的成功,而不是看重它包含的内容。 你想要的是映射此验证容器。
  3. 你一遍遍编译表达再次,每个函数执行。 移动它之外的功能。
  4. 要注意的是会话(“的lastResult”)。作为[字符串]将崩溃,如果的lastResult无法保存。 使用验证来代替。
  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}"]]]]"""))


文章来源: Getting the String out of a Gatling expression