8-4 测试http服务器(上)

代码:https://github.com/NIGHTFIGHTING/go_learning/tree/master/src/errhandling/filelistingserver_test

go test -v errwrapper_test.go

1.假的request/response,速度快,测试密度更细,像单元测试,测试一个小函数

2.起服务器集成度高,覆盖代码覆盖量大,速度慢

package filelistingserver_test
//package main


import (
    "fmt"
    "errors"
    "os"
    "testing"
    "net/http"
    "net/http/httptest"
    "strings"
    "io/ioutil"
    "errhandling/filelistingserver_test/global"
)
 实现type testingUserError interface接口
//type testingUserError string
//
 type error interface {
     Error() string
 }
 实现error的接口
//func (e testingUserError) Error() string {
//    return e.Message()
//}
//
//func (e testingUserError) Message() string {
//    return string(e)
//}

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

func errUserError(writer http.ResponseWriter,
    request *http.Request) error {
    return global.TestingUserError("user error")
}

func errNotFound(writer http.ResponseWriter,
    request *http.Request) error {
    return os.ErrNotExist
}

func errNotPermission(writer http.ResponseWriter,
    request *http.Request) error {
    return os.ErrPermission
}

func errUnkonwn(writer http.ResponseWriter,
    request *http.Request) error {
    return errors.New("unknown error")
}

func noError(writer http.ResponseWriter,
    request *http.Request) error {
    fmt.Fprintln(writer, "no error")
    return nil
}
var tests = []struct {
    h global.AppHandler
    code int
    message string
}{
    {errPanic, 500, "Internal Server Error"},
    {errUserError, 400, "user error"},
    {errNotFound, 404, "Not Found"},
    {errNotPermission, 403, "Forbidden"},
    {errUnkonwn, 500, "Internal Server Error"},
    {noError, 200, "no error"},
}

func TestErrWrapper(t *testing.T) {

    for _, tt := range tests {
        f := global.ErrWrapper(tt.h)
        response := httptest.NewRecorder()
        request := httptest.NewRequest(
            http.MethodGet,
            "http://www.imooc.com"/*target*/,nil/*body*/,
        )
        f(response, request)
        verifyResponse(response.Result(), tt.code, tt.message, t)
    }
}


// 真正启动一个服务器测试
func TestErrWrapperInServer(t *testing.T) {
    for _, tt := range tests {
        f := global.ErrWrapper(tt.h)
        server := httptest.NewServer(
            http.HandlerFunc(f))
        resp, _ := http.Get(server.URL)
        verifyResponse(resp, tt.code, tt.message, t)
    }
}

func verifyResponse(resp *http.Response,
    expectedCode int, expectedMsg string,
    t *testing.T) {
    b, _ := ioutil.ReadAll(resp.Body)
    body := strings.Trim(string(b), "\n")
    if resp.StatusCode != expectedCode ||
        body != expectedMsg {
        t.Errorf("expect (%d, %s); " +
            "got (%d, %s)",
            expectedCode, expectedMsg,
            resp.StatusCode, body)
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值