当前位置: 首页 > 知识库问答 >
问题:

如何在调用另一个库(生成的gRPC代码)的exec()中传递Gatling会话属性?

束阳旭
2023-03-14

新手Gatling Scala问题:我正在使用George Leung的gatling-grpc库(它以超文本传输协议库为模型)并尝试将会话中的值(在进纸器中生成)传递到非DSL、非Gatling方法调用中,特别是调用填充gRPC有效负载对象。

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

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

…因为,AFAICT,grpc调用必须是块中的最后一个内容,否则它永远不会被计算。。。然而,它不可能是块中的最后一件事,因为无法强制它返回会话对象(同样是AFAICT)。

因此,我必须使用ActionBuilder形式的execgrpc(…)返回一个调用,因此这是设计的):

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

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

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

在这个片段中:

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

…第一个调用求值${tid},因为第二个参数是表达式[T],因此作为表达式语言求值,但第二个调用无法求值${authid}${uniqId},因为定义gRPC类型GlobalId的外部生成库不知道Gatling。

所以

  • 有没有办法在加特林的DSL之外调用EL
  • 或者通过ActionBuilder访问会话对象的方法?
    • (当我使用sessionFunction表单时,我看到Gatling代码神奇地找到了一个会话对象,但我看不出它是从哪里来的——即使看字节码也没有启发性)

    Gatling 3.3.1,Scala 2.12.10

    gatling grpc图书馆位于phiSgr/gatling grpc;我使用的是0.7.0版(com.github.phisgr:gatling grpc)。

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

共有1个答案

狄河
2023-03-14

您需要Gatling JavaPB集成。

要看到这一点,请看这里。

。payload方法采用表达式[T],它是会话的别名=

你的挫败感很大程度上是不知道如何掌握一个会话。我希望这能消除困惑。

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

问题是你想要构造类型良好的有效载荷,而盖特林的EL对此无能为力。建设者的设置者想要一个T,但您只有一个表达式[T](可以从EL或$函数中选择)。创建上述库是为了处理该管道。

导入com之后。github。钓鱼者。加特林。javapb_ ,您应该编写以下内容。

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

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

 类似资料:
  • 我有多个Gatling模拟,我正试图以一种重用低级调用(即HTTP调用)的方式构建它们,同时构建不同的场景。因此,我有以下结构(为了解释当前状态,使用了echo函数): 在上面提供的测试模拟中,我们从文件中提供数据并选择我们作为Map存储到会话中的属性子集。如果在文件中找到此类属性,我们会在提交回显请求时将它们添加为表单参数。否则我们不会。在这两种情况下,我们都存储了响应正文并将其打印出来。这很好

  • 我们正在改变数据库,从一个支持8位int的数据库到一个不支持8位int的数据库。当Liquibase创建一个DB导致jOOQ生成“短”变量时,我们的代码会中断,但我们的代码使用字节/字节-这会中断代码签名。 有人建议我们继续使用以前的数据库(HSQLDB)来生成代码,而不是重新编码,它“应该”与新数据库一起运行。有不同的意见,除了直觉,我找不到任何决定性的东西,这似乎与jOOQ的设计目的背道而驰。

  • 问题内容: 我可以将值从一页传递到另一页,但我需要像这样传递值, 第1页: Page4.php Page3.php 我需要将Page1.php的文本字段中的值传递给Page2.php中的文本字段,因为表单不是直接重定向到Page2,所以我无法传递该值,我尝试了会话,表单发布方法和其他几种方法,但我尚未成功。 如果您可以帮助我提供代码或一些建议,我将非常高兴。 谢谢! 编辑.......... 我找

  • 我正在开发一个带有原生代码的Android库。此库项目将作为库添加到应用程序项目中。 我想在应用程序项目使用它时调试库。 我很确定库中的设置(makefile,构建命令,编译器选项)是可以的,因为我从库中尝试了调试器(我创建了一个虚拟活动并取消设置“库”),它的工作原理。我也意识到由于加载动态库所需的时间而可能发生的延迟,并且出于同样的原因,我认为这不是问题所在。 在应用程序项目中,我刚刚添加了本

  • 我正在尝试使用https://github.com/pseudomuto/protoc-gen-doc,我无法找到在消息中排除grpc服务/字段的一些API的方法。 在swagger中找到了相关的样式,但似乎找不到将其添加到Pro buf文件中的方法http://watson-developer-cloud.github.io/api-guidelines/swagger-coding-style

  • 我是Android 我试图创建一个应用程序,它使用ssh连接连接到Beaglebone Black,然后通过发出来自Android设备的命令来控制连接到BBB的一些外围设备。我打开(成功)一个ssh会话在AsyncWork中,而用户看到一个闪屏,如果连接成功,用户将得到一个确认,然后将能够发送预定义的命令通过点击一些可用的按钮。 接下来我要做的是让会话保持打开状态,然后每次我希望发出命令并等待BB