中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang?httptest包測試如何使用

發布時間:2023-03-15 11:27:17 來源:億速云 閱讀:92 作者:iii 欄目:開發技術

這篇“Golang httptest包測試如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Golang httptest包測試如何使用”文章吧。

測試http服務端處理器

下面通過示例介紹http server的測試。首先看http服務程序,把請求字符串轉為大寫:

package main
import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "strings"
)
// Req: http://localhost:1234/upper?word=abc
// Res: ABC
func upperCaseHandler(w http.ResponseWriter, r *http.Request) {
    query, err := url.ParseQuery(r.URL.RawQuery)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintf(w, "invalid request")
        return
    }
    word := query.Get("word")
    if len(word) == 0 {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintf(w, "missing word")
        return
    }
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, strings.ToUpper(word))
}
func main() {
    http.HandleFunc("/upper", upperCaseHandler)
    log.Fatal(http.ListenAndServe(":1234", nil))
}

現在想測試http server使用的upperCaseHandler邏輯,我們需要準備兩方面:

  • 使用httptest.NewRequest暴露的函數創建http.Request對象,NewRequest返回Request, 可以傳給http.Handler進行測試.

  • 使用httptest.NewRecorder函數創建http.ResponseWriter,返回httptest.ResponseRecorder。ResponseRecorder是

http.ResponseWriter 的實現,它記錄變化為了后面測試檢查.

httptest.ResponseRecorder

httptest.ResponseRecorder是 http.ResponseWriter 的實現,可以傳給http server handle,記錄所有處理并寫回響應的數據,下面測試程序可以看到其如何實現:

package main
import (
    "io/ioutil"
    "net/http"
    "net/http/httptest"
    "testing"
)
func TestUpperCaseHandler(t *testing.T) {
    req := httptest.NewRequest(http.MethodGet, "/upper?word=abc", nil)
    w := httptest.NewRecorder()
    upperCaseHandler(w, req)
    res := w.Result()
    defer res.Body.Close()
    data, err := ioutil.ReadAll(res.Body)
    if err != nil {
        t.Errorf("expected error to be nil got %v", err)
    }
    if string(data) != "ABC" {
        t.Errorf("expected ABC got %v", string(data))
    }
}

上面示例中首先定義請求和響應,然后傳入處理器進行測試。然后檢查ResponseRecorder的Result方法輸出:

func (rw *ResponseRecorder) Result() *http.Response

Result返回處理器生成的響應。返回相應至少有StatusCode, Header, Body, 以及可選其他內容,未來可能會填充更多字段,所以調用者在測試中不應該深度比較相等。

測試HTTP客戶端

測試服務端處理器相對容易,特別當測試處理器邏輯時,僅需要在測試中模擬http.ResponseWriter 和 http.Request對象。對于HTTP客戶端測試,情況稍晚有點復雜。原因是有時不容易模擬或復制整個HTTP Server,請看下面示例:

package main
import (
    "io/ioutil"
    "net/http"
    "github.com/pkg/errors"
)
type Client struct {
    url string
}
func NewClient(url string) Client {
    return Client{url}
}
func (c Client) UpperCase(word string) (string, error) {
    res, err := http.Get(c.url + "/upper?word=" + word)
    if err != nil {
        return "", errors.Wrap(err, "unable to complete Get request")
    }
    defer res.Body.Close()
    out, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return "", errors.Wrap(err, "unable to read response data")
    }
    return string(out), nil
}

client需要url,表示遠程服務端基地址。然后調用/upper,帶上輸入單詞,最后返回結果字符串給調用者,如果調用不成功還返回錯誤對象。為了測試這段代碼,需要模擬整個http服務端邏輯,或至少是響應請求路徑:/upper。使用httptest包可以模擬整個http 服務,通過初始化本地服務,監聽回環地址并返回你想要的任何內容。

使用 httptest.Server

通過調用httptest.NewServer函數生成我們想要的 httptest.Server。表示http服務,監聽回環地址及可選的端口號,用于實現端到端HTTP測試。

func NewServer(handler http.Handler) *Server

NewServer 啟動并返回新的HTTP服務,調用者使用完成后應該調用Close方法結束服務。下面通過示例進行解釋:

package main
import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "strings"
    "testing"
)
func TestClientUpperCase(t *testing.T) {
    expected := "dummy data"
    svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, expected)
    }))
    defer svr.Close()
    c := NewClient(svr.URL)
    res, err := c.UpperCase("anything")
    if err != nil {
        t.Errorf("expected err to be nil got %v", err)
    }
    // res: expected\r\n
    // due to the http protocol cleanup response
    res = strings.TrimSpace(res)
    if res != expected {
        t.Errorf("expected res to be %s got %s", expected, res)
    }
}

上面示例中使用httptest.NewServer函數創建了模擬http服務器,給它傳入自定義模擬處理器,總是返回相同的數據。并使用服務端url作為客戶端請求url,從而模擬并讓服務端返回任何我們想測試的內容。

當然我們可以修改處理器,讓其返回我們期望的邏輯:

func TestClientUpperCase(t *testing.T) {
	svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		query, err := url.ParseQuery(r.URL.RawQuery)
		if err != nil {
			w.WriteHeader(http.StatusBadRequest)
			fmt.Fprintf(w, "invalid request")
			return
		}
		word := query.Get("word")
		if len(word) > 0 {
			fmt.Fprintf(w, strings.ToUpper(word))
		} else {
			fmt.Fprintf(w, "no input")
		}
	}))
	defer svr.Close()
	expected := "ANYTHING"
	c := NewClient(svr.URL)
	res, err := c.UpperCase("anything")
	if err != nil {
		t.Errorf("expected err to be nil got %v", err)
	}
	// res: expected\r\n
	// due to the http protocol cleanup response
	res = strings.TrimSpace(res)
	if res != expected {
		t.Errorf("expected res to be %s got %s", expected, res)
	}
}

以上就是關于“Golang httptest包測試如何使用”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝兴县| 海兴县| 竹山县| 清原| 昌黎县| 南康市| 临清市| 金川县| 灯塔市| 平陆县| 富民县| 广昌县| 汾阳市| 大洼县| 南昌市| 特克斯县| 无棣县| 永登县| 临泽县| 廊坊市| 武义县| 光泽县| 双峰县| 五华县| 汤阴县| 济源市| 垦利县| 南京市| 奉贤区| 曲阳县| 科尔| 龙游县| 什邡市| 丁青县| 晋江市| 巴彦县| 瑞昌市| 龙门县| 哈密市| 满城县| 舞阳县|