详解Go语言中Get/Post请求测试
简介
在进行web开发时,经常需要测试HTTP请求和响应的功能。Go语言自带了net/http/httptest
包,可用于对HTTP服务器的request和response进行模拟和测试。
GET请求测试
假设我们有一个简单的HTTP服务器,可以用以下代码创建:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
以上代码创建了一个HTTP服务器,当以GET方式请求根路径时,服务器会将字符串"Hello World!"作为响应返回。
接下来,我们将演示如何在Go中进行GET请求测试。使用Go的测试框架,我们可以先写一个测试函数:
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestGetHandler(t *testing.T) {
req, err := http.NewRequest("GET", "/", nil)
if err != nil {
t.Fatal(err)
}
rec := httptest.NewRecorder()
handler := http.HandlerFunc(handler)
handler.ServeHTTP(rec, req)
if status := rec.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "Hello World!"
if rec.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rec.Body.String(), expected)
}
}
以上代码编写了一个名为TestGetHandler
的测试函数,来对上述HTTP服务器的GET请求进行测试。该测试函数调用了http.NewRequest
方法生成了一个GET请求,使用httptest.NewRecorder
方法创建了一个response recorder 来存储服务器的响应,然后调用HTTP handler的ServeHTTP方法来模拟请求。接下来,我们附加了几个断言语句来判断服务器响应是否符合预期。要运行这个测试函数,请执行以下命令:
go test -v
该测试应该会运行并且显示通过。
POST请求测试
接下来,我们将介绍如何测试一个需要使用POST方式请求的web服务。假设我们有一个原始web服务,代码如下所示:
func postHandler(w http.ResponseWriter, r *http.Request) {
name := r.FormValue("name")
fmt.Fprintf(w, "Hello %s!", name)
}
上述代码创建了一个HTTP服务器,当以POST方式请求时,服务器将响应"Hello" + request参数name的值 + "!"。
接下来,我们将编写一个测试函数来测试该服务器。我们将采用与测试GET请求类似的方式,不过在制定请求是我们要通过本地构建表单并将其添加到request中:
func TestPostHandler(t *testing.T) {
form := url.Values{}
form.Add("name", "Alice")
req, err := http.NewRequest("POST", "/", strings.NewReader(form.Encode()))
if err != nil {
t.Fatal(err)
}
req.PostForm = form
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
rec := httptest.NewRecorder()
handler := http.HandlerFunc(postHandler)
handler.ServeHTTP(rec, req)
if status := rec.Code; status != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
status, http.StatusOK)
}
expected := "Hello Alice!"
if rec.Body.String() != expected {
t.Errorf("handler returned unexpected body: got %v want %v",
rec.Body.String(), expected)
}
}
以上代码编写了一个名为TestPostHandler
的测试函数,来对上述HTTP服务器的POST请求进行测试。我们先创建一个表单,然后用url.Values{}.Add()
方法将数据加入请求体中。接下来我们会将通过调用http.NewRequest
方法生成一个POST请求,使用response recorder来存储服务器的响应,最后在请求的header中添加Content-Type为application/x-www-form-urlencoded
的参数。要运行这个测试函数,请执行以下命令:
go test -v
该测试应该会运行并且显示通过。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Go语言中Get/Post请求测试 - Python技术站