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 サイトの他の関連記事を参照してください。