当前位置: 首页 > 面试题库 >

Jmeter protobuf测试。无法读取Protobuf讯息

长孙作人
2023-03-14
问题内容

我正在通过protobuf协议并使用HTTP Request Sampler测试一个项目。
目标应用服务器也是用Java编写的。
响应错误存在问题:

“Could not read Protobuf message: Protocol message contained an invalid tag
(zero).; nested exception is
com.google.protobuf.InvalidProtocolBufferException: Protocol message
contained an invalid tag (zero)”

情况是这种情况并非在100%的请求中发生。当我使用
HttpClient4时,它大约占失败请求的30-40%。在我将其更改为
HttpClient3.1之后,错误率降低至〜10%,这也不是什么
好事。

要发送protobuf消息,我在HttpSampler的Bodydata选项卡中使用了变量$ {data}
。然后在BeanShell preProcessor中执行下一个操作:

(import and non-necessary stuff were ommited)
MapViewport mv = MapRequest.MapViewport.newBuilder().setMaxX(mc.getX()+15).setMaxY(mc.getY()+15).setMinX(mc.getX()-15).setMinY(mc.getY()-15).build();

byte[] data = mv.toByteArray();
vars.put("data", new String(data));

我也尝试使用其他编码,例如新的String(data,“ UTF-8”)
等。

如果查看“查看结果树”,可以在“请求”选项卡上查找,我可以说所有失败的
消息都包含“?” 符号

似乎不应该发送一些奇怪的符号,但是
将字节数组保存到String 之后,大约有10%的请求包含了这些符号。


问题答案:

我完全相信您的问题是,在从二进制流转换为String然后又返回时,您丢失了一些不可打印的字符。我正在
考虑两种可能的解决方法:

  1. 将二进制数据写入文件中,而不是保存为字符串,然后在文件部分的正文中将文件名用作HTTP采样器中的变量

  2. 使用beanshell采样器,并使用体内的二进制数据构造自己的HTTPClient对象和POST请求,并自行触发,而不是使用HTTP采样器

由于所有其他文件I / O,我不喜欢第一种选择。我不
喜欢第二个选项,因为现在测量响应时间将包括
您正在beanshell中执行的所有请求程序集-因此您必须选择
一个使您烦恼的选项。

让我知道,如果您想让我为这两种情况编写一些代码示例。

编辑:对于使用HttpClient 4的beanshell HTTP调用:

import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;

byte[] data = null;
//...assign protobuf binary buffer to data...

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://127.0.0.1");
HttpEntity entity = new ByteArrayEntity(data);
post.setEntity(entity);
post.setHeader(HttpHeaders.CONTENT_TYPE, "application/octet-stream");
HttpResponse response=null;
try {
    response = client.execute(post);
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

ResponseCode = response.getStatusLine().getStatusCode().toString();
//if some assert is true then
Issuccess = true;
ResponseMessage="Some Response Message";

这是未经测试的protobuf终点,请让我知道它如何为您效劳。



 类似资料:
  • 目录结构如下: 运行测试命令 unittest 会读取所有 test 开头的 .py 文件,但是我的两个 test_meta.py 和 test_sample.py 居然没有被读取? 但是写成 python -m unittest testing.test_sample 和 python -m unittest testing.test_meta 是可以的,直接 python -m unittes

  • 看来我无法导入这个包:github。com/golang/protobuf/proto 当我尝试构建或使用go-get时,我得到:无法加载github。com/golang/protobuf/proto:github模块。com/golang/protobuf@latest(v1.3.2)找到,但不包含包github。com/golang/protobuf/proto 这是一个受欢迎的软件包,我很

  • 我正在测试一些react组件,这是一个基本的测试套件,只是为了知道组件是否正在呈现及其子组件。 我使用创建存储库,并使用在提供程序中装入容器,但即使是在模拟正确的存储库时,也总是会触发此错误: TypeError:无法读取未定义的属性“pathname” 和(甚至更简单的)组件/容器: 容器: 我搞不清楚测试的问题,mockStore的格式是正确的:

  • 我已经按照下面的链接使用spring的Swagger为我的REST服务创建API文档。 http://jakubstas.com/spring-jersey-swagger-configuration/#comment-1726 一切都很顺利,但当我试图使用url http://localhost:8080/rest/api-docs访问swagger的api文档时,我发现无法读取swagger

  • 与SonarQube类似,它不会通过Gradle显示每个文件的详细报告,但不会显示dupe。 声纳Qube版本3.7.4 Gradle版本2.1 运行会生成一个文件test.execSonar会拾取该文件 然而,在刷新上述项目时,它显示覆盖率为0% 单元测试覆盖率 0.0% 0.0% 线路覆盖率 0.0% 分支覆盖率 我已经设定好了 我已经尝试了\和向前斜杠-这没有区别 有什么想法吗? 编辑 根据

  • 我是新来的node.js.我正在尝试创建一个注册页面,并使用mysql将输入的值保存在数据库中。 我可以通过在请求头上传递参数来实现这一点。但是,在请求头中传递参数始终不是一个好主意。所以尝试在请求体上传递参数。 我使用邮差测试我的node.js服务。 下面是我的演示应用程序的github链接 https://github.com/debasish283/node_gulp 我还需要做什么来传递请