首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JMeter BeanShell 取得系統當前時間完整範例

     編輯:Java 相關知識

前言

在 JMeter 壓測腳本中,常需動態生成時間戳作為請求參數、檔案名稱或日誌標記。BeanShell 前置處理器可輕鬆實現,本文提供完整代碼與變數傳遞技巧。

核心 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);

變數在 JMeter 中的使用

  • HTTP Request 參數:timestamp=${timestamp}
  • 檔案路徑:/logs/test_${compactTime}.log
  • Header:X-Request-Time: ${timestamp}
  • Assertion 比對:預期結果包含 ${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 或內建函數以獲得更好效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved