Maison >développement back-end >Golang >Comment le package « httptest » de Go peut-il faciliter les tests complets des gestionnaires et des serveurs HTTP ?

Comment le package « httptest » de Go peut-il faciliter les tests complets des gestionnaires et des serveurs HTTP ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-02 19:24:50578parcourir

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

Test des appels HTTP dans Go avec httptest

Le package httptest dans Go permet de tester de manière complète les gestionnaires HTTP, les serveurs et les corps de réponse. Il propose deux grandes catégories de tests : les tests de réponse et les tests de serveur.

Tests de réponse

Les tests de réponse vérifient le contenu spécifique des réponses HTTP. Voici un exemple :

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

Tests de serveur

Les tests de serveur impliquent la configuration d'un serveur HTTP et l'envoi de requêtes à celui-ci. Ceci est particulièrement utile pour tester les gestionnaires HTTP personnalisés et le comportement du serveur. Regardons un exemple :

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

Dans le code fourni, il y a une utilisation inutile d'un pointeur vers r (récepteur) dans err = json.Unmarshal(body, &r), car r est déjà un pointeur . En conséquence, il doit être corrigé comme suit : err = json.Unmarshal(body, r).

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn