从Gatling表达式中获取String

时间:2014-10-13 16:22:21

标签: scala vaadin gatling

我想编写一个格式化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()...返回Expression [String]。问题是我需要这个字符串并用计算出的长度连接它。当我做message2.toString时它返回 Success(0ff1255e-e2be-4e7b-ac5c-1ff2709ce886[["0_11_12_13_login_username","v","v",["text",["s","Agent00232"]]]])因此我必须使用substring(8,message2.length - 2)来获取评估的有效负载(使用安全密钥)来计算它的长度。

是否有更好(更优雅)的方式从表达式中提取String然后使用substring(...)

1 个答案:

答案 0 :(得分:4)

  1. 不要将classTag显式传递给ELCompiler.compile。如果您真的要自己使用它,请使用ELCompiler.compile [String]。
  2. ELCompiler.compile返回一个Expression [String],别名是Session to Validation [String]的函数,所以如果你应用它,你会得到一个Validation [String](因为评估可能失败),因此toString打印成功,而不是它包含的价值。您想要的是映射此验证容器。
  3. 您在每次执行函数时反复编译表达式。将它移到功能之外。
  4. 如果无法保存lastResult,请注意会话(“lastResult”)。as [String]会崩溃。请改用验证。
  5. 使用三引号,这样您就不必转义内部双引号。
  6. 您的代码的第一部分将如下所示:

    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}"]]]]"""))