Maison > développement back-end > Golang > A quoi sert golang httptest

A quoi sert golang httptest

PHPz
Libérer: 2023-04-14 13:49:51
original
945 Les gens l'ont consulté

Ces dernières années, avec la popularité et l'efficacité du langage Golang, il a attiré de plus en plus l'attention et l'amour des développeurs. Golang fournit un cadre de test simple et facile à utiliser, comprenant la bibliothèque httptest. Dans cet article, je présenterai les concepts de base, l'utilisation et les précautions de httptest, dans l'espoir d'aider les développeurs Golang dans leurs travaux de tests ultérieurs.

  1. Introduction à httptest

Dans le framework de test de Golang, la fonction principale de httptest est d'aider les testeurs à simuler les requêtes et les réponses HTTP, afin de tester facilement l'interface API côté serveur. Il ne s'appuie pas sur le réseau ni sur le serveur HTTP réel, mais utilise les fonctions du package net/http fourni par Golang pour simuler l'ensemble du processus de demande et de réponse.

  1. Méthodes communes de httptest

(1) Créer un serveur de test

Dans httptest, nous devons créer un serveur de test via la méthode NewServer. Les paramètres de cette méthode doivent être transmis dans un HandlerFunc qui implémente l'interface http.Handler. Par exemple, nous pouvons créer un HandlerFunc qui gère les requêtes GET et créer un serveur de test via celui-ci :

func TestGetFoo(t *testing.T) {
    srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "Hello, World!")
    }))
    defer srv.Close()

    resp, err := http.Get(srv.URL)
    if err != nil {
        t.Fatal(err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode)
    }
}
Copier après la connexion

(2) Envoyer une requête

Après avoir le serveur de test, nous pouvons envoyer des requêtes au serveur via le client. Le client est un client de requête HTTP fourni par Golang. Par exemple, nous pouvons créer un HandlerFunc qui gère les requêtes POST et créer un serveur de test à partir de celui-ci. Envoyez ensuite une requête POST contenant des données Json :

func TestPostJson(t *testing.T) {
    srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        body, _ := ioutil.ReadAll(r.Body)
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, string(body))
    }))
    defer srv.Close()

    payload := struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }{
        Name: "Robert",
        Age:  30,
    }
    buf, _ := json.Marshal(payload)
    resp, err := http.Post(srv.URL, "application/json", bytes.NewReader(buf))
    if err != nil {
        t.Fatal(err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode)
    }
    body, _ := ioutil.ReadAll(resp.Body)
    if string(body) != `{"name":"Robert","age":30}` {
        t.Errorf("expected %s but got %s", `{"name":"Robert","age":30}`, string(body))
    }
}
Copier après la connexion

(3) Définissez les en-têtes de requête et les en-têtes de réponse

Lors des tests, les en-têtes de requête et les en-têtes de réponse sont également des éléments très importants. Nous pouvons définir des en-têtes de requête et des en-têtes de réponse via la méthode Header. Par exemple, nous pouvons créer un HandlerFunc qui gère les requêtes GET et créer un serveur de test à partir de celui-ci. Définissez ensuite l'en-tête de requête et l'en-tête de réponse :

func TestHeader(t *testing.T) {
    srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("X-test", "hello")
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "Hello, World!")
    }))
    defer srv.Close()

    req, err := http.NewRequest("GET", srv.URL, nil)
    if err != nil {
        t.Fatal(err)
    }
    req.Header.Add("X-test", "world")
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        t.Fatal(err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode)
    }
    if resp.Header.Get("X-test") != "hello" {
        t.Errorf("expected %s but got %s", "hello", resp.Header.Get("X-test"))
    }
}
Copier après la connexion

(4) Traitement des requêtes HTTPS

Dans les projets réels, de nombreuses interfaces HTTP nécessitent une transmission sécurisée via HTTPS. Dans httptest, nous pouvons également créer un serveur de test prenant en charge HTTPS via la méthode NewTLSServer. Le serveur nouvellement créé utilise un certificat auto-signé et ne doit donc pas être utilisé dans un environnement de production. Par exemple, nous pouvons créer un HandlerFunc qui gère les requêtes POST et l'utiliser pour créer un serveur de test prenant en charge HTTPS. Envoyez ensuite une requête POST contenant des données Json :

func TestTlsPostJson(t *testing.T) {
    srv := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        body, _ := ioutil.ReadAll(r.Body)
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, string(body))
    }))
    defer srv.Close()

    payload := struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
    }{
        Name: "Robert",
        Age:  30,
    }
    buf, _ := json.Marshal(payload)
    client := srv.Client()

    resp, err := client.Post(srv.URL, "application/json", bytes.NewReader(buf))
    if err != nil {
        t.Fatal(err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected %d but got %d", http.StatusOK, resp.StatusCode)
    }
    body, _ := ioutil.ReadAll(resp.Body)
    if string(body) != `{"name":"Robert","age":30}` {
        t.Errorf("expected %s but got %s", `{"name":"Robert","age":30}`, string(body))
    }
}
Copier après la connexion
  1. Notes sur httptest

Bien que httptest soit pratique et pratique dans le cadre de test Golang, une utilisation inappropriée peut toujours conduire à des résultats de test inexacts. Nous devons prêter attention aux points suivants :

(1) httptest ne doit pas être utilisé comme serveur HTTP ou HTTPS dans un environnement de production, uniquement à des fins de test.

(2) Si le serveur de test n'est pas arrêté correctement, les ressources peuvent être épuisées en raison d'un trop grand nombre de suites de tests.

(3) Si les données soumises à l'aide de httptest ne correspondent pas aux données que vous avez soumises, vous ne pourrez pas obtenir les résultats de test corrects.

  1. Résumé

Dans le processus de test Golang, httptest est un outil très utile qui peut nous aider à simuler les requêtes et les réponses HTTP pour tester facilement l'interface API côté serveur. Dans cet article, nous présentons en détail les concepts de base, l'utilisation et les précautions de httptest, dans l'espoir d'aider les développeurs Golang dans leurs travaux de test ultérieurs.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal