ホームページ > バックエンド開発 > Golang > Go の「httptest」パッケージはどのように HTTP ハンドラーとサーバーの包括的なテストを容易にすることができますか?

Go の「httptest」パッケージはどのように HTTP ハンドラーとサーバーの包括的なテストを容易にすることができますか?

Linda Hamilton
リリース: 2025-01-02 19:24:50
オリジナル
557 人が閲覧しました

How Can Go's `httptest` Package Facilitate Comprehensive Testing of HTTP Handlers and Servers?

httptest を使用した Go での HTTP 呼び出しのテスト

Go の httptest パッケージを使用すると、HTTP ハンドラー、サーバー、および応答本体の包括的なテストが可能になります。レスポンス テストとサーバー テストという 2 つの主要なテスト カテゴリが提供されます。

レスポンス テスト

レスポンス テストは、HTTP レスポンスの特定のコンテンツを検証します。以下に例を示します。

func TestHeader3D(t *testing.T) {
    resp := httptest.NewRecorder()

    // Create a request with specified parameters.
    param := make(url.Values)
    param["param1"] = []string{"/home/test"}
    param["param2"] = []string{"997225821"}

    req, err := http.NewRequest("GET", "/3D/header/?"+param.Encode(), nil)
    if err != nil {
        t.Fatal(err)
    }

    // Send the request to the default HTTP server.
    http.DefaultServeMux.ServeHTTP(resp, req)

    // Read the response body.
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fail()
    }

    // Check the response body for expected content.
    if strings.Contains(string(body), "Error") {
        t.Errorf("header response shouldn't return error: %s", body)
    } else if !strings.Contains(string(body), `expected result`) {
        t.Errorf("header response doen't match:\n%s", body)
    }
}
ログイン後にコピー

サーバー テスト

サーバー テストには、HTTP サーバーのセットアップとそのサーバーへのリクエストが含まれます。これは、カスタム HTTP ハンドラーとサーバーの動作をテストする場合に特に役立ちます。例を見てみましょう:

func TestIt(t *testing.T) {
    // Create an HTTP server with a mock handler.
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprintln(w, `{"fake twitter json string"}`)
    }))
    defer ts.Close()

    // Update the Twitter URL with the mock server's URL and retrieve a channel for results.
    twitterUrl = ts.URL
    c := make(chan *twitterResult)
    go retrieveTweets(c)

    // Receive and verify the results.
    tweet := <-c
    if tweet != expected1 {
        t.Fail()
    }
    tweet = <-c
    if tweet != expected2 {
        t.Fail()
    }
}
ログイン後にコピー

提供されたコードでは、r がすでにポインターであるため、err = json.Unmarshal(body, &r) で r (受信者) へのポインターが不必要に使用されています。 。したがって、 err = json.Unmarshal(body, r).

に修正する必要があります。

以上がGo の「httptest」パッケージはどのように HTTP ハンドラーとサーバーの包括的なテストを容易にすることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート