Go での REST API のテスト: Go の標準テスト ライブラリを使用した単体テストと統合テストのガイド
導入
この記事では、単体テストと統合テストを使用して、golang で REST API を作成する際の開発エクスペリエンスを向上させる方法を説明します。
単体テストは、アプリケーションの最小の個々の部分の機能を検証するように設計されており、多くの場合、単一の関数またはメソッドに焦点を当てています。これらのテストは、各コンポーネントが単独で期待どおりに動作することを確認するために、コードの他の部分から分離して実行されます。
一方、統合テスト は、アプリケーションのさまざまなモジュールやコンポーネントがどのように連携して動作するかを評価します。この記事では、Go アプリケーションの統合テストに焦点を当て、特に SQL クエリを正常に作成して実行することで、PostgreSQL データベースと正しく対話することを確認します。
この記事は、読者が golang と golang で REST API を作成する方法に精通していることを前提としています。主な焦点は、ルートのテスト (単体テスト) の作成と SQL クエリ関数のテスト (統合テスト) です。参考として、github にアクセスしてください。プロジェクトを見てみましょう。
セットアップ
上にリンクしたものと同様のプロジェクトを設定していると仮定すると、次のようなフォルダー構造になります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
golang でのテストは、テストの作成に必要なツールを提供する組み込みのテスト パッケージがあるため、これまでに遭遇した可能性のある他の言語と比較して簡単です。
テスト ファイルには _test.go という接尾辞が付いた名前が付けられ、go test コマンドを実行するときに、このファイルを実行対象として指定できます。
プロジェクトのエントリポイントは、cmd フォルダーにある main.go ファイルです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
コードから、データベース接続とポート番号を渡して新しい API サーバーを作成していることがわかります。サーバーを作成したら、指定されたポートでサーバーを実行します。
NewAPIServer コマンドは、api.go ファイルから取得されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
この API では、http ルーターとして mux を使用しています。
結合テスト
ユーザー エンティティに関連する SQL クエリを処理するユーザー ストア構造体があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
|
上記のファイルには、3 つのポインター レシーバー メソッドがあります。
- ユーザーの作成
- GetUserByEmail
- GetUserById
これらのメソッドが機能を実行するには、外部システム (この場合は Postgres DB) と対話する必要があります。
このメソッドをテストするには、まずstore_test.go ファイルを作成します。 Go では通常、テスト対象のファイルにちなんでテスト ファイルに名前を付け、サフィックス _test.go .
を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
|
ファイル全体を見て、各セクションの内容を見てみましょう。
最初のアクションは、変数 userTestStore と testDB を宣言することです。これらの変数は、それぞれユーザー ストアとデータベースへのポインターを格納するために使用されます。これらをグローバル ファイル スコープで宣言した理由は、テスト ファイル内のすべての関数がポインターにアクセスできるようにするためです。
TestMain 関数を使用すると、メインのテストを実行する前にいくつかの設定アクションを実行できます。最初に postgres ストアに接続し、ポインターをグローバル変数に保存します。
そのポインターを使用して、接続しようとしている SQL クエリを実行するために使用する userTestStore を作成しました。
defer testDB.Close() はテスト完了後にデータベース接続を閉じます
code := m.Run() は、戻って終了する前に残りのテスト関数を実行します。
TestCreateUser 関数は、create_user 関数のテストを処理します。私たちの目標は、一意の電子メールが渡された場合に関数がユーザーを作成するかどうかをテストすることです。また、一意でない電子メールがすでに別のユーザーの作成に使用されている場合、関数はユーザーを作成できないようにする必要があります。
まず、両方のケースのシナリオをテストするために使用するテスト データを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
テスト日付をパラメータとして create_user 関数を実行してマップをループし、返された値が期待する結果と同じかどうかを比較します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
返された結果が期待した結果と異なる場合、テストは失敗します
この関数の最後の部分では、組み込みのテスト パッケージ関数 Cleanup を使用します。この関数は、テスト内のすべての関数がすでに実行されたときに呼び出される関数を登録しました。ここの例では、このテスト関数の実行中に使用されたユーザー データをクリアする関数を使用しています。
単体テスト
単体テストでは、API のルート ハンドラーをテストします。この場合、ルートはユーザー エンティティに関連します。以下を参照してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
ここにはテストしたい関数が 3 つあります
- ハンドルログイン
- ハンドルレジスタ
- HandleGetUser
ハンドル取得ユーザー
このハンドラーの handleGetUser 関数は、HTTP リクエスト URL で提供されたユーザー ID に基づいてユーザーの詳細を取得します。まず、多重化ルーターを使用してリクエスト パス変数からユーザー ID を抽出します。ユーザー ID が欠落しているか無効 (非整数) の場合、400 Bad Request エラーが返されます。検証が完了すると、関数はデータ ストアの GetUserByID メソッドを呼び出してユーザー情報を取得します。取得中にエラーが発生した場合は、500 Internal Server Error が返されます。成功すると、200 OK ステータスで応答し、応答本文でユーザーの詳細を JSON として送信します。
前に述べたように、ハンドラー関数をテストするには、routes_test.go を作成する必要があります。以下の私のものを参照してください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
新しいハンドラー関数では、ハンドラー構造体を作成するためのパラメーターとしてユーザー ストアが必要です。
実際のストアは必要ないため、モック構造体を作成し、実際の構造体の関数をモックするレシーバー関数を作成します。これを行うのは、ストア関数のテストを個別に処理しているため、ハンドラー テストでコードのその部分をテストする必要がないためです。
テスト関数 TestGetUserHandler は 2 つのケース シナリオをテストします。1 つ目は、ユーザー ID を提供せずにユーザーを取得しようとするものです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
http リクエストが 400 ステータス コードで応答した場合、テストは合格すると予想されます。
2 番目のテスト ケース シナリオは、有効なユーザー ID を含む正しい URL を使用してユーザー情報を取得するケースです。このテスト ケースでは、ステータス コード 200 の応答が期待されました。そうでない場合、そのテストは失敗します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
結論
ルート ハンドラーのテストを作成することで、プロジェクトに単体テストを実装することができました。コードの小さな単位のみをテストするためにモックを使用する方法を見てきました。 Postgresql DB と対話する機能の統合テストを開発できました。
プロジェクト コードを実際に使用したい場合は、ここから github からリポジトリをクローンしてください
以上がGo での REST API のテスト: Go の標準テスト ライブラリを使用した単体テストと統合テストのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。
