ホームページ >バックエンド開発 >Golang >golang httptestの使用法は何ですか

golang httptestの使用法は何ですか

PHPz
PHPzオリジナル
2023-04-14 13:45:24947ブラウズ

近年、Golang 言語の人気と効率性により、開発者からの注目と愛がますます高まっています。 Golang は、httptest ライブラリなどの、シンプルで使いやすいテスト フレームワークを提供します。この記事では、Golang 開発者のその後のテスト作業に役立つことを願って、httptest の基本的な概念、使い方、注意点を紹介します。

  1. httptest の概要

Golang テスト フレームワークにおける httptest の主な機能は、テスターが HTTP リクエストとレスポンスをシミュレートして、API インターフェイスを簡単にテストできるようにすることです。サーバーのテスト。ネットワークや実際の HTTP サーバーには依存しませんが、Golang が提供する net/http パッケージの関数を使用して、リクエストと応答のプロセス全体をシミュレートします。

  1. httptest 共通メソッド

(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))
    }
}
  1. httptest に関する注意事項

httptest は Golang テスト フレームワークでは非常に便利で実用的ですが、不適切に使用するとリーディングが発生する可能性があります。不正確なテスト結果が生じる可能性があります。次の点に注意する必要があります。

(1) httptest は、テスト目的のみに限り、運用環境の HTTP または HTTPS サーバーとして使用しないでください。

(2) テスト サーバーが適切にシャットダウンされていない場合、テスト スイートが多すぎるためにリソースが枯渇する可能性があります。

(3) httptest で提出したデータと提出したデータが一致しない場合、正しいテスト結果を得ることができません。

  1. 概要

Golang のテスト プロセスにおいて、httptest は HTTP リクエストとレスポンスをシミュレートするのに役立つ非常に便利なツールであり、それによってサーバー側 API を簡単にテストできます。 . テスト用のインターフェイス。この記事では、httptest の基本的な概念、使い方、注意点を詳しく紹介し、Golang 開発者の今後のテスト作業に役立てていただければと思います。

以上がgolang httptestの使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。