Chapter 08無料公開

前のステップの結果を使用する

Ken’ichiro Oyama
Ken’ichiro Oyama
2023.01.16に更新

runnは、各ステップで得た結果をHTTPレスポンスに限らずデータベースへのクエリ結果やコマンドの標準出力/標準エラーなども全て自動的に保持します。

何も設定せずとも実行したステップの結果を使用できます。

例えば、まず最初のWeb APIにHTTPリクエストを送信して、そのレスポンスの値を使って次のAPIにHTTPリクエストを送信できます。

上記の例を具体的にランブックで表現してみましょう。

desc: ログインしてプロジェクト一覧を取得する
runners:
  req: https://example.com/api/v1
vars:
  username: ${USERNAME}
  password: ${PASSWORD}
steps:
  -
    desc: 'ステップ0. username/passwordでログインをする'
    req:
      /login:
        post:
          body:
            application/json:
              email: "{{ vars.username }}"
              password: "{{ vars.password }}"
    test: current.res.status == 200
  -
    desc: 'ステップ1. /loginのレスポンスで受け取った認証トークンを使ってログイン状態でプロジェクト一覧を取得する'
    req:
      /projects:
        get:
          headers:
            Authorization: "token {{ previous.res.body.session_token }}"
          body: null
    test: len(current.res.body.projects) > 0

このランブックには2つのステップがあります。

ステップ0では、 vars: セクションであらかじめ設定した vars.usernamevars.password を使って POST /login のHTTPリクエストを送信しています。

ステップ1では、ステップ0のレスポンスで受け取った認証トークン(previous.res.body.session_token)をヘッダに付与して GET /projects のHTTPリクエストを送信しています。

ランブックをみると、特に各ステップの結果を保持する設定はありません。このように何も設定しなくてもステップの結果を使用できます。

保持されたステップの結果を使用する方法

保持されたステップの結果を使用する方法は大きく2つあります。

1. ステップのインデックス番号やステップのキーを指定して使用する方法 steps[*] steps.<key>

まずは直接ステップを指定する方法です。

ステップをリスト形式で記述している場合は、ステップのインデックス番号を指定してそのステップの結果を使用できます。

steps:
  -
    desc: 'ステップ0. username/passwordでログインをする'
    req:
      /login:
        post:
          body:
            application/json:
              email: "{{ vars.username }}"
              password: "{{ vars.password }}"
    test: steps[0].res.status == 200
  -
    desc: 'ステップ1. /loginのレスポンスで受け取った認証トークンを使ってログイン状態でプロジェクト一覧を取得する'
    req:
      /projects:
        get:
          headers:
            Authorization: "token {{ steps[0].res.body.session_token }}"
          body: null
    test: len(steps[1].res.body.projects) > 0

リスト形式のステップのインデックスは0から始まりますので注意してください。

ステップをマップ形式で記述している場合は、ステップのキーを指定してそのステップのレスポンスを使用できます。

steps:
  login:
    desc: 'ステップ0. username/passwordでログインをする'
    req:
      /login:
        post:
          body:
            application/json:
              email: "{{ vars.username }}"
              password: "{{ vars.password }}"
    test: steps.login.res.status == 200
  listProjects:
    desc: 'ステップ1. /loginのレスポンスで受け取った認証トークンを使ってログイン状態でプロジェクト一覧を取得する'
    req:
      /projects:
        get:
          headers:
            Authorization: "token {{ steps.login.res.body.session_token }}"
          body: null
    test: len(steps.listProjects.res.body.projects) > 0

2. ステップの前後関係を指定して使用する方法 current previous

ステップを直接指定するよりも直感的な方法として、前後関係を指定して使用する方法を用意しています。

1つ前のステップを指定する場合は previous で指定できます。

また、Test runnerやDump runnerなど、他のランナーと同じステップで実行できるランナーの場合、「現在ステップ」を示す current で指定できます。

steps:
  -
    desc: 'ステップ0. username/passwordでログインをする'
    req:
      /login:
        post:
          body:
            application/json:
              email: "{{ vars.username }}"
              password: "{{ vars.password }}"
    test: current.res.status == 200
  -
    desc: 'ステップ1. /loginのレスポンスで受け取った認証トークンを使ってログイン状態でプロジェクト一覧を取得する'
    req:
      /projects:
        get:
          headers:
            Authorization: "token {{ previous.res.body.session_token }}"
          body: null
    test: len(current.res.body.projects) > 0

各ランナーがどのような構造で結果を保持するかはREADMEを確認してください。