2021年3月30日火曜日

tavern で REST API テスト超入門

概要

python の tavern は REST API をテストするのに特化したテストフレームワークです
テストケースを yaml で記載するだけでテストを書くことができます
今回はよく使いそうなサンプルケースを試してみました

環境

  • macOS 11.2.3
  • Python 3.8.7
    • tavern 1.14.1

インストール

  • pipenv install tavern

テストファイルの命名規則

test_x.tavern.yaml という感じで定義します
x の部分に好きなテスト名を入力しましょう
例えば test_get-id.tavern.yaml という感じでテストを定義できます

とりあえず GET をコール

  • vim test_sample_get.tavern.yaml
---

test_name: Sample Get Test

stages:
  - name: Make sure we have the right method
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: GET
    response:
      strict: False
      status_code: 200
      json:
        path_info: /
        method: GET
  • pipenv run pytest test_sample_get.tavern.yaml

or

  • pipenv run tavern-ci test_sample_get.tavern.yaml

テスト自体は pytest を経由して行います
ファイル名を指定しない場合は命名規則に従っているファイルをすべてテストしてくれます
tavern-ci というコマンドを使ってもテストできます
こちらの場合は pytest にないオプションを使ってテストできます
ログファイルを名を指定するとテスト結果をログファイルに記載したりできます

strict: False

response の検証時に strict: False を指定することでレスポンス全体の検証ではなく一部の key の検証のみにすることができます (参考)
レスポンスの JSON 全体と照合させたい場合には True もしくは設定自体を削除しましょう

前の結果を使う

---

test_name: Sample Save Data Test

stages:
  - name: Make sure we have the right method
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: GET
    response:
      strict: False
      status_code: 200
      json:
        path_info: /
        method: GET
      save:
        json:
          returned_method: method

  - name: Make sure we have the right returned_method
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: GET
      params:
        returned_method: "{returned_method:s}"
    response:
      strict: False
      status_code: 200
      json:
        query_string: "returned_method={returned_method:s}"

save でデータを保存できます
保存したデータは "{val_name:type}" という形式で参照できます
val_name は save 時に指定したキー名で type は型を指定します
上記であれば文字列情報を格納した returned_method を参照するので string である s を指定しています

特定の状態になるまでポーリングする

---

test_name: Sample Polling Test

stages:
  - name: Make sure we have the right state
    max_retries: 3
    delay_after: 5
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: GET
    response:
      status_code: 200
      json:
        status: ready

max_retriesdelay_after を使います
前者はリトライ回数で後者は失敗後にウェイトする秒数を指定します 
非同期 API などではよく使う機能かなと思います
上記はサンプルですべてエラーになります
リトライの上限に達すると tavern.util.retry:retry.py:59 Stage 'Make sure we have the right state' did not succeed in 3 retries. という感じのエラーが表示されます

POST + JSON ボディを送信する

---

test_name: Sample Post Test

stages:
  - name: Make sure we have the right body
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: POST
      json:
        name: hawksnowlog
    response:
      strict: False
      status_code: 200
      json:
        method: POST
        body: !raw '{"name": "hawksnowlog"}'

request にそのまま json を含まれば OK です
レスポンスの検証時に文字列内に ブラケット {} が含まれる場合は !raw を使うことで変数展開されずにそのまま検証できます

クエリストリングを送信する

---

test_name: Sample Query String Test

stages:
  - name: Make sure we have the right query_string
    request:
      url: https://kaka-request-dumper.herokuapp.com/
      method: GET
      params:
        name: hawksnowlog
    response:
      strict: False
      status_code: 200
      json:
        method: GET
        query_string: "name=hawksnowlog"

先程の POST 時のままで method を GET に変更すれば OK です

最後に

他にも Python スクリプトを直接コールしたりする機能や他のテスト YAML ファイルを include したり any 機能で型判定だけする機能などもあるので興味があれば調べてみると良いと思います

参考サイト

0 件のコメント:

コメントを投稿