首頁 >後端開發 >Golang >Go 的 httptest 套件如何促進 HTTP 處理程序和伺服器的全面測試?

Go 的 httptest 套件如何促進 HTTP 處理程序和伺服器的全面測試?

Linda Hamilton
Linda Hamilton原創
2025-01-02 19:24:50578瀏覽

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

使用 httptest 測試 Go 中的 HTTP 呼叫

Go 中的 httptest 套件允許對 HTTP 處理程序、伺服器和回應主體進行全面測試。它提供兩大類測試:回應測試和伺服器測試。

回應測試

回應測試驗證 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()
    }
}

在提供的程式碼中,在err = json.Unmarshal(body, &r) 中不必要地使用了指向r(接收器)的指針,因為r 已經是一個指針。因此,應將其更正為 err = json.Unmarshal(body, r).

以上是Go 的 httptest 套件如何促進 HTTP 處理程序和伺服器的全面測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn