近年、Golang 言語の人気と効率性により、開発者からの注目と愛がますます高まっています。 Golang は、httptest ライブラリなどの、シンプルで使いやすいテスト フレームワークを提供します。この記事では、Golang 開発者のその後のテスト作業に役立つことを願って、httptest の基本的な概念、使い方、注意点を紹介します。
Golang テスト フレームワークにおける httptest の主な機能は、テスターが HTTP リクエストとレスポンスをシミュレートして、API インターフェイスを簡単にテストできるようにすることです。サーバーのテスト。ネットワークや実際の HTTP サーバーには依存しませんが、Golang が提供する net/http パッケージの関数を使用して、リクエストと応答のプロセス全体をシミュレートします。
(1) テスト サーバーの作成
httptest では、NewServer メソッドを使用してテスト サーバーを作成する必要があります。このメソッドのパラメータは、http.Handler インターフェイスを実装する HandlerFunc で渡す必要があります。たとえば、GET リクエストを処理する HandlerFunc を作成し、それを通じてテスト サーバーを作成できます。
func TestGetFoo(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "Hello, World!") })) defer srv.Close() resp, err := http.Get(srv.URL) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode) } }
(2) リクエストを送信します
テスト サーバーを作成したら、クライアントはサーバーにリクエストを送信します。 ClientはGolangが提供するHTTPリクエストクライアントです。たとえば、POST リクエストを処理する HandlerFunc を作成し、そこからテスト サーバーを作成できます。次に、Json データを含む POST リクエストを送信します。
func TestPostJson(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, _ := ioutil.ReadAll(r.Body) w.WriteHeader(http.StatusOK) fmt.Fprintln(w, string(body)) })) defer srv.Close() payload := struct { Name string `json:"name"` Age int `json:"age"` }{ Name: "Robert", Age: 30, } buf, _ := json.Marshal(payload) resp, err := http.Post(srv.URL, "application/json", bytes.NewReader(buf)) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode) } body, _ := ioutil.ReadAll(resp.Body) if string(body) != `{"name":"Robert","age":30}` { t.Errorf("expected %s but got %s", `{"name":"Robert","age":30}`, string(body)) } }
(3) リクエスト ヘッダーとレスポンス ヘッダーを設定します
テストでは、リクエスト ヘッダーとレスポンス ヘッダーも非常に重要な部分です。 Header メソッドを通じてリクエスト ヘッダーとレスポンス ヘッダーを設定できます。たとえば、GET リクエストを処理する HandlerFunc を作成し、そこからテスト サーバーを作成できます。次に、リクエスト ヘッダーとレスポンス ヘッダーを設定します。
func TestHeader(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-test", "hello") w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "Hello, World!") })) defer srv.Close() req, err := http.NewRequest("GET", srv.URL, nil) if err != nil { t.Fatal(err) } req.Header.Add("X-test", "world") resp, err := http.DefaultClient.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode) } if resp.Header.Get("X-test") != "hello" { t.Errorf("expected %s but got %s", "hello", resp.Header.Get("X-test")) } }
(4) HTTPS リクエストの処理
実際のプロジェクトでは、多くの HTTP インターフェイスで HTTPS を介した安全な送信が必要です。 httptest では、NewTLSServer メソッドを通じて HTTPS をサポートするテスト サーバーを作成することもできます。新しく作成されたサーバーは自己署名証明書を使用するため、運用環境では使用しないでください。たとえば、POST リクエストを処理する HandlerFunc を作成し、それを使用して HTTPS をサポートするテスト サーバーを作成できます。次に、Json データを含む POST リクエストを送信します。
func TestTlsPostJson(t *testing.T) { srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, _ := ioutil.ReadAll(r.Body) w.WriteHeader(http.StatusOK) fmt.Fprintln(w, string(body)) })) defer srv.Close() payload := struct { Name string `json:"name"` Age int `json:"age"` }{ Name: "Robert", Age: 30, } buf, _ := json.Marshal(payload) client := srv.Client() resp, err := client.Post(srv.URL, "application/json", bytes.NewReader(buf)) if err != nil { t.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode) } body, _ := ioutil.ReadAll(resp.Body) if string(body) != `{"name":"Robert","age":30}` { t.Errorf("expected %s but got %s", `{"name":"Robert","age":30}`, string(body)) } }
httptest は Golang テスト フレームワークでは非常に便利で実用的ですが、不適切に使用するとリーディングが発生する可能性があります。不正確なテスト結果が生じる可能性があります。次の点に注意する必要があります。
(1) httptest は、テスト目的のみに限り、運用環境の HTTP または HTTPS サーバーとして使用しないでください。
(2) テスト サーバーが適切にシャットダウンされていない場合、テスト スイートが多すぎるためにリソースが枯渇する可能性があります。
(3) httptest で提出したデータと提出したデータが一致しない場合、正しいテスト結果を得ることができません。
Golang のテスト プロセスにおいて、httptest は HTTP リクエストとレスポンスをシミュレートするのに役立つ非常に便利なツールであり、それによってサーバー側 API を簡単にテストできます。 . テスト用のインターフェイス。この記事では、httptest の基本的な概念、使い方、注意点を詳しく紹介し、Golang 開発者の今後のテスト作業に役立てていただければと思います。
以上がgolang httptestの使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。