最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那麼 1=1 存在什麼樣的問題呢?為什麼又會使用呢? ...
本系列文章md筆記(已分享)主要討論性能測試相關知識。入門階段:認識性能測試分類-(負載測試、壓力測試、併發測試、穩定性測試),常用性能測試指標-(吞吐量、併發數、響應時間、點擊數...),性能測試工具選擇。性能腳本:1. LoadRunner介紹,2. 腳本錄製、運行、參數化,3. 關聯、檢查點、事務、集合點。性能場景:1. 場景分類、場景設計、場景運行策略,2. 資源監控、SLA、IP Wizard應用。性能分析:1. 摘要報告、事務圖表、圖表合併,2. 交叉結果、拐點分析、Web項目資源分析。
全套筆記和代碼自取移步gitee倉庫: gitee倉庫獲取完整文檔和代碼
感興趣的小伙伴可以自取哦,歡迎大家點贊轉發~
共 5 章,25 子模塊
性能測試工具-LoadRunner
學習目標
1. 理解基於VuGen的腳本錄製
2. 掌握參數化的使用方法
3. 掌握關聯的使用方法
4. 掌握檢查點的使用方法
5. 掌握事務的使用方法
6. 掌握集合點的應用
VuGen-參數化
目標
- 理解參數化的使用場景
- 掌握參數化的使用方式
一、什麼是參數化
根據需求動態的獲取數據的過程
二、為什麼要參數化?
- 減少重覆代碼
- 數據代碼進行分離,方便維護
需求1
說明:由於虛擬機運行速度原因,我們使用 lr_output_message() 函數,來學習如何使用參數化
要求:輸出 我要去北京;我要去上海;我要去廣州;我要去深圳;
三、參數化操作
3.1 打開參數化菜單
選中要參數化的文本 -> 滑鼠右鍵 -> Replace with a Parameter
或者
菜單 Insert -> New Parameter...
3.2 Replace with a Parameter 打開的視窗
1. Parameter name:參數化引用名稱(參數化時使用)
2. Parameter type:File 【推薦】
3. Properties:屬性-點擊此按鈕,可直接設置參數化引用名稱對應的值;【點擊】
提示:
1). 點擊OK;參數化引用名稱具體的值,需要再次設置;
3.3 Properties 設置面板
1. Parameter type: 參數類型 File 【重點】
2. File:參數保存的文件類型及位置,一般為txt;【推薦】
3. Add Row:添加行,在當前表格編輯數據;【可選】
4. Edit with Notepad:在記事本內編輯數據;【推薦】
5. Select next row:運行或迭代時對行的選擇方式
6. Update value on:運行或迭代時對值的選取方式
提示:
1). 其中5.Select next row 與 6.Update value on為組合關係,不同組合效果不同,我們單獨來學習
需求1 解決方案
- 創建指定路徑及txt文本格式 如:C:\lr11\scripts\city.txt
- 使用 Edit with Notepad 編輯數據:北京、上海、廣州、深圳
- 編寫腳本
- 迭代次數 4
問題
lr_output_message(“str”):函數為把str字元串輸出到日誌,但它自身並不能解析讀取參數;
函數(設置參數、讀取參數)
- lr_save_string()
- lr_eval_string()
1. lr_save_string()
把字元串保存到指定的參數中
格式:lr_save_string("字元串","參數名")
示例:lr_save_string("北京","city");
2. lr_eval_string()
讀取變數的值,並以Char類型返回;
格式:lr_eval_string("{參數名}");
示例:lr_eval_string("{city}");
提示:
1). 參數名稱使用花括弧{}包括
2). 參數使用雙引號包括
需求1 代碼示例
Action()
{
lr_output_message("我要去%s",lr_eval_string("{NewParam}"));
return 0;
}
3.4 Select next row 與 Update value on
Select next row
讀取參數文件行的方式
方式:
1. Sequential:順序,按照行的順序讀取數據,如果迭代次數大於行數,再次從第一行開始讀取
2. Random:隨機,隨機讀取行
3. Unique:唯一,每次讀取唯一行,不重覆;
4. Same line as xxx 取參數同行(需要兩個以上參數,才能顯示和使用)
註意:
使用 Unique 選項時會激活 When out of values:
1) Abort Vuser:中止虛擬用戶
2) Continue in a cyclic manner:以迴圈的方式繼續
3) Continue with last value:繼續使用最後一個值
Update value on
參數值更新的方式
方式:
1. Each iteration:每次迭代以後更新
2. Each occurrence:每次出現參數時更新
3. Once:每出現一個虛擬用戶(線程)更新一次
組合
- 行順序 + 每次迭代更新值 Sequential + Each iteration
- 行順序 + 每次參數出現更新值 Sequential + Each occurrence
- 行順序 + 更新一次(單用戶) Sequential + Once
說明:
1. 組合我們在這裡就不窮舉了,以行的順序配合值的3種更新方式做演示
2. 因為組合內含occurrence,所以必須要兩個Action,我們新增兩個(Action1、Action2)兩個代碼相同
代碼
Action1()
{
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. 第一次迭代:Action1:北京;Action2:北京
2. 第二次迭代:Action1:上海;Action2:上海
3. 第三次迭代:Action1:廣州;Action2:廣州
4. 第四次迭代:Action1:深圳;Action2:深圳
Sequential + Each occurrence
行為順序,值為出現一次更新一次
預期:
1. 第一次迭代:Action1:北京;Action2:上海
2. 第二次迭代:Action1:廣州;Action2:深圳
3. 第三次迭代:Action1:北京;Action2:上海
4. 第四次迭代:Action1:廣州;Action2:深圳
Sequential + Once
行為順序,值為單用戶只更新一次
預期:
1. 第一次迭代:Action1:北京;Action2:北京
2. 第二次迭代:Action1:北京;Action2:北京
3. 第三次迭代:Action1:北京;Action2:北京
4. 第四次迭代:Action1:北京;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;
}
其他常用參數類型(瞭解)
parameter type:
1. Date/Time
2. Random Number
VuGen-關聯
目標
- 理解關聯的概念
- 掌握關聯函數的使用
- 瞭解LR自動關聯的使用
一、為什麼要學習關聯?
1. 獲取動態載入的數據,例如:Session ID(會話ID)
2. 測試的時候需要獲取頁面上指定的數據,註意是獲取,而不是查找
說明:
Session ID:客戶端與伺服器交互時,伺服器生成的一個唯一標識碼;
(通過標識碼伺服器可以區分多次交互對象是否同一客戶端,瀏覽器只要不關閉標識碼就不變)
二、什麼是關聯(correlation)?
動態獲取指定的數據,並把獲取的數據通過參數化的方式在另一處引用
三、LoadRunner 常用的關聯方式
- 手動關聯【推薦】
- 自動關聯【瞭解】
3.1 手動關聯【重點】
手動關聯就是直接調用關聯函數;
關聯函數 web_reg_save_param()
1). 執行順序:LR中函數內含reg為註冊函數,註冊函數是在下一個Action Function完成時執行。
2). 函數位置:註冊函數【必須】放到下一個Action Function(要進行關聯數據所在的函數)函數之前;
3). 如果關聯的參數值超過256個字元,需要先調用 web_set_max_html_param_len("1024") 改變參數長度;
案例 1
使用 web_reg_save_param() 函數把紅框選中內容關聯給Welcome參數
案例 1 腳本
Action()
{
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
return 0;
}
案例1 操作分析
1. 在web_url函數之前插入關聯函數 web_reg_save_param()
2. 調用 lr_eval_string() 來讀取關聯函數的參數引用名稱,並通過 lr_output_message() 函數輸出到日誌
案例1 操作實施
1) 插入 web_reg_save_param()方法
1. 在web_url函數之前空白行,點擊滑鼠右鍵
2. 選擇Insert菜單 -> New Step
2) 輸入要查找的函數:
1). 圖1:輸入要查找函數的關鍵詞或全稱
2). 圖2:找到匹配出的函數,雙擊或點擊圖3
3). 圖3:選中圖2,點擊圖3進行選中函數參數設置
3) 設置函數參數
參數:
1). Parameter Name:參數名稱(被引用時使用)
2). Left Boundary(LB):左邊界
3). Right Boundary(RB):右邊界
4). Not Found:關聯失敗時,處理方式
5). Search in:匹配搜索響應代碼範圍
註意:
單引號(')、雙引號(")、反斜杠(\)、回車換行等需要轉義字元,加上轉義字元[\]
4) 如何查看頁面元素響應代碼?
- 通過LR查看響應代碼
- 通過頁面查看源代碼
1). 通過LR查看 【註意:必須是錄製腳本-手動編寫腳本沒有快照】
提示:
1. 結構為Tree
2. url:為WebTours
3. 頁面為/WebTours/home.html
2). 通過頁面源代碼查看 關聯
地址:http://127.0.0.1:1080/WebTours/home.html 參數化並輸出到日誌
代碼:
Action()
{
web_reg_save_param("Webcome",
"LB=</H1>\n",
"RB=\n"
"<br>",
"NotFound=ERROR",
"Search=All",
LAST);
web_url("WebTours",
"URL=http://127.0.0.1:1080/WebTours/",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_output_message("Webcome值為:%s",lr_eval_string("{Webcome}"));
return 0;
}
3.2 自動關聯 【瞭解】
1. 自動關聯LoadRunner提供兩種方式:
1). 錄製時關聯-在錄製腳本的時候如果有符合關聯規則的就自動進行關聯;
註意:此種方式依賴於LR自帶的規則或新建的自定義規則
2). 錄製後關聯-腳本錄製完成並且運行完一次後,打開掃描工具,進掃描需要關聯的數據進行關聯;
註意:
① 利用掃描工具必須要先運行一遍腳本
② 掃描關聯:很多時候LR掃描不到需要關聯的信息(比如手寫的腳本),所以一般不推薦使用;
2. 自動關聯調用的是關聯函數 web_reg_save_param_ex();
(web_reg_save_param_ex與web_reg_save_param功能大致相同,它也可以使用正則表達式和過濾器)
1) 自動關聯-啟用自動關聯設置
啟動自動關聯位置:工具菜單(Tool) -> Recording Option
2) 自動關聯-掃描工具
- 啟動:打開掃描工具-Ctrl+F8 或者菜單欄(Vuser) -> Scan Script for Correlations
- 掃描:掃描之前先運行一遍腳本
- 關聯:圖中個第二步Correlation Results內進行關聯;
自動關聯總結
1. 自動關聯-錄製時關聯:採用自帶或設定的規則在錄製腳本的時候自動關聯
2. 自動關聯-錄製後關聯:前後運行兩次,搜索兩次不同之處為需要關聯的數據,進行確認關聯
3. 自動關聯無論哪種方式,都是採用調用關聯函數的方法,所以工具智能人更智能,因此推薦優先使用手動關聯