Heim >Backend-Entwicklung >Golang >Wie kann das „httptest'-Paket von Go umfassende Tests von HTTP-Handlern und -Servern ermöglichen?

Wie kann das „httptest'-Paket von Go umfassende Tests von HTTP-Handlern und -Servern ermöglichen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-02 19:24:50576Durchsuche

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

HTTP-Aufrufe in Go mit httptest testen

Das httptest-Paket in Go ermöglicht umfassende Tests von HTTP-Handlern, Servern und Antworttexten. Es bietet zwei Hauptkategorien von Tests: Antworttests und Servertests.

Antworttests

Antworttests überprüfen den spezifischen Inhalt von HTTP-Antworten. Hier ist ein Beispiel:

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)
    }
}

Servertests

Bei Servertests wird ein HTTP-Server eingerichtet und Anfragen an ihn gestellt. Dies ist besonders nützlich zum Testen benutzerdefinierter HTTP-Handler und des Serververhaltens. Schauen wir uns ein Beispiel an:

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()
    }
}

Im bereitgestellten Code wird in err = json.Unmarshal(body, &r) unnötigerweise ein Zeiger auf r (Empfänger) verwendet, da r bereits ein Zeiger ist . Dementsprechend sollte es zu err = json.Unmarshal(body, r).

korrigiert werden

Das obige ist der detaillierte Inhalt vonWie kann das „httptest'-Paket von Go umfassende Tests von HTTP-Handlern und -Servern ermöglichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn