Go 语言

Go 语言教程 Go 语言环境安装 Go 语言结构 Go 语言基础语法 Go 语言数据类型 Go 语言变量 Go 语言常量 Go 语言运算符 Go 语言条件语句 Go 语言 if 语句 Go 语言 if...else 语句 Go 语言 if 语句嵌套 Go 语言 switch 语句 Go 语言 select 语句 Go 语言循环语句 Go 语言 for 循环 Go 语言循环嵌套 Go 语言 break 语句 Go 语言 continue 语句 Go 语言 goto 语句 Go 语言函数 Go 语言函数值传递值 Go 语言函数引用传递值 Go 语言函数作为值 Go 语言函数闭包 Go 语言函数方法 Go 语言变量作用域 Go 语言数组 Go 语言多维数组 Go 语言向函数传递数组 Go 语言指针 Go 语言指针数组 Go 语言指向指针的指针 Go 语言指针作为函数参数 Go 语言结构体 Go 语言切片(Slice) Go 语言范围(Range) Go 语言Map(集合) Go 语言递归函数 Go 语言类型转换 Go 语言接口 Go 错误处理 Go 语言开发工具Go 语言标准库

Go 语言标准库


package httptest

import "net/http/httptest"

httptest包提供了HTTP测试的常用函数。

Go语言标准库 >>


  • Constants
  • func NewRequest(method, target string, body io.Reader) *http.Request
  • type ResponseRecorder
  • type Server
  • Examples

    Go语言标准库 >>


  • NewTLSServer
  • ResponseRecorder
  • Server
  • Constants

    const DefaultRemoteAddr = "1.2.3.4"

    DefaultRemoteAddr是默认的远端地址。如果ResponseRecorder未显式的设置该属性,RemoteAddr方法就会返回该值。

    func NewRequest Uses

    func NewRequest(method, target string, body io.Reader) *http.Request

    NewRequest 返回一个新的服务器访问请求,这个请求可以传递给 http.Handler 以便进行测试。

    target 参数的值为 RFC 7230 中提到的“请求目标”(request-target): 它可以是一个路径或者一个绝对 URL。如果 target 是一个绝对 URL,那么 URL 中的主机名(host name)将被使用;否则主机名将为 example.com。

    当 target 的模式为 https 时,TLS 字段的值将被设置为一个非 nil 的随意值(dummy value)。

    Request.Proto 总是为 HTTP/1.1。

    如果 method 参数的值为空, 那么使用 GET 方法作为默认值。

    body 参数的值可以为 nil;另一方面,如果 body 参数的值为 *bytes.Reader 类型、 *strings.Reader 类型或者 *bytes.Buffer 类型,那么 Request.ContentLength 将被设置。

    为了使用的方便,NewRequest 将在 panic 可以被接受的情况下,使用 panic 代替错误。

    如果你想要生成的不是服务器访问请求,而是一个客户端 HTTP 请求,那么请使用 net/http 包中的 NewRequest 函数。

    type ResponseRecorder

    type ResponseRecorder struct {
        Code      int           // HTTP回复的状态码
        HeaderMap http.Header   // HTTP回复的头域
        Body      *bytes.Buffer // 如非nil,会将Write方法写入的数据写入bytes.Buffer
        Flushed   bool
        // 内含隐藏或非导出字段
    }

    ResponseRecorder实现了http.ResponseWriter接口,它记录了其修改,用于之后的检查。

    Example
    handler := func(w http.ResponseWriter, r *http.Request) {
        http.Error(w, "something failed", http.StatusInternalServerError)
    }
    req, err := http.NewRequest("GET", "http://example.com/foo", nil)
    if err != nil {
        log.Fatal(err)
    }
    w := httptest.NewRecorder()
    handler(w, req)
    fmt.Printf("%d - %s", w.Code, w.Body.String())

    Output:

    500 - something failed
    

    func NewRecorder

    func NewRecorder() *ResponseRecorder

    NewRecorder返回一个初始化了的ResponseRecorder.

    func (*ResponseRecorder) Flush

    func (rw *ResponseRecorder) Flush()

    Flush将rw.Flushed设置为真。

    func (*ResponseRecorder) Header

    func (rw *ResponseRecorder) Header() http.Header

    Header返回回复的头域,即Header字段。

    func (*ResponseRecorder) Result Uses

    func (rw *ResponseRecorder) Result() *http.Response

    Result 返回处理器生成的响应。

    处理器返回的响应至少会对状态码(StatusCode)、首部(Header)、主体(Body)以及可选的 Trailer 进行设置。 因为未来可能会有更多字段被设置,所以用户不应该在测试里面对结果调用 DeepEqual。

    Response.Header 是写入操作第一次调用时的首部快照(snapshot of the headers); 另一方面, 如果处理器没有执行过写入操作, 那么 Response.Header 就是 Result 方法调用时的首部快照。

    Response.Body 将被生成为一个非 nil 值,而 Body.Read 则保证不会返回除 io.EOF 之外的其他任何错误。

    Result 必须在处理器执行完毕之后调用。

    func (*ResponseRecorder) Write

    func (rw *ResponseRecorder) Write(buf []byte) (int, error)

    Write总是成功,如果rw.Body非nil会把数据写入该字段。

    func (*ResponseRecorder) WriteHeader

    func (rw *ResponseRecorder) WriteHeader(code int)

    WriteHeader设置rw.Code。

    func (*ResponseRecorder) WriteString Uses

    func (rw *ResponseRecorder) WriteString(str string) (int, error)

    在 str 不为 nil 的情况下, WriteString 总会成功地将 buf 中的内容写入到 rw.Body 当中。

    type Server

    type Server struct {
        URL      string // 格式为http://ipaddr:port,没有末尾斜杠的基地址
        Listener net.Listener
        // TLS是可选的TLS配置,在TLS开始后会填写为新的配置。
        // 如果在未启动的Server调用StartTLS方法前设置,已经存在的字段会拷贝进新配置里。
        TLS *tls.Config
        // Config可能会在调用Start/StartTLS方法之前调用NewUnstartedServer时被修改。
        Config *http.Server
        // 内含隐藏或非导出字段
    }

    Server是一个HTTP服务端,在本地环回接口的某个系统选择的端口监听,用于点对点HTTP测试。

    Example
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, client")
    }))
    defer ts.Close()
    res, err := http.Get(ts.URL)
    if err != nil {
        log.Fatal(err)
    }
    greeting, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", greeting)

    Output:

    Hello, client
    

    func NewServer

    func NewServer(handler http.Handler) *Server

    NewServer返回一个新的、已启动的Server。调用者必须在用完时调用Close方法关闭它。

    func NewTLSServer

    func NewTLSServer(handler http.Handler) *Server

    NewTLSServer返回一个新的、使用TLS的、已启动的Server。调用者必须在用完时调用Close方法关闭它。

    func NewUnstartedServer

    func NewUnstartedServer(handler http.Handler) *Server

    NewUnstartedServer返回一个新的、未启动的Server。在修改其配置后,调用者应该调用Start或StartTLS启动它;调在用完时用者必须调用Close方法关闭它。

    func (*Server) Start

    func (s *Server) Start()

    Start启动NewUnstartedServer返回的服务端。

    func (*Server) StartTLS

    func (s *Server) StartTLS()

    StartTLS启动NewUnstartedServer函数返回的服务端的TLS监听。

    func (*Server) CloseClientConnections

    func (s *Server) CloseClientConnections()

    CloseClientConnections关闭当前任何与该服务端建立的HTTP连接。

    func (*Server) Close

    func (s *Server) Close()

    Close关闭服务端,并阻塞直到所有该服务端未完成的请求都结束为止。