首页 > 解决方案 > 如何在调用另一个库(生成的 gRPC 代码)的 exec() 中传递 Gatling 会话属性?

问题描述

新手 Gatling+Scala 问题:我正在使用George Leung的 gatling-grpc 库(仿照 http 库)并尝试将会话中的值(在馈线中生成)传递到非 DSL、非-Gatling 方法调用,特别是填充 gRPC 有效负载对象的调用。


在开始之前,让我补充一点,我似乎无法使用 sessionFunction ( Expression[T]) 形式exec,这将解决我的问题:

.exec{ session => { … grpc(…).rpc(…)… }}

...因为,AFAICT,grpc调用必须是块中的最后一件事,否则它永远不会被评估......但它不能是块中的最后一件事,因为没有办法强制它返回一个 Session 对象(再次,AFAICT)。


因此,我必须使用(返回 a所以这是设计的)的ActionBuilder形式:execgrpc(...)Call

.exec( grpc(…).rpc(…)... )

这有效……直到我有一个 gRPC有效负载(即非 Gatling)方法调用,我需要向该方法调用传递一个非常量值(来自馈线)。

在这种情况下,我无法访问Session对象,并且未应用 Gatling 表达式语言,因为定义我需要使用的 gRPC 类型(生成有效负载)的库不了解 Gatling。

所以,在这个片段中:

  .header(transactionIdHeader)("${tid}.SAVE") 
  .payload(Student.newBuilder()
    .setId(GlobalId.newBuilder().setValue("${authid}_${uniqId}").build()).build())
  )

…第一次调用会评估${tid},因为第二个括号中的参数是Expression[T],因此被评估为表达式语言,但第二次调用无法评估${authid},或者${uniqId}因为定义 gRPC 类型 GlobalId 的外部生成库不了解 Gatling。

所以...

  1. 有没有办法在 Gatling 的 DSL 之外调用 EL?
  2. 或者一种Session通过ActionBuilder?
    • (当我使用 sessionFunction 表单时,我看到 Gatling 代码神奇地找到了一个 Session 对象,但我看不出它是从哪里来的——即使查看字节码也没有启发性)
  3. 或者,回到 的Expression[T]形式exec,有没有办法ActionBuilder返回一个Session对象?
  4. 或者,仍然在表单中,如果我有办法确保表达式被评估(命令式编程)Expression[T],我可以简单地传回现有对象。Sessiongrpc()...

加特林 3.3.1,斯卡拉 2.12.10

gatling-grpc 库位于phiSgr/gatling-grpc;我正在使用版本 0.7.0 ( com.github.phisgr:gatling-grpc)。

(当然,gRPC Java 代码是从 .proto 文件生成的。)

标签: gatling

解决方案


您需要Gatling-JavaPB集成。

要查看实际情况,请参见此处


.payload方法采用Expression[T],它是的别名Session => Validation[T]用简单的英语来说,这是一个从会话中构造有效负载的函数,可能会失败。

您的大部分挫败感是不知道如何获得Session. 我希望这能消除混乱。


在最坏的情况下,可以编写一个 lambda 来创建一个表达式。但是对于字符串插值或访问单个对象,Gatling 提供了一种隐式对话来将 ELString转换为Expression.

问题是您想要构建类型良好的有效载荷,而 Gatling 的 EL 对此无能为力。建设者的二传手想要 a T,但你只有一个Expression[T](来自 EL 或$function)。创建上面提到的库是为了处理该管道。


导入后com.github.phisgr.gatling.javapb._,您应该编写以下内容。

...
.payload(
  Student.getDefaultInstance
    .update(_.getIdBuilder.setValue)("${authid}_${uniqId}")
)

为了完整起见,请参阅Gatling 文档中的警告,了解为什么定义操作.exec(sessionFunction)不起作用。


推荐阅读