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.
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) 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) } }
(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)) } }
(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")) } }
(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)) } }
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.
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!