概要
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_retries
と delay_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 機能で型判定だけする機能などもあるので興味があれば調べてみると良いと思います