Golang学习笔记二十一

http测试

Posted by CDz on March 18, 2019

Http测试

之前都是测试的逻辑代码,GO对于httpserver测试一样也是支持的,这次我们就测试,之前写的,读文件服务器中的统一处理错误errWrapper

要测试HTTP服务器,少不了request与response.这两个东西,我们可以在httptest包下,找到对应的模拟器.

func errPanic(writer http.ResponseWriter, request *http.Request) error {
    panic(123)
}

func TestErrWrapper(t *testing.T) {
    tests := []struct {
        hander appHandler //handler
        code int
        message string
    }{
        //先测试一个 500错误的
        {errPanic,http.StatusInternalServerError,http.StatusText(
        http.StatusInternalServerError)},
    }

    for _, tt := range tests {
        recorder := httptest.NewRecorder()
        request := httptest.NewRequest(http.MethodGet, "http://www.baidu.com", nil)
        //使用httptest 模拟 request 与 response,
        //这里request 我们随便输入的url因为必须填写,且这里只测试errWrapper函数,没有用到url
        wrapper := errWrapper(tt.hander)
        wrapper(recorder,request)
        code := recorder.Code
        buffer := recorder.Body
        readAll, _ := ioutil.ReadAll(buffer)
        s := strings.Trim(string(readAll),"\n")
        if code!=tt.code || s != tt.message{
            t.Errorf("输出(%d,%s),应该得到(%d,%s)",
                recorder.Code,s,
                tt.code,tt.message)
        }
    }
}

测试通过,下面就是码代码,去测试其他的错误信息.每个不同错误封装一个handler就好了.

真实server测试

真实server测试,是在测试时起一个server去测试,相较于上一个使用假的request与response,跟全面,但也会测试慢一些.

func TestErrWrapperInServer(t *testing.T) {
    for _, tt := range tests {
        h := errWrapper(tt.hander)
        //使用httptest.NewServer 直接起一个服务器测试
        server := httptest.NewServer(http.HandlerFunc(h))
        resp, _ := http.Get(server.URL)
        code := resp.StatusCode
        buffer := resp.Body
        readAll, _ := ioutil.ReadAll(buffer)
        s := strings.Trim(string(readAll), "\n")
        if code != tt.code || s != tt.message {
            t.Errorf("输出(%d,%s),应该得到(%d,%s)",
                resp.StatusCode, s,
                tt.code, tt.message)
        }
    }
}

作者所有的学习源码在 go学习源码github地址,如果觉得有用的话帮小智贡献一个star😁