如何为基于NET/HTTP的代码编写集成测试



这是一个示例代码:

package main
import (
    "net/http"
)
func Home(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, world!"))
}
func Router() *http.ServeMux {
    mux := http.NewServeMux()
    mux.HandleFunc("/", Home)
    return mux
}
func main() {
    mux := Router()
    http.ListenAndServe(":8080", mux)
}

这是我写的测试案例:

package main
import (
    "net/http"
    "net/http/httptest"
    "testing"
)
func TestMain(t *testing.T) {
    w := httptest.NewRecorder()
    r, _ := http.NewRequest("GET", "/", nil)
    Router().ServeHTTP(w, r)
    if w.Body.String() != "Hello, world!" {
        t.Error("Wrong content:", w.Body.String())
    }
}

此测试真的是通过TCP插座发送HTTP请求并达到终点/?否则这只是在不建立HTTP连接的情况下调用该函数?

update

根据@ffk给出的答案,我写了这样的测试:

func TestMain(t *testing.T) {
    ts := httptest.NewServer(Router())
    defer ts.Close()
    req, _ := http.NewRequest("GET", ts.URL+"/", nil)
    client := http.Client{}
    resp, _ := client.Do(req)
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    if string(body) != "Hello, world!" {
        t.Error("Wrong content:", string(body))
    }
}

如果要在127.0.0.1上通过随机TCP端口实例化测试服务器,请使用以下内容:

httpHandler := getHttpHandler() // of type http.Handler
testServer := httptest.NewServer(httpHandler)
defer testServer.Close()
request, err := http.NewRequest("GET", testServer.URL+"/my/url", nil)
client := http.Client{}
response, err := client.Do(request)

有关更多信息,请访问https://golang.org/pkg/net/http/httptest/#newserver

最新更新