このチャプターの目次
同じステップを複数回実行したいときがあります。
例えば、ログイン試行回数による制限の機能をテストしたい(指定数実行したい)ケースなどが考えられます。
この時、同じステップを実行したい回数分記述する必要はありません。
loop構文を使うことで簡潔に記述できます。
steps[*].loop:
steps.<key>.loop:
カートに商品を入れるWeb API POST /cart/in
があるとします。
runners:
req: https://example.com/api/v1
steps:
-
desc: カートに商品を入れる
req:
/cart/in:
post:
body:
application/json:
product_id: 'P00123'
[...]
10回カートインするステップは、loop構文を使って次のように書くことができます。
steps:
-
desc: 10回カートに商品を入れる
loop: 10
req:
/cart/in:
post:
body:
application/json:
product_id: 'P00123'
[...]
ループのインターバルの調整
外部のWeb APIにリクエストを送信する場合など、ループのインターバルを調整したい場合があります。
固定のインターバルを設定する
loop.interval:
でループのインターバルを設定できます。
steps:
-
desc: 1秒間隔で10回カートに商品を入れる
loop:
count: 10
interval: 1sec
req:
/cart/in:
post:
body:
application/json:
product_id: 'P00123'
[...]
指数バックオフ(Exponential Backoff)でループのインターバルを設定する
ループのインターバルに指数バックオフ(Exponential Backoff)を使用できます。
steps:
-
desc: 1秒間隔で10回カートに商品を入れる
loop:
count: 10
minInterval: 500ms
maxInterval: 1min
jitter: 0.1
multiplier: 1.5
req:
/cart/in:
post:
body:
application/json:
product_id: 'P00123'
[...]
ループの実行回数(インデックス)を使用する
ステップのループ実行回数(インデックス)は、変数 i
でアクセスできます。
i
は0からはじまり、ループするたびに1カウントアップします。
steps:
-
desc: 5アカウント分サインアップする
loop:
count: 5
req:
/signup:
post:
body:
application/json:
email: 'alice+dummy{{ i }}@example.com' # `i`を使って重複せずにメールアドレスを設定する
password: 'password{{ i }}'
[...]
[コラム] 指数バックオフ
runnではループ機能のコアに github.com/lestrrat-go/backoff/v2
パッケージを使用しています。
この lestrrat-go/backoff パッケージを題材としたAPIの設計について考える次の資料はとても勉強になります[1]。オススメです。
GoらしいAPIを求める旅路 GoCon 2018 Spring
続編とも言える並行処理編も同じくオススメです。是非ご覧ください。
-
github.com/lestrrat-go/backoff/v2
パッケージを使用させてもらっている理由も使いやすいAPIだからです。 ↩︎