情境模式

概觀

HTTP / FastHttp / WebSocket user 的 tasks 可包成情境物件,控制每個 tick 要跑哪些 task。三種模式:

  • sequence — 每個 task 依序執行(預設)。

  • weighted — 每 tick 依 weight 加權挑一個。

  • conditional — 以 run_if / skip_if 預測式(透過參數解析器評估)控制。

格式

{
  "mode": "sequence",
  "tasks": [
    {"method": "get",  "request_url": "${var.base}/products"},
    {"method": "post", "request_url": "${var.base}/cart",
     "json": {"product_id": 1}}
  ]
}

舊式 {"get": {...}} map 與裸列表也仍可用,runner 會 normalise 成 {"mode": "sequence", "tasks": [...]}

加權挑選

每個 task 可帶正整數 weight;runner 每 tick 挑一個,機率與 weight 成正比。未提供 weight 預設 1。

{
  "mode": "weighted",
  "tasks": [
    {"method": "get", "request_url": "/", "weight": 3},
    {"method": "get", "request_url": "/expensive", "weight": 1}
  ]
}

條件流程

run_ifskip_if 皆使用相同預測式語言;run_if 必須為真才執行該 task,skip_if 必須為假才執行。

預測式

形式

意義

true / false / int

直接 truthy 檢查。

"${var.x}"

解析占位符後 truthy 檢查。

{"equals": [a, b]}

解析後 a == b

{"not_equals": [a, b]}

解析後 a != b

{"in": [needle, haystack]}

needle in haystack

{"truthy": value}

解析後 truthy 檢查。

範例

{
  "mode": "sequence",
  "tasks": [
    {"method": "post", "request_url": "/login",
     "json": {"email": "${var.email}"},
     "extract": [{"var": "auth", "from": "json_path", "path": "token"}]},
    {"method": "get",  "request_url": "/profile",
     "headers": {"Authorization": "Bearer ${var.auth}"},
     "run_if": {"truthy": "${var.auth}"}},
    {"method": "post", "request_url": "/cart",
     "json": {"product_id": 1},
     "skip_if": {"equals": ["${var.tenant}", "internal"]}}
  ]
}