在 JMeter 壓測腳本中,常需動態生成時間戳作為請求參數、檔案名稱或日誌標記。BeanShell 前置處理器可輕鬆實現,本文提供完整代碼與變數傳遞技巧。
放置於 **BeanShell PreProcessor** 或 **BeanShell Sampler** 中:
import java.util.Calendar;
import java.text.SimpleDateFormat;
// 方式一:Calendar 取得各時間欄位
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1; // 月份 0-11
int day = cal.get(Calendar.DATE);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
// 組合格式化字串
String timestamp = String.format("%04d-%02d-%02d %02d:%02d:%02d",
year, month, day, hour, minute, second);
// 方式二:SimpleDateFormat (更靈活)
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS");
String compactTime = sdf.format(cal.getTime());
// 方式三:Java 8+ (若 JMeter 運行於 Java 8+)
/*
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
String modernTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
*/
// 存入 JMeter 變數,供後續取樣器使用 ${timestamp}
vars.put("timestamp", timestamp);
vars.put("compactTime", compactTime);
vars.put("dateOnly", String.format("%04d-%02d-%02d", year, month, day));
// 除錯輸出到 JMeter 主控台
log.info("Generated timestamp: " + timestamp);
System.out.println("Compact: " + compactTime);
timestamp=${timestamp}/logs/test_${compactTime}.logX-Request-Time: ${timestamp}${dateOnly}// 未來 30 分鐘
Calendar future = Calendar.getInstance();
future.add(Calendar.MINUTE, 30);
vars.put("futureTime", new SimpleDateFormat("HH:mm").format(future.getTime()));
// 過去 1 天隨機時間
Calendar random = Calendar.getInstance();
random.add(Calendar.DAY_OF_MONTH, -1);
random.set(Calendar.HOUR_OF_DAY, (int)(Math.random() * 24));
random.set(Calendar.MINUTE, (int)(Math.random() * 60));
vars.put("randomPast", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(random.getTime()));
| 方案 | 優點 | 缺點 |
|---|---|---|
| BeanShell | 相容舊版 JMeter、語法接近 Java | 解釋執行慢、記憶體佔用高 |
| JSR223 + Groovy | 編譯執行快、支援 Java 8+ 語法、原生 Closure | 需 JMeter 3.0+ |
| __time() 函數 | 零代碼、直接在參數中使用 ${__time(yyyyMMdd)} | 格式化選項有限 |
| __groovy() 函數 | 內聯腳本、效能佳 | 複雜邏輯較難維護 |
建議:新專案優先使用 **JSR223 Sampler/PreProcessor + Groovy**,或內建 __time() 函數。BeanShell 適合維護舊腳本。
Test Plan
└── Thread Group
├── BeanShell PreProcessor (生成 timestamp)
├── HTTP Request (使用 ${timestamp})
│ └── Response Assertion (檢查回應含 ${dateOnly})
└── BeanShell PostProcessor (記錄結束時間)
BeanShell 透過 Calendar/SimpleDateFormat 產生時間字串,再用 vars.put() 存入 JMeter 變數上下文,即可在整個測試計劃中複用。現代專案建議遷移至 Groovy 或內建函數以獲得更好效能。