Heim > Artikel > Backend-Entwicklung > Was ist die Verwendung von Golang httptest?
Mit der Popularität und Effizienz der Golang-Sprache hat sie in den letzten Jahren immer mehr Aufmerksamkeit und Liebe bei Entwicklern auf sich gezogen. Golang bietet ein einfaches und benutzerfreundliches Test-Framework, einschließlich der httptest-Bibliothek. In diesem Artikel werde ich die grundlegenden Konzepte, Verwendung und Vorsichtsmaßnahmen von httptest vorstellen und hoffe, Golang-Entwicklern bei ihrer späteren Testarbeit zu helfen.
Im Test-Framework von Golang besteht die Hauptfunktion von httptest darin, Testern dabei zu helfen, HTTP-Anfragen und -Antworten zu simulieren, um die serverseitige API-Schnittstelle einfach zu testen. Es ist nicht auf das Netzwerk und den tatsächlichen HTTP-Server angewiesen, sondern verwendet die Funktionen im von Golang bereitgestellten net/http-Paket, um den gesamten Anforderungs- und Antwortprozess zu simulieren.
(1) Erstellen Sie einen Testserver
In httptest müssen wir einen Testserver über die NewServer-Methode erstellen. Die Parameter dieser Methode müssen in einer HandlerFunc übergeben werden, die die http.Handler-Schnittstelle implementiert. Beispielsweise können wir einen HandlerFunc erstellen, der GET-Anfragen verarbeitet, und über ihn einen Testserver erstellen:
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) Senden Sie eine Anfrage
Nachdem wir den Testserver haben, können wir über den Client Anfragen an den Server senden. Der Client ist ein von Golang bereitgestellter HTTP-Anfrage-Client. Beispielsweise können wir eine HandlerFunc erstellen, die POST-Anfragen verarbeitet, und daraus einen Testserver erstellen. Senden Sie dann eine POST-Anfrage mit Json-Daten:
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) Legen Sie Anforderungsheader und Antwortheader fest.
Beim Testen sind Anforderungsheader und Antwortheader ebenfalls sehr wichtige Teile. Über die Header-Methode können wir Anforderungsheader und Antwortheader festlegen. Beispielsweise können wir eine HandlerFunc erstellen, die GET-Anfragen verarbeitet, und daraus einen Testserver erstellen. Legen Sie dann den Anforderungsheader und den Antwortheader fest:
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) Verarbeitung von HTTPS-Anfragen
In tatsächlichen Projekten erfordern viele HTTP-Schnittstellen eine sichere Übertragung über HTTPS. In httptest können wir über die NewTLSServer-Methode auch einen Testserver erstellen, der HTTPS unterstützt. Der neu erstellte Server verwendet ein selbstsigniertes Zertifikat und sollte daher nicht in einer Produktionsumgebung verwendet werden. Beispielsweise können wir eine HandlerFunc erstellen, die POST-Anfragen verarbeitet, und damit einen Testserver erstellen, der HTTPS unterstützt. Senden Sie dann eine POST-Anfrage mit Json-Daten:
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)) } }
Obwohl httptest im Golang-Testframework praktisch und praktisch ist, kann eine unsachgemäße Verwendung dennoch zu ungenauen Testergebnissen führen. Wir müssen auf folgende Punkte achten:
(1) httptest sollte nicht als HTTP- oder HTTPS-Server in einer Produktionsumgebung verwendet werden, sondern nur zu Testzwecken.
(2) Wenn der Testserver nicht ordnungsgemäß heruntergefahren wird, können die Ressourcen aufgrund zu vieler Testsuiten erschöpft sein.
(3) Wenn die über httptest übermittelten Daten nicht mit den von Ihnen übermittelten Daten übereinstimmen, können Sie nicht die korrekten Testergebnisse erhalten.
Im Golang-Testprozess ist httptest ein sehr nützliches Tool, das uns dabei helfen kann, HTTP-Anfragen und -Antworten zu simulieren, um die serverseitige API-Schnittstelle einfach zu testen. In diesem Artikel stellen wir die Grundkonzepte, Verwendung und Vorsichtsmaßnahmen von httptest im Detail vor und hoffen, Golang-Entwicklern bei ihrer späteren Testarbeit zu helfen.
Das obige ist der detaillierte Inhalt vonWas ist die Verwendung von Golang httptest?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!