【FastAPI】APIをテストする方法【入門】

敬遠しがちなテストコードですが、FastAPIではとても書きやすい印象です。

今回はテスト方法についてご紹介いたします。

この記事のサンプルコード

目次

パッケージのインストール

まずはFastAPI内に用いられている、テストに必要なパッケージのrequestspytestをインストールします。

pip install requests pytest

必要なモジュールのインポート

テスト実行用のtest_main.pyを作成します。

テストの実行には、fastapi.testclientからTestClientをインポートして記述していきます。

from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

テストの実行には、pytestpytest filenameで行います。

pytest

テストファイルの記述

今回は、複数のエンドポイントを用いてテストを試してみます。

APIへのアクセスとステータスコードの確認

/products/allのテストコードを記述します。

requestsのようにresponse = client.get("/products/all")でリクエストを簡単に送れます。

def test_get_products_all():
    response = client.get("/products/all")
    assert response.status_code == 200

また、ステータスコードの確認もレスポンスから確認するだけでOKです。

def test_get_products_all():
    response = client.get("/products/all")
    assert response.status_code == 200

認証用のデータを送信する

リクエストの際にデータを送る場合は、data={}とします。

def test_auth_success():
    response = client.post(
        "/token",
        data={
            "username": "string",
            "password": "string"
        }
    )
    access_token = response.json().get("access_token")
    assert access_token

受けとったレスポンスに、アクセストークンがあるかassertでチェックしています。

assertは結果がTrueではない場合に、テスト時にエラーを返してくれます。

エラーメッセージの確認

次は同じAPIでのエラーメッセージの確認を行います。

def test_auth_error():
    response = client.post(
        "/token",
        data={
            "username": "",
            "password": ""
        }
    )
    access_token = response.json().get("access_token")
    assert access_token == None
    message = response.json().get("detail")[0].get("msg")
    assert message == "field required"

メッセージ内容を確認するだけです。

ヘッダーの付与とjson

新規記事作成のAPIをテストします。手順としては

  • JWTトークンの生成
  • ポストする内容と認証用トークンを使用してリクエストを送る
  • ステータスコードの確認
  • レスポンスで返ってきた記事の内容を確認

となります。

def test_post_article():
    auth = client.post(
        "/token",
        data={
            "username": "string",
            "password": "string"
        }
    )
    access_token = auth.json().get("access_token")
    assert access_token

    response = client.post(
        "/article/",
        json={
            "title": "string3",
            "content": "string3",
            "is_display": True,
            "creater_id": 1
        },
        headers={
            "Authorization": f'Bearer {access_token}'
        }
    )
    print(response.json())
    assert response.status_code == 200
    assert response.json().get("title") == "string3"

前半は先ほどと同じです。jsonheadersの引数で必要な情報を送っています。

pytestの使い方についてはコチラをご確認ください。

テストの実行

最後にテストを実施してみましょう。

4 passedで全てのテストが成功しました。敬遠しがちなテストも書きやすいですね。

この記事のサンプルコード

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる