Jmeter 配置元件(一):計數器
在 Jmeter 中,通過函數 ${__counter(,)}
可以實現每次加 1 1 1 的計數效果。但如果步長不為 1 1 1,則要利用到我們的計數器。
函數 | 作用 |
---|---|
${__counter(,)} | 計數器,每次加 1 |
${__dateTimeConvert(,)} | 時間格式轉換 |
${__intSum(,)} | 整數相加 |
${__P(,)} | 獲取屬性 |
${__setProperty(,)} | 設置屬性 |
${__Random(,)} | 隨機數 |
${__threadNum} | 線程編號 |
${__time(,)} | 獲取當前時間戳 |
${__V(,)} | 拼接 |
我們首先添加一個 線程組。我們設置 線程數 為 5 5 5,Ramp-Up
時間為 1 秒,為了便于觀測,循環次數 設為 3 3 3。
既然要了解計數器,首先給線程組添加一個 計數器。操作:線程組(右鍵添加)?? 配置元件 ?? 計數器。
我們對計數器做出如下設置:
- 開始值(
Starting value
):給定計數器的起始值、初始值,第一次迭代時,會把該值賦給計數器。 - 遞增(
Increment
):每次迭代后,給計數器增加的值。 - 最大值(
Maximum value
):達到最大值時,自動重置初始值;默認的最大值為 2 63 ? 1 2^{63}-1 263?1,即Long.MAX_VALUE
。 - 數字格式(
Number format
):可選格式,比如 000,格式化為 001,002 … 三位,不足補 0;默認格式為Long.toString()
,但是默認格式下,還是可以當作數字使用。 - 引用名稱(
Exported Variable Name
):用于控制在其它元素中引用該值,比如:變量名稱為reference_name
,形式:${reference_name}
。 - 與每用戶獨立的跟蹤計數器(
Track Counter Independently for each User
):如果不勾選,即全局的計數器,比如用戶#1
獲取值為 1 1 1,用戶#2
獲取值則為 2 2 2;如果勾選,即獨立的計數器,則每個用戶有自己的值:比如用戶#1
獲取值為 1 1 1,用戶#2
獲取值也為 1 1 1(注:網上很多帖子這個參數都解釋反了,估計是某一篇說錯了,然后其他人直接搬過去都沒有驗證過,本文有驗證)。 - 在每個線程組迭代上重置計算器(
Reset counter on each Thread Group Iteration
):可選,僅勾選與每用戶獨立的跟蹤計數器時可用。
為了方便觀察輸出,我添加了一個 JSR223 Sampler。
我們再添加一個 查看結果樹,并允許將所有數據寫入一個文件(待會有用)。
現在我們可以執行看一看。
首先來看一下 日志:
再看一下結果樹:
因為前面我們并未勾選 與每用戶獨立的跟蹤計數器,所以它是一個全局的計數器,所有的線程會共享這個計數器。
現在我們勾選上 與每用戶獨立的跟蹤計數器。
再來看看結果
可以看到,線程之間并沒有共享計數器,而是獨立的計數器。
現在我們再勾選上 在每個線程組迭代上重置計算器。
我們再來看看結果。
因為線程之間獨立,且每一次循環也獨立,所以結果全部都是一樣的。
我們再把 最大值 改小一點看看。
查看結果樹。
我們會發現,當超過最大值以后,計數器會重新從頭開始計算(取 ≤ 最大值的數據)。
再來一個好玩的。 10 10 10 個線程一直循環,且不設最大值。跑一會,看看會得到啥?
我大概跑了二三十秒。
結果樹不方便查看,所以寫入到了 CSV 文件中,很快就生成了 100 多 MB 大小的文件。
打開來看一看。
我們檢查一下 label
是否有重復項。
為什么博主要做這樣一個的實驗呢?因為博主踩過一個坑。我需要創建大量的測試數據,且名字不能重復,我用了給名字后綴添加計數器的方式,但是設置了最大值 10000 10000 10000,跑了一會很快就發現有重名的出現。
如果我們不設置最大值,即使超過了格式上的設置,比如下圖中是 5 5 5 位數的格式,Jmeter 也會自動擴充數位。