きり丸の技術日記

技術検証したり、資格等をここに残していきます。

PythonでJSONを比較したい(I want assert JSON by Python)

環境

  • 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")

ソースコード

終わりに

あまりWEB APIをPythonで作るようなユースケースが少ないのか、レスポンスJSONを比較するような記事が見つからなくて困りました。

正直、辞書型が正しいレスポンスなのかわからないので、できればJSONで直接比較したいのですが…

類似情報

参考情報