Chapter 09無料公開

同じステップを複数回実行する

Ken’ichiro Oyama
Ken’ichiro Oyama
2023.01.15に更新

同じステップを複数回実行したいときがあります。

例えば、ログイン試行回数による制限の機能をテストしたい(指定数実行したい)ケースなどが考えられます。

この時、同じステップを実行したい回数分記述する必要はありません。

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 パッケージを使用しています。

https://github.com/lestrrat-go/backoff

この lestrrat-go/backoff パッケージを題材としたAPIの設計について考える次の資料はとても勉強になります[1]。オススメです。

GoらしいAPIを求める旅路 GoCon 2018 Spring

続編とも言える並行処理編も同じくオススメです。是非ご覧ください。

https://www.youtube.com/watch?v=PwtuBnk9yjU

脚注
  1. github.com/lestrrat-go/backoff/v2 パッケージを使用させてもらっている理由も使いやすいAPIだからです。 ↩︎