Maison >développement back-end >Golang >Comment puis-je tester en direct un serveur HTTP dans Go ?

Comment puis-je tester en direct un serveur HTTP dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-02 07:55:02216parcourir

How can I perform live testing of an HTTP server in Go?

Test en direct d'un serveur HTTP dans Go

Lors des tests unitaires des gestionnaires HTTP, il est essentiel de s'assurer qu'ils répondent avec précision aux différentes méthodes de requête. Les tests unitaires ne reflètent souvent pas le comportement réel du serveur lorsqu'il est utilisé avec un routeur tel que Gorilla mux. Pour des tests complets, une version « serveur live » est requise.

Solution : Utiliser httptest.Server

Le type net/http/httptest.Server offre un moyen pratique pour créer un serveur live pour les tests. Il prend un Handler en entrée, qui peut être un routeur, un ServeMux ou tout autre type implémentant l'interface Handler. Le code suivant démontre son utilisation :

<code class="go">import (
    "io"
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestIndex(t *testing.T) {
    // Initialize the router as you would in a production environment.
    router := mux.NewRouter()
    router.HandleFunc("/", views.Index).Methods("GET")

    // Create a live server using the router.
    ts := httptest.NewServer(router)
    defer ts.Close()

    // Define a function to create requests for different methods and URLs.
    newreq := func(method, url string, body io.Reader) *http.Request {
        r, err := http.NewRequest(method, url, body)
        if err != nil {
            t.Fatal(err)
        }
        return r
    }

    tests := []struct {
        name string
        r    *http.Request
    }{
        {name: "1: testing get", r: newreq("GET", ts.URL+"/", nil)},
        {name: "2: testing post", r: newreq("POST", ts.URL+"/", nil)}, // body required for POST
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            resp, err := http.DefaultClient.Do(tt.r)
            defer resp.Body.Close()
            if err != nil {
                t.Fatal(err)
            }
            // Perform any additional checks on the response.
        })
    }
}</code>

Cette approche vous permet de tester l'ensemble du pipeline de traitement des requêtes, y compris les fonctions de routeur et de gestionnaire. Il garantit que les gestionnaires répondent correctement aux différentes méthodes HTTP et produisent les résultats attendus dans un environnement de serveur en direct.

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