gpt4 book ai didi

golang 如何实时测试一个 http 服务器?

转载 作者:IT王子 更新时间:2023-10-29 01:47:14 27 4
gpt4 key购买 nike

我使用 gotests 和 gorilla mux,我可以对我的 http handlefunc 处理程序进行单元测试,但它们不会像在 gorilla mux 下那样响应正确的 http 请求方法。如何进行“实时服务器”版本的测试?

func main() {
router := mux.NewRouter()
router.HandleFunc("/", views.Index).Methods("GET")
}

func Index(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)

fmt.Fprintf(w, "INDEX\n")
}

func TestIndex(t *testing.T) {

req, _ := http.NewRequest("GET", "/", nil)
req1, _ := http.NewRequest("POST", "/", nil)
rr := httptest.NewRecorder()

handler := http.HandlerFunc(Index)

type args struct {
w http.ResponseWriter
r *http.Request
}
tests := []struct {
name string
args args
}{
{name: "1: testing get", args: args{w: rr, r: req}},
{name: "2: testing post", args: args{w: rr, r: req1}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
handler.ServeHTTP(tt.args.w, tt.args.r)
log.Println(tt.args.w)
})
}
}

这里的问题是该函数同时响应 get 和 post 请求,并且没有考虑我的主路由器。这对于单元测试功能很好,但我认为最好只编写一个测试整体的集成测试事情并一次性解决所有问题。

最佳答案

使用 net/http/httptest.Server键入以使用实时服务器进行测试。

func TestIndex(t *testing.T) {
// Create server using the a router initialized elsewhere. The router
// can be a Gorilla mux as in the question, a net/http ServeMux,
// http.DefaultServeMux or any value that statisfies the net/http
// Handler interface.
ts := httptest.NewServer(router)
defer ts.Close()

newreq := func(method, url string, body io.Reader) *http.Request {
r, err := http.NewRequest(method, url, body)
if err != nil {
t.Fatal(err)
}
return r
}

tests := []struct {
name string
r *http.Request
}{
{name: "1: testing get", r: newreq("GET", ts.URL+"/", nil)},
{name: "2: testing post", r: newreq("POST", ts.URL+"/", nil)}, // reader argument required for POST
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
resp, err := http.DefaultClient.Do(tt.r)
defer resp.Body.Close()
if err != nil {
t.Fatal(err)
}
// check for expected response here.
})
}
}

尽管该问题使用了 Gorilla mux,但此答案中的方法和细节适用于满足 http.Handler 接口(interface)的任何路由器。

关于golang 如何实时测试一个 http 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47401929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com