一、引言
网络测试是确保HTTP服务接口稳定可靠的重要环节。Go语言提供了丰富的网络测试工具和库,使得开发者能够方便地编写和运行网络测试。本文将详细介绍如何使用Go语言进行网络测试,包括原生的net/http/httptest
包和第三方库gock
的使用。
二、使用httptest
进行网络测试
- 创建HTTP服务
首先,我们需要创建一个简单的HTTP服务来测试。这可以通过原生的net/http
包来实现。
示例:
package main
import (
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
func main() {
http.HandleFunc("/hello", helloHandler)
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic("error: " + err.Error())
}
}
运行此代码后,可以在浏览器中访问http://localhost:8080/hello
,看到hello world
的输出。
- 编写网络测试
使用httptest
包可以方便地编写HTTP服务的测试。
示例:
package main
import (
"net/http"
"net/http/httptest"
"testing"
)
var helloHandler = func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
func TestHttp(t *testing.T) {
req := httptest.NewRequest("GET", "/hello", nil)
w := httptest.NewRecorder()
handler := http.HandlerFunc(helloHandler)
handler.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Errorf("handler returned wrong status code: got %v want %v",
w.Code, http.StatusOK)
}
if w.Body.String() != "hello world" {
t.Errorf("handler returned unexpected body: got %v want %v",
w.Body.String(), "hello world")
}
}
运行go test
命令可以执行此测试,并验证HTTP服务的正确性。
三、使用gock
进行模拟测试
- 安装
gock
gock
是一个用于Go语言的HTTP模拟库,可以模拟HTTP请求和响应。首先,我们需要安装gock
。
go get gopkg.in/h2non/gock.v1
- 编写模拟测试
使用gock
可以模拟外部API的响应,避免在测试时真实地调用外部API。
示例(GET请求):
package main
import (
"github.com/stretchr/testify/assert"
"net/http"
"testing"
"gopkg.in/h2non/gock.v1"
)
func TestMockGet(t *testing.T) {
defer gock.Off() // 确保测试结束后关闭gock
url := "http://example.com"
path := "/user"
gock.New(url).
Get(path).
Reply(200).
JSON(map[string]string{"name": "tony"})
res, err := http.Get(url + path)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.StatusCode)
var user map[string]string
if err := json.NewDecoder(res.Body).Decode(&user); err != nil {
t.Fatal(err)
}
assert.Equal(t, "tony", user["name"])
assert.True(t, gock.IsDone())
}
示例(POST请求):
package main
import (
"encoding/json"
"github.com/stretchr/testify/assert"
"net/http"
"strings"
"testing"
"gopkg.in/h2non/gock.v1"
)
func TestMockPost(t *testing.T) {
defer gock.Off() // 确保测试结束后关闭gock
url := "http://example.com"
path := "/add"
str := `{"name": "tony"}`
gock.New(url).
Post(path).
JSON(map[string]string{"name": "tony"}).
Reply(200).
JSON(map[string]string{"id": "123", "name": "tony"})
body := strings.NewReader(str)
res, err := http.Post(url+path, "application/json", body)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, 200, res.StatusCode)
var user map[string]string
if err := json.NewDecoder(res.Body).Decode(&user); err != nil {
t.Fatal(err)
}
assert.Equal(t, "tony", user["name"])
assert.Equal(t, "123", user["id"])
assert.True(t, gock.IsDone())
}
运行go test
命令可以执行这些模拟测试,并验证HTTP请求和响应的正确性。
四、总结
本文介绍了如何使用Go语言进行网络测试,包括原生的net/http/httptest
包和第三方库gock
的使用。