用 htest 给 go 写 http 测试

Hexilee · 2018-02-27 16:40:40 · 1327 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2018-02-27 16:40:40 的文章,其中的信息可能已经有所发展或是发生改变。

最近在写 rady 时候,想集成一个 http 测试库,一搜发现 go 自带一个 httptest

然后给出的例子是这样的

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestHealthCheckHandler(t *testing.T) {
    handler := func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "<html><body>Hello World!</body></html>")
    }

    req := httptest.NewRequest("GET", "http://example.com/foo", nil)
    w := httptest.NewRecorder()
    handler(w, req)

    resp := w.Result()
    body, _ := ioutil.ReadAll(resp.Body)

    fmt.Println(resp.StatusCode)
    fmt.Println(resp.Header.Get("Content-Type"))
    fmt.Println(string(body)
}

emmm,总感觉写了一些不必要的代码 于是我把 httptest 和 testify/assert 封装了一下,写了 htest 项目

它用起来大概长这样,感受一下

package myapp

import (
    "io"
    "net/http"
)

func NameHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, `{"name": "hexi"}`)
}
// example/basic_mock_client_test.go
package myapp

import (
    "testing"
    "github.com/Hexilee/htest"
)

func TestNameHandlerFunc(t *testing.T) {
    htest.NewClient(t).
        ToFunc(NameHandler).
        Get("").
        Test().
        StatusOK(). // Assert Status Code
        JSON().
        String("name", "hexi") // Assert response data as JSON
}

也可以测试 http.Handler (http.ServeMux, echo.Echo 等 )

*http.ServeMux

// example/basic_mock_client.go
package myapp

import (
    "io"
    "net/http"
)

var (
    Mux *http.ServeMux
)

func init() {
    Mux = http.NewServeMux()
    Mux.HandleFunc("/name", NameHandler)
}

func NameHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, `{"name": "hexi"}`)
}
// example/basic_mock_client_test.go
package myapp

import (
    "testing"
    "github.com/Hexilee/htest"
)

func TestNameHandler(t *testing.T) {
    htest.NewClient(t).
        To(Mux).
        Get("/name").
        Test().
        StatusOK().
        JSON().
        String("name", "hexi")
}

*echo.Echo

// example/basic_mock_client.go
package myapp

import (
    "io"
    "github.com/labstack/echo"
)

var (
    server *echo.Echo
)

func init() {
    server = echo.New()
    server.GET("/name", NameHandlerEcho)
}

func NameHandlerEcho(c echo.Context) error {
    return c.String(http.StatusOK, `{"name": "hexi"}`)
}
// example/basic_mock_client_test.go
package myapp

import (
    "testing"
    "github.com/Hexilee/htest"
)

func TestNameHandlerEcho(t *testing.T) {
    htest.NewClient(t).
        To(server).
        Get("/name").
        Test().
        StatusOK().
        JSON().
        String("name", "hexi")
}

更多功能看 htest


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1327 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传