Heim >Backend-Entwicklung >Golang >Was ist die Verwendung von Golang httptest?

Was ist die Verwendung von Golang httptest?

PHPz
PHPzOriginal
2023-04-14 13:45:24952Durchsuche

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.

  1. Einführung in httptest

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. Allgemeine httptest-Methoden

(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))
    }
}
  1. Hinweise zu httptest

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.

  1. Zusammenfassung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn