队列和 JMeter:与发布者和订阅者共享

你好,哈布尔! 这是我的续集 以前的出版物,其中我将讨论使用 JMeter 将消息放入队列的选项。

我们正在为一家大型联邦公司制造数据总线。 各种请求格式、转换、复杂的路由。 为了测试,您需要向队列发送大量消息。 手动操作是一种并非每个脊椎按摩师都能承受的痛苦。

队列和 JMeter:与发布者和订阅者共享

介绍

虽然一开始我不得不忍受这种痛苦。 这一切都始于 RFHUtil。 强大,但尴尬和可怕:嗯,你知道罗斯。

队列和 JMeter:与发布者和订阅者共享

在某些情况下是必不可少的,但在积极使用的情况下会逐渐下降。
方便的测试是不可能的。

有了 JMeter,一切都变得更加容易。 经过第一阶段的掌握和习惯后,快乐测试的希望开始显现。

我积极使用 JMS Publisher 和 JMS Subscriber 采样器。 与 JMS 点对点不同,这对似乎使用起来更方便。 例如,使用 JMS Selector 中的 Subscriber 可以指定一个变量,但使用 Point-to-Point 则不能(或者这种方法不是很明显)。

准备采样器

JMS出版商

  • 设置 - 每个样本。 阿帕奇 推荐 如果通过变量指定队列/主题,请使用此选项。
  • 过期时间(毫秒)= 120000。如果发生故障,测试请求将在 2 分钟后从队列中消失。
  • 使用非持久交付模式? - 真的。 国际商业机器公司 索赔该持久模式可确保在突然发生故障时可靠地保存传输的消息。 并且在非持久模式下交换速度更快。 出于测试目的,速度更为重要。

在每个发布者中,我设置了订阅者将在 JMS 选择器中使用的 jms 属性。 对于每次提交,都会在“用户参数”测试计划元素中生成一个随机值:

队列和 JMeter:与发布者和订阅者共享

这样您就可以确保读取到正确的消息。

预配置 JMS Publisher 的最终“空白”:

队列和 JMeter:与发布者和订阅者共享

JMS订阅者

  • 设置 - 每个样本。 好吧,你明白了。
  • 超时(毫秒)= 100000。如果请求在等待 100 秒后仍未到达队列,则表示出现问题。
  • 在样本之间停止? - 真的。

JMS 选择器 - 相当方便 一块。 最终 JMS 订阅者:

队列和 JMeter:与发布者和订阅者共享

如何处理传输消息中的西里尔字母。 在JMeter中,默认情况下,校对后显示是歪的。 为了避免这种情况并随时随地享受伟大和强大的事物,您需要:

  1. 将 JVM 参数添加到 JMeter“启动器”:
    -Dfile.encoding=UTF-8
  2. 使用常规行将 JSR223 后处理器添加到订阅者:
    prev.setDataEncoding("UTF-8")

发短讯

最懒的选择。 适合调试新编写的测试。 或者当您需要至少发送一些小东西时。 选择选项 消息来源-文本区域 并将消息正文放在文本块中:

队列和 JMeter:与发布者和订阅者共享

文件传输

最常见的选择。 适合大多数场景。 选择选项 消息来源 - 来自文件 并在字段中指明消息的路径 文件 - 文件名:

队列和 JMeter:与发布者和订阅者共享

将文件传输到文本字段

最通用的选择。 适合大多数场景 + 可用于没有第二个发送选项的 JMS 点对点:

队列和 JMeter:与发布者和订阅者共享

传递字节数组

最困难的选择。 适用于检查请求精确到字节的无误准确传输,无失真、SMS 和扰动。 您将无法在默认的 JMeter 中执行此操作。 这里 我确实被告知了这一点。

所以我必须下载 来源 并修改 JMS 订阅者。

替换到方法中 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 中添加文件的路径:

队列和 JMeter:与发布者和订阅者共享

还对订阅者的 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;
	}

结论

我描述了四种向队列发送消息的方法,我每天都会在实践中使用它们。 我希望这些信息能让您的生活更轻松。 接下来,我计划谈谈我测试一端有队列、另一端有数据库或文件系统的交换的经验。

节省您的时间。 感谢您的关注。

队列和 JMeter:与发布者和订阅者共享

来源: habr.com

添加评论