gatling - 如何在调用另一个库(生成的 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
形式:exec
grpc(...)
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。
所以...
- 有没有办法在 Gatling 的 DSL 之外调用 EL?
- 或者一种
Session
通过ActionBuilder
?- (当我使用 sessionFunction 表单时,我看到 Gatling 代码神奇地找到了一个 Session 对象,但我看不出它是从哪里来的——即使查看字节码也没有启发性)
- 或者,回到 的
Expression[T]
形式exec
,有没有办法ActionBuilder
返回一个Session
对象? - 或者,仍然在表单中,如果我有办法确保表达式被评估(即命令式编程)
Expression[T]
,我可以简单地传回现有对象。Session
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集成。
要查看实际情况,请参见此处。
该.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)
不起作用。
推荐阅读
- dns - Nameserver 在不同的机器上返回不同的记录
- windows - 将 Windows 帐户名称泄漏到 .Net Core App 配置中
- c# - 创建 .NET Core API 时如何解决“Task could not find al.exe using the SdkToolPath”错误?
- c# - 即使我们期望的是一个特定的实现,我们是否应该使用接口作为依赖项(在 ctor 中)?
- android - Android Firebase 事务有一个简单的计数器问题
- swift - 避免在逗号分隔的两个字母单词列表中出现重复项
- python - ModuleNotFoundError 尝试从同一文件夹导入
- python - 在阅读时将字符串列解析为布尔值?
- python - upload_to 属性被未知来源覆盖
- android - 在 android 中使用 MVVM 架构时在哪里发出 API 请求?