队列和JMeter:与发布者和订阅者进行交换

哈Ha!

这是我以前的出版物的续篇,在该出版物中,我将讨论使用JMeter将消息放入队列中的选项。

我们为一家大型联邦公司制造一条数据总线。 各种查询格式,转换,复杂的路由。 为了进行测试,您需要在队列中发送很多消息。 手动-并非每个手动工程师都可以解决的痛苦。



引言


尽管起初我不得不忍受这种痛苦。 一切始于RFHUtil。 强大,但不舒服且令人恐惧: 嗯,你知道罗斯。



在某些情况下必不可少,但在主动使用的情况下会稳定下降。
与他进行方便的测试是不可能的。

有了JMeter,事情变得更容易了。 经过第一阶段的掌握和习惯后,希望能进行一次愉快的测试。

我积极使用JMS Publisher和JMS Subscriber采样器。 与JMS点对点不同,这对夫妇使用起来更方便。 例如,在JMS选择器的订户中,可以在点对点中指定一个变量-否(或此方法不太明显)。

采样器准备


JMS发布者


  • 设置-每个样本。 如果通过变量指定队列/主题,Apache 建议使用此选项。
  • 到期时间(ms)=120000。如果失败,则2分钟后测试请求将从队列中消失。
  • 使用非持久交付模式? -是的 IBM 声称 ,持久性模式可在突发故障时提供可靠的消息持久性。 在非持久模式下共享更快。 出于测试目的,速度更为重要。

在每个发布服务器中,我设置订户将在JMS选择器中使用的jms属性。 对于每个货件,在“用户参数”测试计划元素中生成一个随机值:



因此,您可以确保已阅读正确的消息。

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



JMS订户


  • 设置-每个样本。 好吧,你明白了。
  • 超时(ms)=100000。如果在等待100秒后请求没有进入队列,则出了点问题。
  • 在样本之间停止? -是的


JMS Selector是一件非常方便的事情 。 JMS订阅者摘要:



如何处理已发送消息中的西里尔字母。 在JMeter中,默认情况下,减法后它会歪斜显示。 为避免这种情况,并随时随地享受强大的力量,您需要:

  1. 将JVM参数添加到JMeter“启动器”中:
    -Dfile.encoding=UTF-8 
  2. 将groovy上的一行添加到订阅者的JSR223 PostProcessor:
     prev.setDataEncoding("UTF-8") 

文字传输


最懒惰的选择。 适用于调试新编写的测试。 或者在您需要发送至少一些小东西的情况下。 选择选项消息源-文本区域,然后将消息正文放置在文本块中:



档案传输


最常见的选择。 适用于大多数情况。 选择选项消息源-来自文件,然后在文件-文件名字段中指定消息的路径



将文件传输到文本字段


最通用的选项。 适用于大多数方案+可以在没有第二个发送选项的JMS点对点中使用:



字节数组传输


最困难的选择。 适用于检查请求到字节的准确无误的传输,没有失真,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:\\temp\\randomBytes.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; } 

结论


他描述了队列中发送消息的四种方式,我每天都会在实践中使用这种方式。 希望这些信息使您的生活更轻松。 在续篇中,我计划谈谈我在测试交换方面的经验,一方面是队列,另一方面是数据库或文件系统。

照顾好你的时间。 并感谢您的收看。

图片

Source: https://habr.com/ru/post/zh-CN446536/


All Articles