使用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引數。
在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每個指令碼只會執行一次,因此每個指令碼實際上只做了一次連線,若資料庫會根據連線做某些判斷,則這種方法無法模擬,次方法實際上脫離了中介軟體等網路應用環節,因此某些網路行為也無法模擬。
這種測試方法只是用於純粹驗證資料庫執行操作時的效能情況,若資料庫的執行需要網路中某些特定因素,則無法達到預期效果。