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

我正在通过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终点,请让我知道它如何为您效劳。

以上是 Jmeter protobuf测试。无法读取Protobuf讯息 的全部内容, 来源链接: utcz.com/qa/432258.html

回到顶部