package httptest

import "net/http/httptest"

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

Index

返回首页


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

    返回首页


  • 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关闭服务端,并阻塞直到所有该服务端未完成的请求都结束为止。