首頁  >  文章  >  後端開發  >  golang httptest用法是什麼

golang httptest用法是什麼

PHPz
PHPz原創
2023-04-14 13:45:24928瀏覽

近年來,隨著 Golang 語言的普及和高效性,它越來越受到開發者們的關注和喜愛。 Golang 提供了一套簡單易用的測試框架,其中就包含了 httptest 函式庫。在本文章中,我將會介紹 httptest 的基本概念、用法和注意事項,希望能對 Golang 開發者們在接下來的測試工作中有所幫助。

  1. httptest 簡介

在Golang 的測試框架中,httptest 的主要作用就是幫助測試者模擬HTTP 請求和回應,以便方便地對服務端的API 介面進行測試。它不依賴網路和實際的 HTTP 伺服器,而是使用 Golang 提供的 net/http 套件中的功能,模擬出請求和回應的整個流程。

  1. httptest 常用方法

(1)建立測試伺服器

在 httptest 中,我們需要透過 NewServer 方法建立一個測試伺服器。此方法的參數需要傳入一個實作了 http.Handler 介面的 HandlerFunc。例如,我們可以建立一個處理GET 請求的HandlerFunc,並透過它建立一個測試伺服器:

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)發送請求

有了測試伺服器之後,我們就可以透過Client 來向伺服器發送請求。 Client 是 Golang 提供的一個 HTTP 請求客戶端。例如,我們可以建立一個處理 POST 請求的 HandlerFunc,並透過它建立一個測試伺服器。然後發送一個 POST 請求,包含 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)設定請求頭和回應頭

在測試中,請求頭和回應頭也是很重要的一部分。我們可以透過 Header 方法來設定請求頭和回應頭。例如,我們可以建立一個處理 GET 請求的 HandlerFunc,並透過它建立一個測試伺服器。然後設定請求頭和回應頭:

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)處理 HTTPS 請求

在實際的專案中,許多 HTTP 介面都需要透過 HTTPS 進行安全傳輸。在 httptest 中,我們也可以透過 NewTLSServer 方法來建立一個支援 HTTPS 的測試伺服器。新建的伺服器使用自簽名證書,因此不應該在生產環境中使用。例如,我們可以建立一個處理 POST 請求的 HandlerFunc,並透過它建立一個支援 HTTPS 的測試伺服器。然後發送一個POST 請求,包含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))
    }
}
  1. httptest 的注意事項

儘管httptest 在Golang 測試框架中很方便實用,但使用不當仍然可能會導致測試結果不準確。我們需要注意以下幾點:

(1)httptest 不應該用作生產環境下的 HTTP 或 HTTPS 伺服器,僅用於測試目的。

(2)如果測試伺服器沒有被正確關閉,可能會因為測試套件過多而導致資源耗盡。

(3)如果使用 httptest 提交到的資料和你所提交的資料不匹配,你將無法得到正確的測試結果。

  1. 總結

在Golang 的測試過程中,httptest 是一個非常有用的工具,可以幫助我們模擬HTTP 請求和回應,以便方便地對服務端的API接口進行測試。本文中,我們詳細介紹了 httptest 的基本概念、用法和注意事項,希望能對 Golang 開發者在接下來的測試工作中有所幫助。

以上是golang httptest用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn