1. 程式人生 > 實用技巧 >LR(三)Vugen中指令碼增強-事務和檢查點

LR(三)Vugen中指令碼增強-事務和檢查點

事務

事務的引入是用來度量業務請求的響應時間以及對應的tps的。

在LR中,要實現事務,只需要掌握兩個事務函式即可: lr_start_transaction(); 開始計時。 lr_end_transaction(); 結束計時。

右鍵->insert->start transaction/end transaction

使用時注意

  • 在LR中,事務函式本身只是用來計時和統計的,是不會影響指令碼的功能的。

  • 在LR中,事務函式一定要成對出現(執行)。並且要保證兩個事務函式的事務名一致。

  • 事務時間的構成:

    • 事務的引入是為了度量業務請求的時間。

    事務時間(duration)=事務的結束時間-事務的開始時間。 響應時間=請求函式的執行時間。但是事務時間並不等於響應時間。 事務時間=響應時間+Wasted Time(浪費時間)+Think time(思考時間)

    • Wasted Time:浪費時間,是指script本身編譯、執行(非請求函式的程式碼)所消耗的時間,但是不包含程式碼的執行效果時間。 當指令碼從Vugen中放到Controller執行時,LR會自動將浪費時間從事務響應時間中剔除

    • Think time:思考時間,是指指令碼中的思考時間函式所執行消耗的時間。 預設情況下,在Vugen中,思考時間函式是不執行的,指令碼放入Controller中,思考時間會自動變為執行

      當Controller中執行的結果被匯入到Analysis中後,LR會自動將思考時間從事務響應時間中剔除

      這就意味著,我們最終在Analysis中看到的結果: 事務響應時間=事務時間-浪費時間-思考時間

事務的結束狀態

在LR中,事務的結束狀態有四種:LR_AUTOLR_PASSLR_FAILLR_STOP

  • LR_PASS:表示事務成功。

  • LR_FAIL:表示事務失敗。

  • LR_STOP:表示事務被中止、停止。

  • LR_AUTO:LR自動判斷事務的結束狀態。 LR會根據事務中的有結束狀態的函式的結束狀態來判斷事務的最終結束狀態。 有結束狀態的函式一般分為兩種:

  • 請求類的函式:就是用來向伺服器傳送請求的函式。請求類函式是根據響應的狀態碼來決定函式的結束狀態的。

    • 如果響應的狀態碼為1xx、2xx、3xx,則表示成功,4xx、5xx則表示失敗。

  • 功能型的函式

    :是用來實現某些程式碼功能、邏輯的函式。比如說關聯函式檢查點函式等。 功能型函式是否成功的標誌就是該函式的功能是否實現

所以如果事務中只是包含純粹的業務請求函式,則事務最終得到的結果僅僅表示通訊邏輯層面的成功,並不表示業務的成功。對於業務的成功需要通過檢查點函式來實現。

檢查點(斷言)

常用的檢查點函式是:web_reg_find()

詳解

  • Search for specific text:需要查詢的內容,即預期結果。 檢查內容即預期結果,對於檢查內容而言,需要具備以下特徵:

    • 檢查內容只是幫助我們判斷業務是否成功的某些字串即可,不需要是完整的響應內容。

    • 檢查點的內容應該是去檢查業務邏輯,而不是純粹的業務資料(變化的)。

    • 檢查點的內容選取一般來說要遵循唯一性和排他性、而不必拘泥於是正確的響應還是錯誤的響應

  • Search in:預設在body中查詢

  • Fail if:該選項是用來設定檢查點函式的Fail條件的。可選的值有兩個

    • Not Found:表示要檢查的內容在實際響應中沒有找到。是預設選項。針對的是檢查內容來源於正確的響應。

    • Found:表示要檢查的內容在實際響應中找到至少一次。針對的是檢查內容來源於錯誤的響應。

    預設情況下,檢查點函式執行的就是查詢並且做fail判斷。

  • Save count:該選項填寫的是一個引數名稱(使用者自定義),用來儲存查詢到的次數。

    • 如果該選項有值,而沒有勾選Fail if選項,則檢查點函式執行的邏輯是:查詢、儲存次數。會影響 Fail if 的判斷

    • 如果該選項有值,且勾選了fail if選項,則檢查點函式執行的邏輯是: 查詢、儲存次數、fail檢測。

一般來說,之所以勾選Save count選項,就是因為預設的單純的fail檢測不足以幫助我們判斷業務的結束狀態。需要我們手動來判斷事務的狀態。(通過某個字串出現的次數來判斷事務的結果),次數判斷如下:

if(atoi(lr_eval_string("{count}"))>=1){
    lr_end_transaction("test", LR_PASS);
}
else{
    lr_end_transaction("test", LR_FAIL);
}