JMetertimeshift関数による動的日付計算の実践

JMeter の __timeShift 関数は、任意の基準日時を元に指定した時間分だけ加算/減算し、フォーマットされた日時文字列を返す強力なツールです。特にLoadテストにおける**: テスト日付の動的生成**や、**有効期限付きリクエストの構築**などに広く利用されます。

関数構文

${__timeShift(日時フォーマット, 対象日時, オフセット定数, ロケール, 変数名)}

各引数の意味

引数順 名称 必須? 説明
1番目 日時フォーマット 任意 出力形式(SimpleDateFormat準拠)。未指定時はUNIXタイムスタンプ(ミリ秒)で返却。
2番目 対象日時 任意 基準となる日時。未指定時はテスト実行時の時刻が使われます。
3番目 オフセット定数 任意 ISO 8601 形式の期間(Period)で表す加減算値。省略時は変更なし。
4番目 ロケール 任意 言語環境(例:ja_JP)。月名や曜日の表示に影響します。
5番目 変数名 任意 結果を保存する変数名。設定時は関数の評価値が空文字となり、代わりに変数に保持されます。

Period形式(オフセット定数)の記述ルール

JMeter の時間オフセットはISO 8601standardに準拠しており、以下のような構成になります:

  • P:Period indicatoralways present
  • T:Time division indicator(分・秒・ミリ秒が含まれる場合に必須)
  • 数字+単位(大文字 phải strict)
    • D:日
    • H:時間
    • M:分(※注意:M はMonthではない)
    • S:秒(小数可)
  • 負数表現:先頭に - を付与(例:-P1D

代表的な記述例

目的 記述例
翌日 P1D
1週間後 P7D
3日前 -P3D
2時間後 PT2H
45分前 -PT45M
1日12時間30分後 P1DT12H30M
750ms後 PT0.75S

具体的应用例

実行時刻を「2026-04-01 20:44:24」前提で動作確認:

問い合わせ日時:
${__toString(${__timeShift(yyyy-MM-dd,,P0D,)})}

明日の日付:
${__timeShift(yyyy-MM-dd,,P1D,)}

2週間前:
${__timeShift(yyyy-MM-dd,,P-14D,)}

当日の23:59:59の10分前(スロット終了時刻):
${__timeShift(yyyy-MM-dd HH:mm:ss,,PT-10M,)}

昨日のDATEキー:
${__timeShift(yyyyMMdd,,-P1D,)}

指定日からのカウントダウン(例:2026-12-31まで残り何日か):
${__timeShift(d,2026-12-31,-P,)}

JSR223スクリプト内での活用(Python)

JMeter関数はスクリプト言語内でも参照できます。ただし、直接埋め込むにはエスケープに注意が必要です:

import jarray
from org.apache.jmeter.functions import @Property

# JMeter関数の結果を取得(変数nameは非推奨だが対応可能)
current_plus_five = __jmeter_func__("timeShift", "yyyy-MM-dd HH:mm:ss", "", "PT5H", "", "")
print("5時間後:", current_plus_five)

# 実際のテストでは、スレッドグループ属性や変数と組み合わせるのが安全
base_date = vars["booking_date"]
offset_days = 30
due_date = __jmeter_func__("timeShift", "yyyy-MM-dd", base_date, "P"+str(offset_days)+"D", "", "")

入力時注意事項

  • Tの挿入位置:PT1H30Mのように、時間以上が含まれる場合は必ずT区切りが必要です。
  • ケースセンシティブ:単位記号(D/H/M/S)は原則大文字が推奨され、小文字では解析エラーになる可能性があります。
  • 乱漏れ防止:MM(月)/mm(分)など混同しやすいフォーマットはテスト実行環境でpeek確認しましょう。
  • タイムゾーン:JMeterはJVM起動時のデフォルトタイムゾーンを使用します。UTC前提のテストでは明示的に-Duser.timezone=UTC指定してください。

${__toString(${__timeShift(yyyy-MM-dd,,P0D,)})}
⇒ 2026-04-01

${__toString(${__timeShift(yyyy-MM-dd H:mm:ss,,-PT12H,)})}
⇒ 2026-04-01 8:44:24

${__toString(${__timeShift(MMM/dd/yyyy HHmm,2026-01-01 00:00:00,P60D,)})}
⇒ Mar 02/2026 0000

タグ: JMeter timeShift ISO8601 テスト自動化 JSR223

8月27日 03:48 投稿