1. 程式人生 > >使用LoadRunner之引數化取值

使用LoadRunner之引數化取值

改變引數化的取值方式,關鍵在於Select next row和Update value on這兩個選項。

  Select next row包括以下選項:

Sequential:順序方式
Random:隨機方式
Unique:唯一方式

  Update value on包括如下選項:

Each iteration:每次迭代更新取值
Each occurrence:每次取值更新
Once:只更新一次

下面我們將通過如下的一段指令碼來分別解析各個組合設定的效果,指令碼如下:

  Action()
  {
     int i = 0;
     for (i=0; i<5; i++) {
       lr_eval_string(“{paramtemp}”);
    }
    lr_eval_string(“{paramtemp}”);
    return 0;
  }

注:以上指令碼的功能就是先重複迴圈取5次引數,然後迴圈結束後再讀取一次引數的值。這裡為引數paramtemp準備的引數資料有temp1~8共8條資料,供測試使用。

  1、Sequential+Each iteration(順序方式+每次迭代更新取值),設定Run—Logic中action迴圈迭代5次,並執行以上指令碼,結果如下:

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”

  。。。。。。

  通過如上的回放日誌可以發現,共迴圈action5次,共取了5個引數化中的資料,但每次執行action指令碼時,指令碼內部的取值均相同。設定Sequential是為了保證順序讀取方式,而Each iteration是基於Run—Logic的設定的,就是說每次迴圈一次後,讀取新的值。如果設定迴圈次數超過資料的行數,此時再回放之後的結果就是,超過第八,從第九次開始就又從temp1開始讀取,完成迴圈迭代的讀取過程。

  2、Sequential+Each occurrence(順序方式+每次取值更新),設定Run—Logic中action迴圈迭代5次,並執行以上指令碼,結果如下:

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp3”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp4”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp5”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp6”

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp7”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp8”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp2”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp3”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp4”

  。。。。。。

  分析如上的兩次迭代回放日誌我們可以發現,每一次迭代中取值都在變化,而且都是在讀取新的一行資料,當資料讀取完之後,又重新順序讀取。這裡我們就可以很清晰的認識到Each occurrence和Each iteration之後的結果,是完全不同的方式進行讀取的,Each occurrence每一次取值更新的。

  3、Sequential+Once(順序方式+只讀取一次),設定Run—Logic中action迴圈迭代5次,並執行以上指令碼,結果如下:

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”

  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(5): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”
  Action.c(7): Notify: Parameter Substitution: parameter “paramtemp” = “temp1”

  。。。。。。

  從回放日誌中可以看出,這裡的讀取方式很符合Once的字面理解,它只對引數讀取一次,由於是順序讀取,所以它就只讀取一個第一行資料。關於Once的讀取方式是我們通常容易犯錯的地方,就以為選擇Once可能就是每個引數只讀取一次,導致最後可能就只插入一條資料進去進入到庫中。

  接下來我們需要了解的就是Select next row中其他兩種方式,分別為Random和Unique,具體如下:

  Random:表示隨機讀取方式

Random+Each iteration,跟順序讀取的結果唯一不同的就是這裡是隨機讀取,取值是每次迭代取值
Random+Each occurrence,隨機取值更新方式
Random+Once,隨機取一行資料,然後重複迭代讀取這一行資料
  Unique:主要是強調取值的唯一性,如果到最後沒有該值了,LR提供了其他解決方案,如圖所示:

  這裡寫圖片描述

  此處的下拉列表中提供了三種方式,具體如下:

About Vuser,當取值次數超過引數的行數時,忽略指令碼的執行
Continue in a cyclic manner,取值超過時,啟用迴圈掃描,掃描那些還未被使用的資料進行使用
Continue with last value,重複讀取最後一行資料
  所以關於Unique的唯一性取值方式還是需要值得,而且通常也用得比較多,特別是對於一些資料庫表有唯一性約束的欄位,必須要配合此項設定方能順利執行。

  其實,在引數設定方式中,關於資料行的讀取順序基本上都比較直接明瞭,唯獨在結合取值方式上就容易引起一些混亂,特別是Each iteration和Each occurrence這兩種方式,前者是基於Run-Logic的迭代迴圈取值的,而Each occurrence是基於每一次取新值的,當然在通常情況下,這兩者其實是有共性的,如果一個指令碼中只有一個引數,且只讀取一次引數的話,設定這兩種方式的結果是相同的,可以將指令碼縮減如下,回放之後就可發現結果是一樣的,但提前是配合順序和隨機兩種方式,如果配合唯一性,那結果就另當別論。縮減後的指令碼如下:

  Action()
  {
     lr_eval_string(“{paramtemp}”);
    return 0;
  }

  效能測試的第一步就是要創建出符合實際應用的測試指令碼,而指令碼的除錯和優化卻是指令碼建立過程中最為重要的,如何合理運用引數化功能,對於最後的場景執行和監控都是至關重要的,如果理解不當,將會浪費大量的時間去分析,既誤導開發人員,也誤導自己的測試結果分析。