近期在使用Jmeter編寫個輔助測試的指令碼,用到了多個Loop Controller和Counter。
當時想的思路就是三個可變的數量值,使用迴圈實現;但第三個可變值的數量次數,是基於第二次迴圈中得到的結果才能確認最終次數,每次的結果還會有不一樣的情況。基於思路,先寫了個線性指令碼,實現如下所示:
但實際中,第三層迴圈,並沒有按自己預期來實現,所以就想到了Counter計數器,將指令碼中加入了Counter計數器,實現如下所示:
圖中的數字說明:${for1}${for2}${for3}
${for1}是第一個迴圈器中的Counter變數名
${for2}是第二個迴圈器中的Counter變數名
${for3}是第三個迴圈器中的Counter變數名
從圖中可以看出,${for3}是累加的,不會隨著一次迴圈結束,計數自動重置。
我所想實現的是,第二層迴圈中的第一次獲取的結果是5個陣列,則從索引0 ~ 4依次按置執行第三層迴圈;第二層迴圈中的第二次獲取的結果是8個陣列,則從索引0 ~ 7依次按置執行第三層迴圈。
但這樣操作下來,第二次是會直接從索引5開始執行,這樣就會丟失一部分資料,顯然不是自己所想的。
中途也試過很多錯,都不能實現計數重置的功能。好在,某天想起了官方文件,這個功能在文件是有描述的,如下所示:
文件中描述的很清楚,可以使用${__jm__LC__idx}
的方式實現index從0開始,其中LC為控制器的名稱。
使用官網的文件,在指令碼中加入變數使用,執行如下所示:
從圖中可知,第三層迴圈的第四個數字就是我所想要的,終於解決了心中的問題。
圖中的數字說明:${for1}${for2}${for3}_${resetForNumber}
前三個數字在之前已經說明過了,這裡只說明下${resetForNumber},這個變數是透過BeanShell Sampler中獲取的,因為將官網給出的方案寫在了BeanShell Sampler種,程式碼如下所示:
long i=0;
i = ${__jm__Loop Controller3__idx};
vars.put("resetForNumber",String.valueOf(i));
雖然,描述起來很簡單,但的確是實際指令碼實現的過程中遇到的一個阻礙,好在問題解決了。
所以特整理此篇,希望對以後有需要的朋友有所幫助。