1. 程式人生 > 實用技巧 >效能測試基礎02

效能測試基礎02

效能測試工具-LoadRunner

目標
1. 理解基於VuGen的指令碼錄製
2. 掌握引數化使用方法
3. 掌握關聯的使用方法
4. 掌握檢查點的使用方法
5. 掌握事務的使用方法
6. 掌握集合點的應用

LoadRunner介紹

說明:
    1). HP LoadRunner是一種工業級標準效能測試負載工具,可以模擬上千萬使用者實施測試,並在測試時可實時檢測
        應用伺服器及伺服器硬體各種資料,來確認和查詢存在的瓶頸;
    2). 支援多協議:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等協議
LoadRunner組成-【非常重要】
組成:
    1. Virtual User Generator(VuGen)
    2. Controller 
    3. Analysis 
提示:
    1. VuGen:指令碼生成器-指令碼錄製、編輯
    2. Controller:控制器-設計場景、執行、監控
    3. Analysis:測試結果分析
擴充套件-理解LoadRunner三大工具
說明:為了更好的理解LoadRunner效能測試三大工具作用,我們先回顧下不使用測試工具時,如果進行效能測試...
需求:軟體系統支援100人同時登入
實施:
    1. 找100個員工及100臺電腦,每個員工註冊賬號OK,環境OK,輸入賬號、密碼完成...滑鼠放到登入按鈕上;
    2. 領導拿個大喇叭,高喊:1...2...3
    3. 相關人員統計平均登入時間及登入前、登陸後的伺服器CPU、記憶體等使用情況

LoadRunner執行原理:【重點】
                  1. VuGen:相當於開啟登入頁面、輸入賬號、輸入密碼、點選登入
                  2. Controller:相當於100個員工及手拿大喇叭的領導...
                  3. Analysis:相當與各個統計資料的相關人員
提示
接下來我們就開始分別學習使用這三個工具...

LoadRunner之VuGen操作

目標
1. 掌握VuGen使用流程
一、VuGen介紹
VuGen( Virtual User Generator )錄製客戶端和伺服器之間的相關互動活動,它將
自動生成相關模擬實際情況的API函式。

說明:為了更好的學習VuGen,我們基於LR11自帶的訂票系統為案例練習使用VuGen;

提示:
    1. LR錄製指令碼功能由於相容性問題,非常不好使,我們平時在工作中也不使用錄製方式,在這裡我們瞭解下
       它的錄製過程;
    2. 由於相容性和錄製多餘操作,一般手寫指令碼,這才厲害且沒有相容性的問題;
案例一
需求:
    1. 錄製機票網站的登入、退出指令碼
使用:
    1. 啟動網站服務程式
    2. 訪問地址:http://127.0.0.1:1080/WebTours/
    3. 登入賬戶:使用者名稱:jojo 密碼:bean     
啟動服務程式
位置:開始選單->HP LoadRunner->Samples->Web->Start Web Server
提示:WebTours專案預設使用1080埠,如果啟動失敗,看是否埠被佔用或者是否有許可權;
啟動成功介面
案例1-實施步驟分析
1. 啟動VuGen
2. 建立指令碼
3. 選擇錄製協議 Web(HTTP/HTML)【重要】
4. 錄製設定
5. 指令碼錄製
6. 執行指令碼
1、啟動VuGen
開始選單->HP LoadRunner->LoadRunner
注意:一定要以管理員身份執行才可以,可以用管理員執行cmd,再用cmd開啟LoadRunner,這樣就行了
點選:Create/Edit Script    
2、建立指令碼
1. 選單欄(File)-》New    快捷鍵(Ctrl+n)
2. 常用工具欄-》第一個圖示(new Ctrl+n)
3. Start Page:點選快捷建立指令碼圖示(new Script)【推薦】
3、選擇協議
1. New Single Protocol Script:單一協議
2. Popular Protocols:主流協議
3. Web(HTTP/HTML):HTTP協議【選擇】
4、錄製設定
1. Application type:Internet Application【選擇】
    (Internet Application:HTTP協議使用)
2. Programe to record:選擇瀏覽器
   1). IE:版本8;(提示:64位作業系統選擇32位ie;)【選擇】
   2). 火狐瀏覽器35以下;
3. URL Address:http://127.0.0.1:1080/WebTours/(專案網址)
4. Working directory:工作目錄 預設即可
5. Record into Action:錄製指令碼存放的計劃名
   1). vuser_init:首先執行 迭代執行時候,只會執行一次
   2). Action:可迭代執行、可新增【選擇】
   3). vuser_end:最後執行 迭代執行時候,只會執行一次
6. 點選OK-開始錄製
5、指令碼錄製
1. Recording..events:錄製事件
2. 使用者名稱:jojo 密碼:bean
3. 點選Login
4. 點選Sign Off 退出登入
5. 停止錄製
6. 生成指令碼    
退出登入停止錄製生成指令碼6、執行指令碼既然已經錄製好了指令碼了,為什麼還要執行指令碼呢?
說明:驗證錄製指令碼是否能正常執行;
如何執行指令碼
1. 點選Run按鈕
2. F5鍵直接回放
怎麼檢視執行指令碼結果?
選單(View)->Test Results...

VuGen-擴充套件(錄製、回放)

目標
1. 瞭解錄製其他模式
2. 瞭解Run-Seting
一、錄製選項-擴充套件在錄製設定的時候,有一個option選項按鈕,它有什麼作用呢?
錄製設定option選項
1. HTML-based script: 所有請求放到一個函式內
2. URL-based script: 每個請求放到一個函式

提示:
    1). 基於瀏覽器的應用程式推薦使用HTML-based Script
    2). 不是基於瀏覽器的應用程式推薦使用URL-based Script。
    4). 基於瀏覽器的應用程式中使用了HTTPS 安全協議,使用URL-based 方式錄製

備註:為了學習效果,在這裡我們先介紹重點功能,其他功能需要使用的時候我們在進行講解
HTML Advance選項
1. web_submit_form: 依賴上下文才能提交。
2. web_submit_data:  不依賴上下文,每個函式都指定了具體的url地址,可以直接提交成功;【推薦】

提示:沒有特殊的場景需求,推薦使用:web_submit_data

二、執行設定
1. Run-time Settings
   (選單-Vuser->Run-time Settings) 快捷鍵F4
Run-time Settings
1. Run Logic     指令碼執行迭代次數
2. Think Time     執行時思考時間處理方式

說明:為了更好的理解迭代與Think Time設定,我們在這裡先學習2個常用的函式,方便我們快速執行、檢視執行效果;
常用函式
1. lr_output_message()
2. lr_think_time()
1) 函式 lr_output_message()
說明:輸出到執行日誌  如:lr_output_message("hello Action")
引數: 要輸出的文字資訊
2)函式 lr_think_time()
說明:思考時間 最大可能模仿使用者真實操作 如:lr_think_time(4)
引數:停頓多少秒
練習指令碼
Action()
{
    lr_output_message("Action被執行");
    lr_think_time(6)
    return 0;
}

Action2()
{
    lr_output_message("Action2被執行");
    return 0;
}

提示:
    1. C語言語法:必須以分號(;)作為行結束標記
    2. return 0:結束本次迭代,進入下一迭代;
RunLogin迭代次數
    1. 迭代就是指令碼要執行的次數
    2. Init與End迭代次數不生效,只會執行一次
Think Time思考時間
    1. Ignore think time 預設(忽略思考時間)
    2. Replay think time (播放思考時間)
        1). As recorded        (錄製多少秒,就等待多少秒)
        2). MuItiply recorded think time by     (錄製時間的倍數)
        3). Use random percentage of recorded think time
            ( Min(錄製時間的最小百分比) Max(錄製時間的最大百分比))
        4). Limit think time to( 限制最高時間)

VuGen手動編寫指令碼

目標
1. 掌握C語言註釋
2. 掌握基於LR手動編輯指令碼方法
註釋:
說明:首先科普下C語言中的註釋;

1. //     :單行註釋  
           如://登入

2. /**/     :多行註釋  
          如:/*
              多行    
              註釋    
              */
為什麼要手動編寫指令碼
1. 避免LR由於相容性導致錄製異常或失敗;
2. 手寫指令碼無冗餘程式碼,更有利於指令碼的增強(插入事務、引數化)與維護
手動編寫指令碼使用程式語言
1. JAVA
2. C語言 【推薦】

提示:
    1. Loadrunner中雖然預設是使用C語言錄製/編寫指令碼,我們無需專業去學C語言;
    2. 只需注意下基礎語法和掌握LR中常用的幾個請求的函式的用法就可以編寫常用的指令碼

問題:需要掌握LR中那幾個函式?
指令碼請求函式
1. web_url()            GET請求             【掌握】
2. web_submit_data()    POST請求             【掌握】
3. web_custom_request()    定製請求(GET\POST\PUT\DEL)    【瞭解】

提示:掌握 web_url、web_submit_data兩個就好;
Web_url()函式重點
說明:GET請求時使用;
語法:web_url("request name","URL=http://***",LAST); 
      1). request name:標記請求名稱,比如:首頁
      2). URL=http://***:URL=為固定格式;http://***為GET請求地址
      3). LAST結束標誌;
案例:使用web_url函式開啟機票網站首頁分析:看它是否是Get請求的方式,用F12可以檢視到它是Get請求的,故可用此函式指令碼:
Action()
{
	// 開啟WebTours首頁
	web_url("首頁","URL=http://127.0.0.1:1080/WebTours/",LAST);
	return 0;
}
點選執行F5,之後點選View-->Test Results,來到結果檢視後在指令碼上滑鼠右鍵Expand All即可
Web_submit_data()函式【重點】
說明:POST請求專用;
語法:web_submit_data( StepName, Action=http://***, <List of Attributes>, ITEMDATA,
                      <List of data>, LAST );  
      1). StepName:標記請求名稱, 比如:登入
      2). Action=http://***:Action=固定格式;http://***:提交地址
      3). List of Attributes:其他屬性 如:"Method=POST"
      4). List of data:其他引數 如:"username=jojo"
      5). LAST:結束符

提示:
    1. POST提交引數比較多,我們不用一個個記,使用插入函式方法,在函式對話方塊內輸入;
    2. 錄製HTML頁面時,Mode推薦使用HTML;
操作:空白處滑鼠右鍵
找到Web_submit_data()函式點選ok,進入下一步接下來,要配置登入的資料了
點選確定,此時指令碼:開啟首頁並登入的指令碼如下
Action()
{

	// 開啟WebTours首頁 抓包分析得出是Get請求
	web_url("首頁","URL=http://127.0.0.1:1080/WebTours/",LAST);


	// 模擬登入,抓包分析得出是Post請求
	web_submit_data("登入",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value=129439.97399757zzfiAzipzzcfDQQtiptVVQHf", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=39", ENDITEM,
		"Name=login.y", "Value=10", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);
	return 0;
}
點選執行指令碼,檢視結果如下,並不是預期的歡迎頁面,這是因為Session的問題,將指令碼的Session換成動態獲取即可:
Action()
{
	# 解決session問題
	web_reg_save_param("Session",
		"LB=name=userSession value=",
		"RB=>",
		LAST);

	// 開啟WebTours首頁 抓包分析得出是Get請求
	web_url("首頁","URL=http://127.0.0.1:1080/WebTours/",LAST);

	// 模擬登入,抓包分析得出是Post請求
	web_submit_data("登入",
		"Action=http://127.0.0.1:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=",
		"Referer=",
		"Mode=HTML",
		ITEMDATA,
		"Name=userSession", "Value={Session}", ENDITEM,
		"Name=username", "Value=jojo", ENDITEM,
		"Name=password", "Value=bean", ENDITEM,
		"Name=login.x", "Value=26", ENDITEM,
		"Name=login.y", "Value=6", ENDITEM,
		"Name=JSFormSubmit", "Value=off", ENDITEM,
		LAST);
    
	return 0;
}
執行時,即可得出登入結果,bingo正確
web_custom_request()函式【瞭解】
說明:自定義請求方法(GET/POST/PUT/DELETE)
語法:web_custom_request( RequestName, <List of Attributes>,LAST );  
    1). RequestName:請求名稱
    2). List of Attributes:屬性列表,如:"Method=POST"
    3). LAST:結束符

提示:以後在專案裡涉及其他請求方法時,有用;

VuGen-引數化

目標
1. 理解引數化使用場景
2. 掌握引數化使用方式
什麼是引數化
概念:根據需求動態的獲取資料的過程
為什麼要引數化
1. 減少重複程式碼
2. 資料和程式碼進行分離,方便維護
需求1
說明:由於虛擬機器執行速度原因,我們使用lr_output_message()函式練習學習使用引數化
要求:
    1. 輸出 我要去北京;我要去上海;我要去廣州;我要去深圳;
引數化操作開啟引數化選單
選中要引數化的文字->滑鼠右鍵->Replace with a Parameter
或者
選單【Insert】>【New Parameter...】
Replace with a Parameter 開啟的視窗
1. Parameter name:引數化引用名稱(引數化時使用)
2. Parameter type:File 【推薦-File】
3. Properties:屬性-點選此按鈕,可直接設定引數化引用名稱對應的值;【點選】

提示:
    1). 點選OK;引數化引用名稱具體的值,需要再次設定;
Properties 設定面板若指定檔案沒有,就點選create table選項,就會建立你要的檔名和型別。
1. Parameter type: 引數型別 File 【重點】
2. File:引數儲存的檔案型別及位置,一般為txt;【推薦】
3. Add Row:新增行,在當前表格編輯資料;【可選】
4. Edit with Notepad:在記事本內編輯資料;【推薦】
5. Select next row:執行或迭代時對行的選擇方式 
    1). 
6. Update value on:執行或迭代時對值的選取方式

提示:
    1). Select next row與Update value on為組合關係,不同組合效果不同,我們單獨來學習
需求1 解決方案
1. 建立指定路徑及txt文字格式 如:C:\lr11\scripts\city.txt
2. 使用Edit with Notepad 編輯資料:北京、上海、廣州、深圳
3. 編寫指令碼 
4. 迭代次數 4

問題:如何把設定好的引數讀取打印出來?
為了更好的學習使用引數化,我們必須先了解個函式
函式:lr_eval_string() 
為什麼要了解lr_eval_string()函式?
1. lr_output_message(“str”):函式為把str字串輸出到日誌,它自身並不能解析讀取引數。
2. 為了日誌記錄詳細我們必須學習個能讀取引數,再通過lr_output_message()函式來輸出到日誌
函式lr_eval_string()
功能:讀取變數的值,並以Char型別返回
示例:
    lr_eval_string("{parameter}")
提示:
    1). 引數名稱使用花括號{}包括
    2). 引數使用雙引號包括
需求1、程式碼示例
1. 程式碼:
    Action()
    {
       
		// 列印城市
		lr_output_message("我要去 %s",lr_eval_string("{city}"));
        return 0;
    }
Select next row 與 Update value onSelect next row
說明:讀取引數檔案行的方式
方式:
    1. Sequential:順序,按照行的順序讀取資料,如果迭代次數大於行數,再次從第一行開始讀取
    2. Random:隨機,隨機讀取行
    3. Unique:唯一,每次迭代讀取唯一行,不重複;如果行數讀完,立即停止行迭代;
Update value on
說明:引數值更新的方式
方式:
    1. Each iteration:每次行迭代以後更新
    2. Each occurrence:每次出現引數時更新
    3. Once:每出現一個虛擬使用者(執行緒)更新一次
組合
1. 行迭代順序+值每次迭代更新值     Sequential + Each iteration
2. 行迭代順序+值每次引數出現更新值     Sequential + Each occurrence
3. 行迭代順序+值更新一次(單使用者,每出現一個虛擬使用者更新一次)    Sequential + Once

說明:
    1. 組合我們在這裡就不窮舉了,以行的順序配合值的3種更新方式做演示
    2. 因為組合內含occurrence,所以必須要兩個Action,我們新增兩個(Action、Action2)兩個程式碼相同
程式碼
Action()
{
    lr_output_message("我要去%s",lr_eval_string("{NewParam}"));
    return 0;
}
Action2()
{
    lr_output_message("我要去%s",lr_eval_string("{NewParam}"));
    return 0;
}
Sequential + Each iteration
說明:行為順序,值為迭代更新一次;
預期:
    1. 第一次迭代:Action:北京;Action2:北京
    2. 第二次迭代:Action:上海;Action2:上海
    3. 第三次迭代:Action:廣州;Action2:廣州
    4. 第四次迭代:Action:深圳;Action2:深圳
Sequential + Each occurrence
說明:行為順序,值為出現一次更新一次
預期:
    1. 第一次迭代:Action:北京;Action2:上海
    2. 第二次迭代:Action:廣州;Action2:深圳
    3. 第三次迭代:Action:北京;Action2:上海
    4. 第四次迭代:Action:廣州;Action2:深圳
Sequential + Once
說明:行為順序,值為單使用者只更新一次
預期:
    1. 第一次迭代:Action:北京;Action2:北京
    2. 第二次迭代:Action:北京;Action2:北京
    3. 第三次迭代:Action:北京;Action2:北京
    4. 第四次迭代:Action:北京;Action2:北京
擴充套件 批量獲取引數時,如果保證引數不重複?
思路:新增時間戳
說明:web_save_timestamp_param("time_stamp",LAST) 為時間戳函式,返回:1970到現在的毫秒數;
      (time_stamp:引數為獲取值後儲存的引數名稱,被引用時使用)

示例:
Action()
{
    web_save_timestamp_param("time_stamp",LAST);
    lr_output_message("我要去%s",lr_eval_string("{NewParam}_{time_stamp}"));
    return 0;
}