你好,哈布尔! 这是我的续集
我们正在为一家大型联邦公司制造数据总线。 各种请求格式、转换、复杂的路由。 为了测试,您需要向队列发送大量消息。 手动操作是一种并非每个脊椎按摩师都能承受的痛苦。
介绍
虽然一开始我不得不忍受这种痛苦。 这一切都始于 RFHUtil。 强大,但尴尬和可怕:嗯,你知道罗斯。
在某些情况下是必不可少的,但在积极使用的情况下会逐渐下降。
方便的测试是不可能的。
有了 JMeter,一切都变得更加容易。 经过第一阶段的掌握和习惯后,快乐测试的希望开始显现。
我积极使用 JMS Publisher 和 JMS Subscriber 采样器。 与 JMS 点对点不同,这对似乎使用起来更方便。 例如,使用 JMS Selector 中的 Subscriber 可以指定一个变量,但使用 Point-to-Point 则不能(或者这种方法不是很明显)。
准备采样器
JMS出版商
- 设置 - 每个样本。 阿帕奇
推荐 如果通过变量指定队列/主题,请使用此选项。 - 过期时间(毫秒)= 120000。如果发生故障,测试请求将在 2 分钟后从队列中消失。
- 使用非持久交付模式? - 真的。 国际商业机器公司
索赔 该持久模式可确保在突然发生故障时可靠地保存传输的消息。 并且在非持久模式下交换速度更快。 出于测试目的,速度更为重要。
在每个发布者中,我设置了订阅者将在 JMS 选择器中使用的 jms 属性。 对于每次提交,都会在“用户参数”测试计划元素中生成一个随机值:
这样您就可以确保读取到正确的消息。
预配置 JMS Publisher 的最终“空白”:
JMS订阅者
- 设置 - 每个样本。 好吧,你明白了。
- 超时(毫秒)= 100000。如果请求在等待 100 秒后仍未到达队列,则表示出现问题。
- 在样本之间停止? - 真的。
JMS 选择器 - 相当方便
如何处理传输消息中的西里尔字母。 在JMeter中,默认情况下,校对后显示是歪的。 为了避免这种情况并随时随地享受伟大和强大的事物,您需要:
- 将 JVM 参数添加到 JMeter“启动器”:
-Dfile.encoding=UTF-8
- 使用常规行将 JSR223 后处理器添加到订阅者:
prev.setDataEncoding("UTF-8")
发短讯
最懒的选择。 适合调试新编写的测试。 或者当您需要至少发送一些小东西时。 选择选项 消息来源-文本区域 并将消息正文放在文本块中:
文件传输
最常见的选择。 适合大多数场景。 选择选项 消息来源 - 来自文件 并在字段中指明消息的路径 文件 - 文件名:
将文件传输到文本字段
最通用的选择。 适合大多数场景 + 可用于没有第二个发送选项的 JMS 点对点:
传递字节数组
最困难的选择。 适用于检查请求精确到字节的无误准确传输,无失真、SMS 和扰动。 您将无法在默认的 JMeter 中执行此操作。
所以我必须下载
替换到方法中 extractContent(..)
线:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");
到:
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
并重建了 JMeter。
剩下的就是添加几个 JSR223 采样器。 第一个是在发布者/订阅者对之前创建包含随机字节的 DAT 文件:
import org.apache.commons.lang3.RandomUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
try {
FileOutputStream fos = new FileOutputStream(RESULT_FILE);
fos.write(arr);
fos.close();
} catch (IOException e) {
System.out.println("file not found");
}
第二个 - 在脚本末尾,删除文件:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();
并且不要忘记在 Publisher 中添加文件的路径:
还对订阅者的 JSR223 断言进行检查 - 将源字节与到达接收者队列的字节进行比较:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);
if (Arrays.equals(originalArray, changedArray))
{
SampleResult.setResponseMessage("OK");
} else {
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Comparison failed");
SampleResult.setResponseData("Bytes have changed","UTF-8");
IsSuccess=false;
}
结论
我描述了四种向队列发送消息的方法,我每天都会在实践中使用它们。 我希望这些信息能让您的生活更轻松。 接下来,我计划谈谈我测试一端有队列、另一端有数据库或文件系统的交换的经验。
节省您的时间。 感谢您的关注。
来源: habr.com