Jmeter Thread Group中如果存在HTTP request執行失敗,就對整個Thread Group重新執行,限定最大執行次數N次 由於在對WEB系統進行自動化測試的過程中,經常會由於
Jmeter Thread Group中如果存在HTTP request執行失敗,就對整個Thread Group重新執行,限定最大執行次數N次
由於在對WEB系統進行自動化測試的過程中,經常會由於握手連線斷開等原因導致HTTP請求傳送失敗,如果重新執行一次,會是成功的。在每天的自動化冒煙測試過程中,生成在測試報告存在誤報,嚴重浪費了測試人員確認的時間,因此希望在HTTP請求失敗的情況下,重新執行,設定一個重新執行的最大次數,如果嘗試了多次都是失敗的才認為是真的失敗了。
一開始,我只是對單個HTTP request通過While Controller做了失敗後重新執行這樣的處理,但是要讓一個thread group裡面所有的HTTP request都這樣處理該怎麼辦呢?由於對每個HTTP request都新增一段那樣的程式碼不太現實,最後,我是這樣處理的,將一個thread group裡面所有的指令碼都放在一個While Controller裡面,如果有任意一個HTTP request失敗了,就重複執行整個thread group,而且最後一次執行無論成功與否,其前面的幾次執行都強行設定成是成功的,這樣如果前N-1次執行失敗了,第N次執行成功了,出來的測試報告不會有這個HTTP request失敗的資訊,測試人員就不需要花時間去重新確認了。
1 初始化變數
+ View Code2 控制迴圈
1 |
${__BeanShell((Boolean)vars.getObject(
"ISCONTINUE"
))}
|
3 對HTTP sample的結果sampleresult進行判斷,如果有任何一個失敗了,就將標誌位ANYSAMPLEFAIL設定為true,以便據此判斷整個thread group是否需要重新執行
備註:此BeanShell Assertion將作用於While Controller內每一個HTTP Sampler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult;
SampleResult prev_result=ctx.getPreviousResult();
Integer increment = (Integer)vars.getObject(
"INCREMENT"
);
Integer maxloop = (Integer)vars.getObject(
"MAXLOOP"
);
if
(prev_result !=
null
&& !prev_result.isSuccessful())
{
vars.putObject(
"ANYSAMPLEFAIL"
,
true
);
if
(increment.intValue() < (maxloop.intValue() - 1))
{
prev_result.setSuccessful(
true
);
}
}
|
4 對迴圈次數進行計數,對是否繼續重複執行進行判斷,對是否存在任何一個samper失敗的標誌位ANYSAMPLEFAIL進行重置
備註:此BeanShell Samper只在每次的While Controller的最後執行一次
1 2 3 4 5 6 7 8 9 |
Integer increment = (Integer)vars.getObject(
"INCREMENT"
);
increment++;
Boolean requestResult = (Boolean)vars.getObject(
"ANYSAMPLEFAIL"
);
Integer maxloop = (Integer)vars.getObject(
"MAXLOOP"
);
boolean iscontinue = (increment < maxloop) && requestResult.booleanValue() ;
vars.putObject(
"ISCONTINUE"
, iscontinue);
vars.putObject(
"ANYSAMPLEFAIL"
,
false
);
vars.putObject(
"INCREMENT"
, increment );
|
這樣處理之後,如果最大迴圈三次,三次都失敗了,前兩次也不會被標記為失敗的,請看結果樹:
在上圖中,前兩次失敗的HTTP request雖然其下的斷言標記為失敗的,但是HTTP request並沒有標記為失敗的。
如果希望前兩次失敗的HTTP request連其下的斷言都標記為成功的,那麼需要這樣處理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult;
SampleResult prev_result=ctx.getPreviousResult();
if
(prev_result !=
null
&& !prev_result.isSuccessful())
{
AssertionResult [] results=prev_result.getAssertionResults();
int
size = results.length;
for
(
int
i=0; i< size; i++)
{
|