首页 >后端开发 >Golang >Go 的 httptest 包如何促进 HTTP 处理程序和服务器的全面测试?

Go 的 httptest 包如何促进 HTTP 处理程序和服务器的全面测试?

Linda Hamilton
Linda Hamilton原创
2025-01-02 19:24:50556浏览

How Can Go's `httptest` Package Facilitate Comprehensive Testing of HTTP Handlers and Servers?

使用 httptest 测试 Go 中的 HTTP 调用

Go 中的 httptest 包允许对 HTTP 处理程序、服务器和响应主体进行全面测试。它提供两大类测试:响应测试和服务器测试。

响应测试

响应测试验证 HTTP 响应的具体内容。这是一个示例:

func TestHeader3D(t *testing.T) {
    resp := httptest.NewRecorder()

    // Create a request with specified parameters.
    param := make(url.Values)
    param["param1"] = []string{"/home/test"}
    param["param2"] = []string{"997225821"}

    req, err := http.NewRequest("GET", "/3D/header/?"+param.Encode(), nil)
    if err != nil {
        t.Fatal(err)
    }

    // Send the request to the default HTTP server.
    http.DefaultServeMux.ServeHTTP(resp, req)

    // Read the response body.
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fail()
    }

    // Check the response body for expected content.
    if strings.Contains(string(body), "Error") {
        t.Errorf("header response shouldn't return error: %s", body)
    } else if !strings.Contains(string(body), `expected result`) {
        t.Errorf("header response doen't match:\n%s", body)
    }
}

服务器测试

服务器测试涉及设置 HTTP 服务器并向其发出请求。这对于测试自定义 HTTP 处理程序和服务器行为特别有用。让我们看一个例子:

func TestIt(t *testing.T) {
    // Create an HTTP server with a mock handler.
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        fmt.Fprintln(w, `{"fake twitter json string"}`)
    }))
    defer ts.Close()

    // Update the Twitter URL with the mock server's URL and retrieve a channel for results.
    twitterUrl = ts.URL
    c := make(chan *twitterResult)
    go retrieveTweets(c)

    // Receive and verify the results.
    tweet := <-c
    if tweet != expected1 {
        t.Fail()
    }
    tweet = <-c
    if tweet != expected2 {
        t.Fail()
    }
}

在提供的代码中,在 err = json.Unmarshal(body, &r) 中不必要地使用了指向 r(接收器)的指针,因为 r 已经是一个指针。因此,应将其更正为 err = json.Unmarshal(body, r).

以上是Go 的 httptest 包如何促进 HTTP 处理程序和服务器的全面测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn