在 Go 中使用实时请求测试 HTTP 服务器
当前的问题涉及确保 HTTP 处理函数正确响应各种 HTTP 请求方法(GET 和 POST)在实时服务器场景中。这需要在实际服务器的上下文中测试处理程序,而不是仅仅依赖于单元测试。
为了实现这一点,net/http/httptest.Server 类型提供了一个解决方案。它允许创建使用特定路由器的实时服务器。路由器可以基于 Gorilla mux(如问题中提到的)、net/http 的 ServeMux 或任何其他满足 net/http 处理程序接口的实现。
这里是如何设置实时服务器的示例using httptest.Server:
<code class="go">import ( "io" "net/http" "net/http/httptest" "testing" ) func TestIndex(t *testing.T) { // Create a server using the router initialized outside the test function. ts := httptest.NewServer(router) defer ts.Close() // Create a function to generate a request with the desired method and URL. 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 } // Define test cases with various requests. 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)}, // Note: POST requests require a reader in the body } // Run tests with live requests to the server. 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 in the live server's response here. }) } }</code>
在此示例中,假设路由器在测试函数之外进行初始化。然后使用路由器创建 httptest.Server 并在测试完成时关闭。 newreq 函数用于生成具有特定方法和 URL 的请求。测试用例被定义为结构体切片,以方便迭代。
通过使用 http.DefaultClient.Do() 向服务器发送实时请求,我们可以在以下上下文中验证处理函数的行为:一个实时服务器。与独立的单元测试相比,这提供了更全面的测试方法。
请注意,此答案中的方法和详细信息适用于实现 http.Handler 接口的任何路由器,而不仅仅是 Gorilla mux。
以上是如何在 Go 中使用实时请求测试 HTTP 服务器处理程序?的详细内容。更多信息请关注PHP中文网其他相关文章!