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😁