參數化是 JMeter 實現「一腳本、多數據、多場景」的關鍵技術,能將固定腳本轉化為數據驅動的靈活測試資產。本文系統講解 JMeter 四大參數化方式——CSV Data Set Config、JDBC 數據庫、用戶自定義變量、JMeter 內置函數,並通過天氣查詢、數據庫驅動、搜索測試等實戰案例,演示完整配置流程與結果驗證。
data.txt101010100,北京 101010200,海澱 101010300,朝陽
格式:每行一組數據,字段用逗號分隔,對應變量名 citycode、city

| 屬性 | 設置值 | 說明 |
|---|---|---|
| Filename | data.txt | 相對 JMeter bin 目錄,或絕對路徑 |
| Variable Names | citycode,city | 逗號分隔,對應 CSV 每列 |
| Ignore First Line | False | 無表頭 |
| Delimiter | , | 字段分隔符 |
| Recycle on EOF | True | 讀完重頭開始 |
| Stop Thread on EOF | False | 不停止線程 |
| Sharing Mode | All threads | 所有線程共享/各自獨立 |

www.weather.com.cnhttpGET/weather/${citycode}.shtml — 關鍵:使用 ${citycode} 引用 CSV 變量Contains${city} — 驗證響應包含城市名三個線程依次發送請求,分別查詢北京、海澱、朝陽天氣,斷言全部通過。
# JDBC Connection Configuration
Database URL: jdbc:mysql://localhost:3306/test
JDBC Driver: com.mysql.jdbc.Driver
Username: root
Password: root
Variable Name: dbConn # 連接池變量名
# JDBC Request
Variable Name: dbConn
Query Type: Select Statement
SQL: SELECT CONCAT(name, ',', sex) FROM UserInfo WHERE userid = "2"
# CONCAT 將多字段合併,便於正則提取
# Regular Expression Extractor
Apply to: Main sample only
Field to check: Body
Reference Name: userInfo # 後續引用 ${userInfo}
Regular Expression: (.+),(.+) # 兩組捕獲
Template: $1$,$2$ # 對應 name,sex
Match No.: 1
Default Value: NOT_FOUND

/search?name=${userInfo_g1}&sex=${userInfo_g2} (或通過 BeanShell 處理)



| Name | Value | 引用方式 |
|---|---|---|
| searchword | JMeter教程 | ${searchword} |
| ts | 1234567890 | ${ts} |

| 函數 | 語法 | 參數說明 | 示例 |
|---|---|---|---|
| __Random | ${__Random(min,max,varName)} | min/max 範圍,varName 可選存儲變量名 | ${__Random(1,100,randNum)} → ${randNum} |
| __threadNum | ${__threadNum} | 無參數,返回當前線程號 (從 1 開始) | 區分不同線程數據 |
| __CSVRead | ${__CSVRead(filename,column)} | column 從 0 開始,無緩存控制 | ${__CSVRead(data.txt,0)} 讀第一列 |
| __StringFromFile | ${__StringFromFile(filename,varName,start,end)} | 每次讀一行,varName 存儲,start/end 文件范圍 | ${__StringFromFile(user.dat,,1,2)} |
| __time | ${__time(format)} | 當前時間格式化 | ${__time(yyyyMMddHHmmss)} |
| __UUID | ${__UUID} | 生成唯一標識 | 訂單號、請求 ID |
| __counter | ${__counter(TRUE/FALSE,varName)} | TRUE 每次增長,FALSE 當前值 | 遞增 ID |
| __property | ${__property(propName,default)} | 讀取 JMeter 屬性 (命令行 -D 傳入) | ${__property(env,test)} |

| 維度 | CSV Data Set Config | JDBC 數據庫 | 用戶自定義變量 | JMeter 函數 |
|---|---|---|---|---|
| 數據來源 | 本地文件 | 關係數據庫 | 腳本內嵌 | 運行時動態生成 |
| 數據量 | 中小 (萬行以內) | 大 (百萬行+) | 極小 (<20) | 無限 (算法生成) |
| 維護成本 | 低 (文件編輯) | 中 (SQL/表維護) | 低 (UI 編輯) | 無 (代碼邏輯) |
| 動態性 | 靜態文件 | 動態查詢 | 靜態 | 高度動態 |
| 並發控制 | 共享/分片模式 | 連接池控制 | 全局共享 | 線程級隔離 |
| 典型場景 | 參數化測試主力 | 數據驅動、關聯查詢 | 環境配置、固定參數 | 隨機數、時間戳、ID 生成 |
| 推薦指數 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
file.encoding=UTF-8,防止中文亂碼${variable} 動態驗證Current thread group + 多文件分片Test Plan
├── Thread Group (用戶並發模型)
│ ├── CSV Data Set Config (業務參數化)
│ ├── User Defined Variables (環境配置)
│ ├── JDBC Connection Configuration (可選)
│ ├── HTTP Header Manager (通用請求頭)
│ ├── HTTP Cookie Manager (會話維持)
│ ├── HTTP Request Defaults (默認值)
│ │
│ ├── Controller: Loop Controller / Throughput Controller
│ │ ├── HTTP Request (業務接口)
│ │ │ ├── PreProcessor: JSR223 (參數加密/簽名)
│ │ │ ├── PostProcessor: Regular Expression Extractor (關聯提取)
│ │ │ ├── PostProcessor: JSON Extractor (JSON 響應提取)
│ │ │ └── Assertion: Response Assertion (參數化驗證)
│ │ └── Timer: Gaussian Random Timer (思考時間)
│ │
│ └── Listener: View Results Tree / Aggregate Report / Summary Report
│
└── Test Fragment (可復用片段)
└── ... (通用登錄、數據清理等)
JMeter 參數化是性能測試從「跑通流程」進階到「數據驅動、場景覆蓋、持續集成」的分水嶺。CSV Data Set Config 是主力、JDBC 解決動態數據、User Defined Variables 補充配置、JMeter 函數 賦能動態生成。掌握四種方式的適用邊界、組合技巧、變量作用域、分布式運行注意點,能構建可維護、可擴展、高復用的企業級測試資產庫。建議在項目中建立「參數化規範」:命名規範、文件管理、版本控制、CI/CD 集成,讓參數化真正成為質量保障的加速器。