1. 程式人生 > >使用Loadrunner測試資料庫效能plus

使用Loadrunner測試資料庫效能plus

之前寫過一個文件,使用LR通過JDBC測試資料庫效能,但那個文件主要介紹的是在MyEclipse裡編寫類後,在LR中如何載入如何設定,此種方法有一定的侷限性,例如把寫好的類放在LR中呼叫,都是在action中呼叫類的所有方法,若方法中包含完整的建立連線和斷開連線,每次迭代的時候就會不斷重複這個操作,既耗費資源,又耗費時間,對於要求高併發的測試場景,顯然不是最好的辦法,因此重新考慮將java的指令碼直接放在LR中進行編輯。

首先我們要明確一個問題,使用MyEclipse編寫類的手段仍然是不可或缺的,因為LR在編寫JAVA指令碼時不能對其他指令碼進行呼叫,如果需要外部方法,則必須通過引入jar的辦法,所以如果LR腳本里需要其他類和方法的支援,就必須提前把這個class通過import的辦法載入到這個腳本里。另外為了LR使用,必須使用J2EE而不能使用J2SE,因為雖然在驗證效果上J2EE和J2SE都能體現java功能和資料連線,但是釋出的時候,J2EE能夠根據建立的包的層次,分別釋出每一個class檔案,而J2SE則會把所有的class釋出在一個jar裡。

接下來我們開始準備LR的編輯環境,當然指令碼協議仍然是java vuser,


1.      準備編輯環境

a)      引入lrapi.jar

開啟編輯器之後,為了能有更多的java編輯提示和引用提示,需要匯入一個jar包。方法是,找到lr系統安裝目錄下的classes目錄,(%loadrunner%\classes),裡面有一個lrapi目錄,把這個目錄完整複製到j2se的一個專案裡,然後把這個j2se工程釋出成一個jar包,最後再把這個jar包import到LR指令碼中。



其他需要的jar包,例如jdbc等,根據需要同樣引入到環境中。

a)      調整jvm引數

由於需要大量執行java程式,所以為了避免出現堆錯誤和記憶體溢位,需要對jvm進行設定,根據執行位置的不同,共有3個地方需要新增jvm引數。

在系統執行,需要修改系統環境變數,增加一個系統環境變數JAVA_OPTS,如圖:

 在lr指令碼除錯時,編輯“使用者執行時”設定,如圖:

注意選擇指定的jdk(1.6)和新增VM引數,引數內容:

-Xmx512m -Xms512m -Xmn200m -XX:PermSize=64m-Xss128k

在編輯lr場景時,同樣要設定ii的內容,如圖:


注意如果如圖,每個指令碼都是獨立的,需要每個指令碼各自設定。

編輯的內容和指令碼除錯時一樣。


2.      編輯指令碼

由於是在LR的編輯器裡編輯需要的內容,因此要充分發揮這個環境的特點,在這個Actions類中包含init(),action(),end()3個方法,而和普通的http協議一樣,也是init()和end()只執行一遍,action()會根據場景設定不斷迴圈迭代,因此為了提高執行效率減少jdbc連線斷開所產生的資源消耗,可以把建立連線和斷開連線寫到init和end裡,把具體的查詢語句寫到action裡。

首先需要在Actions裡建立公共變數:


接下來我們具體講如何在init裡編寫連線初始化,通過jdbc連線資料庫實際上有兩種辦法,一個是使用DriverManager,一個是使用DataSource。

DriverManager:

Class.forName("");

conn= (Connection)DriverManager.getConnection("url","user","pass");

這裡得到了conn屬性,在action中所有的查詢都是使用這個連線屬性。

DataSource:

             PoolDataSource k =newPoolDataSource();

             k.setHostName("");

             k.setPort(1234);

             k.setDatabaseName("");

             k.setUser("user");

             k.setPassword("pass");

//          k.setUrl("jdbc:url");

             k.setMaxActive(2);

             k.setMinIdle(1);

             k.setLoginTimeout(3000);

             PooledConnection pc =k.getPooledConnection();

             conn =(Connection)pc.getConnection();

同樣也是得到conn屬性,以上兩種形式在init裡任選一種即可。

開啟的conn要在end()中關閉,


在action中呼叫conn執行操作,

statement= conn.prepareStatement("select * from table);

rs = (ResultSet)statement.executeQuery();

if(rs.next()){

                    System.out.println("select1 OK");

                }

                else{

                    System.out.println("select1 fail");

                }

通過自己寫對rs的狀態判斷,獲得輸出內容。如果需要獲得查詢內容,則需要import外部jar包,儲存資料物件的get方法和set方法。這裡可以根據需要靈活增加。

以上為編輯指令碼的基本方法,完成編輯後可先做單步除錯,確保指令碼編寫正確。

3.      執行測試

執行測試的方法和其他LR效能測試的方法有太大區別,但是需要注意的是,這個場景必須選擇以程序方式執行,否則使用執行緒方式會產生大量的錯誤。


以程序方式執行即可。

4.      需要注意

這種資料庫效能測試方法需要注意的是,無論用哪個方式連線,都是在init中獲得conn屬性,而init每個指令碼只會執行一次,因此每個指令碼實際上只做了一次連線,若資料庫會根據連線做某些判斷,則這種方法無法模擬,次方法實際上脫離了中介軟體等網路應用環節,因此某些網路行為也無法模擬。

這種測試方法只是用於純粹驗證資料庫執行操作時的效能情況,若資料庫的執行需要網路中某些特定因素,則無法達到預期效果。