你好,哈布爾! 這是我的續集
我們正在為一家大型聯邦公司製造資料匯流排。 各種請求格式、轉換、複雜的路由。 為了測試,您需要向佇列發送大量訊息。 手動操作是一種並非每個脊椎按摩師都能承受的痛苦。
介紹
雖然一開始我不得不忍受這種痛苦。 這一切都始於 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;
}
結論
我描述了四種向佇列發送訊息的方法,我每天都會在實踐中使用它們。 我希望這些資訊能讓您的生活更輕鬆。 接下來,我計劃談談我測試一端有佇列、另一端有資料庫或檔案系統的交換的經驗。
節省您的時間。 感謝您的關注。
來源: www.habr.com