環境
- Python
- 3.9
ユースケース
PythonでAPI開発を行い、レスポンスのJSONを比較したい。
次のJSONが等価であることを期待する。
{ "id": 100, "name": "kirimaru" }
{ "name": "kirimaru", "id": 100 }
できていないこと
ソート順を無視したJSONの配列の比較。
対応
JSONを直接比較するような方法は見つかりませんでした。その代わりに、1度辞書型に変換することで目的の比較ができます。
JSON形式の文字列から辞書型に変換するには次のコードで変換できます。
import json json.loads(f"{JSON文字列}")
テストコード
実際には次のようにテストを記載することで確認しました。
import json def test_01(): actual = """ { "id": 100, "name": "kirimaru", } """ expected = """ { "name": "kirimaru", "id": 100, } """ assert json.loads(actual) == json.loads(expected)
エンドポイントを確認するテストでは、テストクライアントの返却値が辞書型ですので、次のように比較できることが多いと思います。
import pytest @pytest.mark.asyncio async def test_response_json(async_client): response = await async_client.get("/health/") # 期待値レスポンスJSON # {"Hello": "World"} assert response.json() == dict(Hello="World")
ソースコード
- fastapi-practice/test_json_assert.py at 1d8a133a63301e2d0cfec08ef857e3ea346973e8 · hirotoKirimaru/fastapi-practice · GitHub
- fastapi-practice/test_healthcheck.py at 1d8a133a63301e2d0cfec08ef857e3ea346973e8 · hirotoKirimaru/fastapi-practice · GitHub
終わりに
あまりWEB APIをPythonで作るようなユースケースが少ないのか、レスポンスJSONを比較するような記事が見つからなくて困りました。
正直、辞書型が正しいレスポンスなのかわからないので、できればJSONで直接比較したいのですが…