使用Go的httptest和testing包可高效测试REST API。1. 创建包含getUserHandler和createUserHandler的HTTP服务;2. 用httptest.NewRequest发起请求,httptest.NewRecorder捕获响应;3. 验证状态码、JSON解析及业务逻辑;4. 覆盖正常路径、错误方法(如GET调用POST接口)等场景;5. 封装assertStatusCode等辅助函数减少重复代码。通过标准库即可实现完整测试,关键在于细节处理,如header、状态码和错误校验。

测试 REST API 是确保后端服务稳定性和正确性的关键环节。在 Golang 中,利用标准库和一些常用工具,可以高效地对 REST 接口进行单元测试和集成测试。本文介绍如何使用 Go 的 net/http/httptest 和 testing 包来实践 REST API 测试。
搭建简单的 REST API 示例
先创建一个简单的 HTTP 服务作为被测对象:
import (
“encoding/json”
“net/http”
)
type User struct {
ID int `json:”id”`
Name string `json:”name”`
}
func getUserHandler(w http.ResponseWriter, r *http.Request) {
user := User{ID: 1, Name: “Alice”}
w.Header().Set(“Content-Type”, “application/json”)
json.NewEncoder(w).Encode(user)
}
func main() {
http.HandleFunc(“/user”, getUserHandler)
http.ListenAndServe(“:8080”, nil)
}
使用 httptest 模拟 HTTP 请求
Go 的 net/http/httptest 包提供了测试 HTTP 服务的工具,比如 httptest.NewRecorder() 可以捕获响应内容。
下面是对上面接口的测试用例:
立即学习“go语言免费学习笔记(深入)”;
// main_test.go
package main
import (
“encoding/json”
“net/http”
“net/http/httptest”
“testing”
)
func TestGetUserHandler(t *testing.T) {
req := httptest.NewRequest(“GET”, “/user”, nil)
recorder := httptest.NewRecorder()
handler := http.HandlerFunc(getUserHandler)
handler.ServeHTTP(recorder, req)
if status := recorder.Code; status != http.StatusOK {
t.Errorf(“期望状态码 %d,实际得到 %d”, http.StatusOK, status)
}
var user User
err := json.Unmarshal(recorder.Body.Bytes(), &user)
if err != nil {
t.Fatalf(“解析 JSON 失败: %v”, err)
}
if user.ID != 1 {
t.Errorf(“期望 ID 为 1,实际为 %d”, user.ID)
}
if user.Name != “Alice” {
t.Errorf(“期望 Name 为 Alice,实际为 %s”, user.Name)
}
}
测试不同场景:错误路径与边界情况
真实项目中需覆盖更多情况,例如非法请求方法、参数校验失败等。
示例:添加一个需要 POST 方法的接口:
func createUserHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != “POST” {
http.Error(w, “仅支持 POST 方法”, http.StatusMethodNotAllowed)
return
}
w.WriteHeader(http.StatusCreated)
w.Write([]byte(`{“message”: “用户创建成功”}`))
}
对应的测试:
func TestCreateUserHandler_BadMethod(t *testing.T) {
req := httptest.NewRequest(“GET”, “/user”, nil)
recorder := httptest.NewRecorder()
createUserHandler(recorder, req)
if recorder.Code != http.StatusMethodNotAllowed {
t.Errorf(“期望状态码 %d,实际 %d”, http.StatusMethodNotAllowed, recorder.Code)
}
}
使用辅助函数减少重复代码
当测试多个接口时,可以封装通用断言逻辑:
func assertStatusCode(t *testing.T, got, want int) {
t.Helper()
if got != want {
t.Errorf(“状态码不匹配:期望 %d,实际 %d”, want, got)
}
}
在测试中调用:
assertStatusCode(t, recorder.Code, http.StatusOK)
基本上就这些。Golang 的测试生态简洁高效,结合 httptest 能轻松完成 REST API 的本地验证。不需要额外框架也能写出清晰可靠的测试用例。关键是覆盖正常路径、异常输入和状态码验证。不复杂但容易忽略细节,比如 header 设置和 JSON 解析错误处理。
以上就是如何用Golang测试REST API接口_Golang REST API测试实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1425408.html
微信扫一扫
支付宝扫一扫