前置處理器
預處理器是JMeter的元素,在測試場景中用於執行采樣器請求之前執行的操作。預處理器可用於不同的性能測試需求,例如從數據庫中獲取數據、在采樣器執行之間或在測試數據生成之前設置超時。
1、BeanShell PreProcessor
假設我們要測試一個需要“token”參數的請求,這個參數可以是任何隨機自字符串,我們可以輕松使用預處理器生成隨機字符串並在采樣器中使用它的一個很好的例子,BeanShell預處理器適用於此,因為它可以管理性能腳本中的任何程序員任務。
Right Click on the Sampler -> Add -> Pre Processors -> BeanShell PreProcessor

參數說明:
-
Reset bsh.Interpreter before each call: 在每次調用之前重置解釋器並清除占用的內存。將此選項設置為“True”對於長時間運行的腳本可能很有用,因為重復調用可能會消耗大量內存
-
Parameters :將傳遞給BeanShell腳本的JMeter參數。您需要記住,如果在此配置字段中未指定JMeter變量,則不能在BeanShell預處理器中使用它們,如果指定了參數,則可以在預處理器中使用它,如下所示:
String BS_Variable_Name = vars.get("JMeterVariable"); -
File Name:需要運行的外部 BeanShell 腳本的路徑
BeanShell 預處理器腳本可能是外部的,也可能是內部的。如果它是內部的,您可以將其寫入 BeanShell Preprocessor 的“Script”字段。在任何其他情況下,您都需要使用“文件名”配置字段。要生成隨機字符串,您可以使用這個簡單的代碼示例:
import java.util.Random;
chars = "1234567890abcdefghiklmnopqrstuvwxyz-";
int string_length = 36;
randomstring ="";
for (int i=0; i < string_length; i++) {
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(chars.length());
randomstring += chars.substring(randomInt,randomInt+1);
}
print(randomstring);
vars.put("RANDOM_STRING",randomstring);
BeanShell PreProcessor

預處理器就緒后,您現在可以使用在采樣器中創建的隨機腳本,

最后添加一個偵聽器並驗證一個發送請求,您將看到您的請求將包含一個唯一的參數

2、JSR223 PreProcessor
JSR223 預處理器是另一種使用預處理器編寫腳本的方法。JSR223 具有與 BeanShell 預處理器相似的功能。與 BeanShell 的主要區別在於您可以使用其他腳本語言:ecmascript、groovy、java、javascript、jexl 和 nashorn。
使用JSR223預處理器時,您需要確保腳本不會在腳本代碼中直接使用JMeter變量,因為存在一種緩存機制,該機制只緩存第一次替換,而所有下一次變量更新在預處理器中根本不可用。
To add the BeanShell PreProcessor to Sampler request:
Right Click on the Sampler -> Add -> Pre Processors -> JSR223 PreProcessor

3、HTML Link Parser
HTML 鏈接解析器預處理器可用於解析響應、提取所有找到的鏈接並進一步請求它們。當您的腳本的主要目標是模擬網絡爬行時,這會很有用。

不常用
4、JDBC PreProcessor
通過使用 JDBC 預處理器,您可以在采樣器之前運行 SQL 語句。
假設我們登錄的過程中有用戶名和密碼作為參數,可以將這些測試值保留在采樣器本身中,但這會非常低效,因為每次用戶更新他們的用戶名和密碼,都必須相應地更新您的腳本。這是一個很好的例子,可以用從數據庫中獲取的動態值替換硬編碼參數
add the JDBC PreProcessor:
Right Click on the Sampler -> Add -> Pre Processors -> JDBC PreProcessor

參數說明:
- Variable Name for created pool declared in JDBC Connection Configuration: 變量名稱- 連接池的名稱(在 JDBC 連接配置中指定)
- Query type: 查詢類型- 所有常用的語句類型(例如,如果查詢更新 db 值,則不能使用選擇類型)
- SQL Query: SQL 查詢- SQL 查詢本身
- Parameter values: 參數值- 如果 SQL 查詢參數化,則為逗號分隔的參數列表
- Parameter types: 參數類型- 逗號分隔的 SQL 參數類型列表(在此處查看有關受支持類型的更多信息:java.sql.Types 的 Javadoc)
- Variable Names: 變量名稱- 以逗號分隔的變量列表,用於保留從數據庫返回的獲取的數據庫數據值
- Result Variable Name: 結果變量名稱- 包含返回數據集的鍵值變量
- Query timeout (s): 查詢超時 (s) - 結果查詢的最大秒數
- Handle ResultSet : 處理結果集 - 指定應如何處理查詢結果
首先,我們需要為的數據庫正確配置JDBC驅動程序。

添加 JDBC 預處理器,可以只指定 Select 語句來從數據庫中檢索所需的數據

我們可以用動態獲取的數據替換輸入參數,這里使用調試取樣器獲取參數做測試。真實業務可以通過${username}獲取參數值

5、RegEx User Parameters
正則表達式用戶變量,用來引用前一次正則表達式提取器(Regular Expression Extractor)提取的響應數據;響應數據是由取樣器返回的。比如對請求1用正則表達式提取器提取其返回list,然后請求2用RegEx User Parameters來引用list中的值
參數說明:
- Regular Expression Reference Name:正則表達式引用名稱,引用的正則表達式提取器(Regular Expression Extractor)中聲明的變量名
- Parameter names regexp group number:參數名稱正則表達式編號
- Parameter values regex group number:參數值正則表達式組編號
假設我們有第一個 http 請求,它返回帶有這種 html 的響應正文:
<div class='parameters'>
<input name='username' value='TestUser'>
<input name='password' value='Test123!'>
<div class='parameters'>
我們看到所有參數都包含名稱和值。在這種情況下,我們可以創建一個通用的正則表達式來提取所有變量,包括名稱和適當的值,這些變量將使用正則表達式組(圓括號)分隔:

基於指定的正則表達式,我們看到 'listParams' 引用將包含從第一個請求解析的所有變量。該正則表達式的第 1 組將返回名稱,而第 2 組將返回適當的值。在這種情況下,我們可以通過以下方式指定 RegEx 用戶參數配置:

6、User Parameters
用戶參數預處理器指定特定於各個線程的用戶輸入參數。對於每個線程,將根據該用戶線程的順序使用變量值.
可以利用此元件進行參數設置,在取樣器中進行參數化,也就是用戶(線程)在進行參數化取值時可以根據用戶來區分.
如果線程數多於用戶參數個數,則剩余線程從第一組用戶參數開始調用

如果僅使用一次迭代更新變量並確保每次都根據父控制器的執行更新值,則需要選中“每次迭代更新一次”復選框。
通常,此預處理器是參數化請求的一種選擇。但通常,csv 數據集配置元素為參數化提供了更大的靈活性。
