JMeter的JavaRequest探究

  • 2019 年 10 月 3 日
  • 筆記

1.背景

最近筆者的一位老朋友諮詢了一個問題:在自定義的Java請求中如何編寫多個請求?老朋友反應他們發送請求只能基於這種Java請求形式(代碼調需用三方封裝的jar包)。這個問題恰巧不久前在筆者所在的飛測QQ群中有人諮詢過,當時只回答了用SubResult.

2.目的

本次的目的就是深挖下:JMeter的JavaRequest請求如何編寫過個SamplerResult(筆者本想網上找找資料,一看全是比較常規的JavaRequest請求編寫,沒有相關SubResult的使用方法,只能靠自己)

3.實戰

筆者在之前已經多次寫過Java請求腳本,本次如何搭建腳本編寫環境就及Java請求中有哪些約定好結構本文不贅述,大家自行百度下。其實主要還是講思路,包括以後筆者寫文章大都主要是講解決問題的思路。

  • 碰到這個問題,我第一時間想到的是用SubResult(因為筆者長期研究JMeter底層源碼)

然後就開始擼代碼:

image_thumb4

image_thumb13[4]

恩,感覺很完美!然而在執行後:

image_thumb15

從上圖看出,拋出了sampleEnd called twice 異常,筆者將代碼做了微調:

image_thumb21

恩,感覺應該沒問題了,再次執行下:

image_thumb24

我擦,咋又報錯了。。。這次報了setEndTime must be called after setStartTime ,筆者於是看了JMeter底層代碼,看看哪裡拋出的這個異常。如下圖:

image_thumb28

恩? startTime值為零才會拋出這個異常,感覺越來越有意思了。帶着這個疑問筆者去查看了JMeter的API文檔,這才發現導致此現象的真兇。

image_thumb30

當回翻譯官:

addRawSubResult(SampleResult subResult) 向集合中添加子結果,而不更新任何父字段。
addSubResult(SampleResult subResult) 添加子結果並調整父位元組計數和結束時間。
addSubResult(SampleResult subResult, boolean renameSubResults) 添加子結果並調整父位元組計數和結束時間。

我們代碼中用的是addSubResult(SampleResult subResult, boolean renameSubResults),筆者又調整了代碼:

image_thumb33

執行結果:

image_thumb35

ok,執行成功(出現Log4j2異常是因為筆者沒有配置log4j2.xml,不要在意這個細節),但總感覺還是缺點什麼?為了更真實筆者有微改了下代碼:

image_thumb47

image_thumb50

OKay,打包到JMeter運行如下:

image_thumb53

image_thumb55

筆者在看聚合報告時,又遇到問題了。。。

image_thumb62

恩?只顯示父請求聚合數據,咋不顯示子請求數據呢?筆者目前發現解決辦法是:執行的時候先保存JTL結果見文件,場景結束後再次用聚合報告打開此JTL結果文件。

image_thumb65

okay,最終問題解決。。。如果大家發現更好的解決方式,請不吝賜教!