如何在调用另一个库(生成的 gRPC 代码)的 exec() 中传递 Gatling 会话属性?
How to pass Gatling session attributes in an exec() invoking another library (generated gRPC code)?
新手 Gatling+Scala 问题:我正在使用 George Leung 的 gatling-grpc 库(以 http 库为模型)并尝试从会话(在馈线中生成)传递一个值, 进入非 DSL、非 Gatling 方法调用,特别是调用填充 gRPC 有效负载对象。
在开始之前,让我补充一下,我似乎无法使用 exec
的 sessionFunction (Expression[T]
) 形式,这将解决我的问题:
.exec{ session => { … grpc(…).rpc(…)… }}
...因为,AFAICT,grpc
调用必须是块中的最后一件事,否则它永远不会被评估...但它 不能 块中的最后一件事,因为无法将其强制为 return 会话对象(再次,AFAICT)。
因此,我必须使用 exec
的 ActionBuilder
形式(grpc(...)
returns a Call
所以这是设计的):
.exec( grpc(…).rpc(…)... )
这有效……直到我有一个 gRPC payload(即非 Gatling)方法调用,我需要向其传递一个非常量值(来自馈线) .
在这种情况下,我无权访问 Session
对象,并且没有应用 Gatling 表达式语言,因为定义我需要使用(以生成有效负载)的 gRPC 类型的库不知道加特林机。
所以,在这个片段中:
.header(transactionIdHeader)("${tid}.SAVE")
.payload(Student.newBuilder()
.setId(GlobalId.newBuilder().setValue("${authid}_${uniqId}").build()).build())
)
...第一次调用评估 ${tid}
因为第二个参数中的参数是 Expression[T]
,因此被评估为表达式语言,但第二次调用无法评估 ${authid}
或${uniqId}
因为定义 gRPC 类型 GlobalId 的外部生成库不了解 Gatling。
所以...
- 有没有办法在 Gatling 的 DSL 之外调用 EL?
- 或者通过
ActionBuilder
访问 Session
对象的方法?
- (当我使用 sessionFunction 形式时,我看到 Gatling 代码神奇地找到了一个 Session 对象,但我看不出它是从哪里来的——即使查看字节码也没有说明)
- 或者,回到
exec
的 Expression[T]
形式,有没有办法让 ActionBuilder
return 成为 Session
对象?
- 或者,仍然是
Expression[T]
形式,如果我有办法确保 grpc()...
表达式被计算(即命令式编程)。
加特林 3.3.1,斯卡拉 2.12.10
gatling-grpc 库位于 phiSgr/gatling-grpc;我正在使用版本 0.7.0 (com.github.phisgr:gatling-grpc
)。
(当然,gRPC Java 代码是从 .proto 文件生成的。)
您需要 Gatling-JavaPB 集成。
要查看实际效果,请参阅 here。
.payload
方法采用 Expression[T]
,对于 Session => Validation[T]
是 an alias。用简单的英语来说,这是一个从会话中构造有效载荷的函数,可能会失败。
您的大部分挫败感是因为不知道如何获得 Session
。我希望这能消除困惑。
在最坏的情况下,可以write a lambda to create an expression. But for string interpolation or accessing one single object, Gatling provides an implicit conversation将 EL String
变成 Expression
。
问题是您想要构建类型良好的有效载荷,而 Gatling 的 EL 对此无能为力。建造者的二传手想要一个 T
,但你只有一个 Expression[T]
(来自 EL 或 $
function)。上面提到的库是为处理该管道而创建的。
导入后com.github.phisgr.gatling.javapb._
,应该写成下面的内容
...
.payload(
Student.getDefaultInstance
.update(_.getIdBuilder.setValue)("${authid}_${uniqId}")
)
为了完整起见,请参阅 warning in Gatling's documentation 以了解为什么在 .exec(sessionFunction)
中定义操作不起作用。
新手 Gatling+Scala 问题:我正在使用 George Leung 的 gatling-grpc 库(以 http 库为模型)并尝试从会话(在馈线中生成)传递一个值, 进入非 DSL、非 Gatling 方法调用,特别是调用填充 gRPC 有效负载对象。
在开始之前,让我补充一下,我似乎无法使用 exec
的 sessionFunction (Expression[T]
) 形式,这将解决我的问题:
.exec{ session => { … grpc(…).rpc(…)… }}
...因为,AFAICT,grpc
调用必须是块中的最后一件事,否则它永远不会被评估...但它 不能 块中的最后一件事,因为无法将其强制为 return 会话对象(再次,AFAICT)。
因此,我必须使用 exec
的 ActionBuilder
形式(grpc(...)
returns a Call
所以这是设计的):
.exec( grpc(…).rpc(…)... )
这有效……直到我有一个 gRPC payload(即非 Gatling)方法调用,我需要向其传递一个非常量值(来自馈线) .
在这种情况下,我无权访问 Session
对象,并且没有应用 Gatling 表达式语言,因为定义我需要使用(以生成有效负载)的 gRPC 类型的库不知道加特林机。
所以,在这个片段中:
.header(transactionIdHeader)("${tid}.SAVE")
.payload(Student.newBuilder()
.setId(GlobalId.newBuilder().setValue("${authid}_${uniqId}").build()).build())
)
...第一次调用评估 ${tid}
因为第二个参数中的参数是 Expression[T]
,因此被评估为表达式语言,但第二次调用无法评估 ${authid}
或${uniqId}
因为定义 gRPC 类型 GlobalId 的外部生成库不了解 Gatling。
所以...
- 有没有办法在 Gatling 的 DSL 之外调用 EL?
- 或者通过
ActionBuilder
访问Session
对象的方法?- (当我使用 sessionFunction 形式时,我看到 Gatling 代码神奇地找到了一个 Session 对象,但我看不出它是从哪里来的——即使查看字节码也没有说明)
- 或者,回到
exec
的Expression[T]
形式,有没有办法让ActionBuilder
return 成为Session
对象? - 或者,仍然是
Expression[T]
形式,如果我有办法确保grpc()...
表达式被计算(即命令式编程)。
加特林 3.3.1,斯卡拉 2.12.10
gatling-grpc 库位于 phiSgr/gatling-grpc;我正在使用版本 0.7.0 (com.github.phisgr:gatling-grpc
)。
(当然,gRPC Java 代码是从 .proto 文件生成的。)
您需要 Gatling-JavaPB 集成。
要查看实际效果,请参阅 here。
.payload
方法采用 Expression[T]
,对于 Session => Validation[T]
是 an alias。用简单的英语来说,这是一个从会话中构造有效载荷的函数,可能会失败。
您的大部分挫败感是因为不知道如何获得 Session
。我希望这能消除困惑。
在最坏的情况下,可以write a lambda to create an expression. But for string interpolation or accessing one single object, Gatling provides an implicit conversation将 EL String
变成 Expression
。
问题是您想要构建类型良好的有效载荷,而 Gatling 的 EL 对此无能为力。建造者的二传手想要一个 T
,但你只有一个 Expression[T]
(来自 EL 或 $
function)。上面提到的库是为处理该管道而创建的。
导入后com.github.phisgr.gatling.javapb._
,应该写成下面的内容
...
.payload(
Student.getDefaultInstance
.update(_.getIdBuilder.setValue)("${authid}_${uniqId}")
)
为了完整起见,请参阅 warning in Gatling's documentation 以了解为什么在 .exec(sessionFunction)
中定义操作不起作用。