隊列和 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:與發布者和訂閱者共享

來源: www.habr.com

添加評論