这里有一个示例代码:
这是我编写的测试用例:
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连接?
更新
根据@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))
}
}
net/http
在Go语言中编写集成测试。上述代码是我计划以此为基础。通过最后两个问题,我试图解释我需要测试的关键集成。您是否有任何建议来改进标题或最后两个问题? - baijumhttptest.NewRecorder()
只是创建了一个http.ResponseWriter
的实现,让你记录下你的 HTTP 处理程序所写的内容。这是一种很好的测试 HTTP 路由的方法。另一种方法是在测试中构建和运行你的代码,并发起实际的 HTTP 请求。 - jmaloney