Go でのライブ リクエストによる HTTP サーバーのテスト
当面の問題には、HTTP ハンドラー関数がさまざまな HTTP リクエスト メソッドに正しく応答することを確認することが含まれますライブサーバーシナリオの (GET および POST)。これには、単体テストだけに依存するのではなく、実際のサーバーのコンテキスト内でハンドラーをテストする必要があります。
これを実現するために、net/http/httptest.Server タイプがソリューションを提供します。これにより、特定のルーターを使用するライブサーバーの作成が可能になります。ルーターは、Gorilla mux (質問で述べたように)、net/http の ServeMux、または net/http ハンドラー インターフェイスを満たすその他の実装に基づくことができます。
ライブ サーバーをセットアップする方法の例は次のとおりです。 using httptest.Server:
<code class="go">import ( "io" "net/http" "net/http/httptest" "testing" ) func TestIndex(t *testing.T) { // Create a server using the router initialized outside the test function. ts := httptest.NewServer(router) defer ts.Close() // Create a function to generate a request with the desired method and URL. newreq := func(method, url string, body io.Reader) *http.Request { r, err := http.NewRequest(method, url, body) if err != nil { t.Fatal(err) } return r } // Define test cases with various requests. tests := []struct { name string r *http.Request }{ {name: "1: testing get", r: newreq("GET", ts.URL+"/", nil)}, {name: "2: testing post", r: newreq("POST", ts.URL+"/", nil)}, // Note: POST requests require a reader in the body } // Run tests with live requests to the server. for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { resp, err := http.DefaultClient.Do(tt.r) defer resp.Body.Close() if err != nil { t.Fatal(err) } // Check for expected response in the live server's response here. }) } }</code>
この例では、ルーターはテスト関数の外で初期化されると想定されています。次に、ルーターを使用して httptest.Server が作成され、テストが完了すると閉じられます。 newreq 関数は、特定のメソッドと URL を使用してリクエストを生成するために使用されます。テスト ケースは、反復を容易にするために構造体のスライスとして定義されています。
http.DefaultClient.Do() を使用してサーバーにライブ リクエストを送信することで、ハンドラー関数の動作をコンテキストで検証できます。ライブサーバー。これにより、分離された単体テストと比較して、より包括的なテスト アプローチが提供されます。
この回答のアプローチと詳細は、Gorilla mux だけでなく、http.Handler インターフェイスを実装するルーターに適用できることに注意してください。
以上がGo でライブ リクエストを使用して HTTP サーバー ハンドラーをテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。