calendartechFastAPIバックエンドのテストを書いてみたはじめにこの記事はPanda株式会社アドベントカレンダー2023、12日目の記事です。スタートアップで、現在はAR技術とAI技術を駆使しシステム開発に取り込んでいます。筆者についてPanda株式会社でバックエンド担当している黄です。ソフトウェア開発・サーバー構築・デプロイメントなどをメインになっています。トリリンガルですけど、最近は友達に母国語スキルの低下を指摘されていました。この記事の想定読者FastAPIを用いたバックエンドサーバーのリファクタリングに興味を持つ人FastAPIのユニットテストに経験がない人また、FastAPIの経験がある方を想定しているため、FastAPIの説明は省略しています。環境についてPythonでは数多くテスト用のフレームワークがあり、この記事ではpytestを使っています。ともにテストする手法である。(Wikipedia)簡単に説明すると、ユニットテストは書いていたプログラムがちゃんと想定通りに動いているかを確認する手法です。プログラムを分離し、それぞれのユニット[1]が正しいことを示すことから、アプリケーション全体の厳格性(rigorousness)と明確性(clarity)を保証できます。昨日の記事では、FastAPIのリファクタリングについて紹介していました。今日はその続きの形で、バックエンドのテストを書く方法を紹介しようと思います。First)ユニットテストのプリンシプルは数多くあります、興味がある人はこちらの記事またはこちらの本も参考してください。昨日リファクタリングを終えたバックエンドサーバーは、こういう形になっています。str(error)ユニットテストを書いてみたユニットとはプログラムを動かせる最小単位のコードであり、ユニットテストも同じく最小単位ごとでテストを書く。大体の場合、他のクラスやモジュールを依存していない底層からテストを書くのがいい。今回の事例では、data_crudとdatabaseが該当しています。!Pytestなどのユニットテストフレームワークは特定の命名フォーマットによってテストクラスを認識することが多く、使っているフレームワークのドキュメントを参考してください。!データベースに関連するテストはちょっと違います、今回は詳しく説明しない。興味がある人はFastAPIのドキュメントをご確認ください。create()の結果は想定通りになるかを確認テストケース(test_data_crud)中の関数の使い方はアプリケーション(api/Data)での使い方と同じです。これはユニットテストは関数はどう扱うかを示すことも兼ねるためです。そのため、テストコードを見るだけで各関数の入力、出力または想定した使い方を早く把握できます。これらユニットを一通テストした後、いよいよユニットに依存するコードをテストすることができます。test)になります。今回の事例だとapi/Dataに該当します。test)になります、これはアプリケーションが想定したユースケースに対するテストになります。オンラインショップだと購買機能、SNSだと書き込みなど、各サービスの最表層(ユーザーに見せる部分)になります。この事例だとmainに該当します。{...}今回はFastAPIを用いたWebアプリケーションを対象にしているため、FastAPIのレスポンスを中心にしてテストを行います。一般ではFastAPIのクライアントを模擬してテストを行うはずですが、FastAPIは予めテスト用クライアントを備えており非常に便利です。詳細はFastAPIのドキュメントに参照してください。!リクエストから情報を渡せる方法についてはhttpxのドキュメントも参照してください。12日目を執筆させていただきました。アジャイル開発では、小まめのリファクタリングがよく行われるため、リファクタリング前後のシステム保守は非常に重要になります。毎回実際のインタフェースからテストを行うことができますが、それは時間を掛かりますし、ヒューマンエラー防止の観点から良くないです。そのため、ちゃんとテストを行うことによってコードの仕様が想定通りに保証することができ、コードの可読性も上がることがあります。最初は無駄足だと思っても、開発時間が長く伸びるほど有難さが増えるのがユニットテストです。備えがあれば憂いなし。Japanです、弊社も松尾研のスタートアップブースにて出展しています、AR技術の応用について興味がある人は是非ビックサイトに一回寄ってください。修士卒、KASYS研出身。長文書に対する分類に関する研究を行っていた。修士卒、KASYS研出身。長文書に対する分類に関する研究を行っていた。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。