Spec-Zone.ru › Go

Пакет httptest

  • import "net/http/httptest"
  • Обзор
  • Индекс
  • Примеры

Обзор

Пакет httptest предоставляет утилиты для тестирования HTTP.

Индекс

  • Константы
  • func NewRequest(method, target string, body io.Reader) *http.Request
  • func NewRequestWithContext(ctx context.Context, method, target string, body io.Reader) *http.Request
  • тип ResponseRecorder
  • func NewRecorder() *ResponseRecorder
  • func (rw *ResponseRecorder) Flush()
  • func (rw *ResponseRecorder) Header() http.Header
  • func (rw *ResponseRecorder) Result() *http.Response
  • func (rw *ResponseRecorder) Write(buf []byte) (int, error)
  • func (rw *ResponseRecorder) WriteHeader(code int)
  • func (rw *ResponseRecorder) WriteString(str string) (int, error)
  • тип Server
  • func NewServer(handler http.Handler) *Server
  • func NewTLSServer(handler http.Handler) *Server
  • func NewUnstartedServer(handler http.Handler) *Server
  • func (s *Server) Certificate() *x509.Certificate
  • func (s *Server) Client() *http.Client
  • func (s *Server) Close()
  • func (s *Server) CloseClientConnections()
  • func (s *Server) Start()
  • func (s *Server) StartTLS()

Примеры

NewTLSServer
ResponseRecorder
Server
Server (HTTP2)

Файлы пакета

httptest.go recorder.go server.go

Константы

DefaultRemoteAddr — это адрес удалённого узла по умолчанию, возвращаемый в RemoteAddr, если явный DefaultRemoteAddr не задан в ResponseRecorder.

const DefaultRemoteAddr = "1.2.3.4"

func NewRequest 1.7

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

NewRequest оборачивает NewRequestWithContext с использованием context.Background.

func NewRequestWithContext 1.23

func NewRequestWithContext(ctx context.Context, method, target string, body io.Reader) *http.Request

NewRequestWithContext возвращает новый входящий запрос сервера, подходящий для передачи в http.Handler для тестирования.

Target — это RFC 7230 "request-target": это может быть путь или абсолютный URL. Если target — абсолютный URL, используется имя хоста из URL. В противном случае используется "example.com".

Поле TLS устанавливается в непустое значение, если target имеет схему "https".

Request.Proto всегда HTTP/1.1.

Пустой метод означает "GET".

Передаваемый body может быть пустым. Если body — это *bytes.Reader, *strings.Reader или *bytes.Buffer, то Request.ContentLength устанавливается.

NewRequest вызывает панику при ошибке для удобства использования в тестировании, где это приемлемо.

Чтобы сгенерировать клиентский HTTP-запрос вместо запроса сервера, обратитесь к функции NewRequest в пакете net/http.

тип ResponseRecorder

ResponseRecorder — это реализация http.ResponseWriter, которая записывает свои изменения для последующего анализа в тестах.

type ResponseRecorder struct {
    // Code is the HTTP response code set by WriteHeader.
    //
    // Note that if a Handler never calls WriteHeader or Write,
    // this might end up being 0, rather than the implicit
    // http.StatusOK. To get the implicit value, use the Result
    // method.
    Code int

    // HeaderMap contains the headers explicitly set by the Handler.
    // It is an internal detail.
    //
    // Deprecated: HeaderMap exists for historical compatibility
    // and should not be used. To access the headers returned by a handler,
    // use the Response.Header map as returned by the Result method.
    HeaderMap http.Header

    // Body is the buffer to which the Handler's Write calls are sent.
    // If nil, the Writes are silently discarded.
    Body *bytes.Buffer

    // Flushed is whether the Handler called Flush.
    Flushed bool
    // contains filtered or unexported fields
}

Пример

Код:

handler := func(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "<html><body>Hello World!</body></html>")
}

req := httptest.NewRequest("GET", "http://example.com/foo", nil)
w := httptest.NewRecorder()
handler(w, req)

resp := w.Result()
body, _ := io.ReadAll(resp.Body)

fmt.Println(resp.StatusCode)
fmt.Println(resp.Header.Get("Content-Type"))
fmt.Println(string(body))

Вывод:

200
text/html; charset=utf-8
<html><body>Hello World!</body></html>

func NewRecorder

func NewRecorder() *ResponseRecorder

NewRecorder возвращает инициализированный ResponseRecorder.

func (*ResponseRecorder) Flush

func (rw *ResponseRecorder) Flush()

Flush реализует http.Flusher. Чтобы проверить, был ли вызван Flush, см. rw.Flushed.

func (*ResponseRecorder) Header

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

Header реализует http.ResponseWriter. Он возвращает заголовки ответа для изменения внутри обработчика. Чтобы проверить заголовки, которые были записаны после завершения обработки, используйте метод ResponseRecorder.Result и посмотрите Header возвращённого значения Response.

func (*ResponseRecorder) Result 1.7

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

Result возвращает ответ, сгенерированный обработчиком.

Возвращаемый Response будет иметь как минимум StatusCode, Header, Body и необязательно Trailer. В будущем могут быть добавлены другие поля, поэтому вызывающие стороны не должны использовать DeepEqual в тестах.

Response.Header — это моментальный снимок заголовков на момент первого вызова записи или на момент вызова, если обработчик никогда не производил запись.

Response.Body гарантированно не равен nil и вызов Body.Read гарантированно не вернёт ошибку, кроме io.EOF.

Result следует вызывать только после завершения работы обработчика.

func (*ResponseRecorder) Write

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

Write реализует http.ResponseWriter. Данные в buf записываются в rw.Body, если он не равен nil.

func (*ResponseRecorder) WriteHeader

func (rw *ResponseRecorder) WriteHeader(code int)

WriteHeader реализует http.ResponseWriter.

func (*ResponseRecorder) WriteString 1.6

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

WriteString реализует io.StringWriter. Данные в str записываются в rw.Body, если он не равен nil.

тип Server

Server — это HTTP-сервер, слушающий на выбранном системой порте локального интерфейса обратной связи, предназначенный для использования в конечных HTTP-тестах.

type Server struct {
    URL      string // base URL of form http://ipaddr:port with no trailing slash
    Listener net.Listener

    // EnableHTTP2 controls whether HTTP/2 is enabled
    // on the server. It must be set between calling
    // NewUnstartedServer and calling Server.StartTLS.
    EnableHTTP2 bool // Go 1.14

    // TLS is the optional TLS configuration, populated with a new config
    // after TLS is started. If set on an unstarted server before StartTLS
    // is called, existing fields are copied into the new config.
    TLS *tls.Config

    // Config may be changed after calling NewUnstartedServer and
    // before Start or StartTLS.
    Config *http.Server
    // contains filtered or unexported fields
}

Пример

Код:

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 := io.ReadAll(res.Body)
res.Body.Close()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("%s", greeting)

Вывод:

Hello, client

Пример (HTTP2)

Код:

ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %s", r.Proto)
}))
ts.EnableHTTP2 = true
ts.StartTLS()
defer ts.Close()

res, err := ts.Client().Get(ts.URL)
if err != nil {
    log.Fatal(err)
}
greeting, err := io.ReadAll(res.Body)
res.Body.Close()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%s", greeting)

Вывод:

Hello, HTTP/2.0

func NewServer

func NewServer(handler http.Handler) *Server

NewServer запускает и возвращает новый Server. Вызывающая сторона должна вызвать Close при завершении, чтобы его остановить.

func NewTLSServer

func NewTLSServer(handler http.Handler) *Server

NewTLSServer запускает и возвращает новый Server с использованием TLS. Вызывающая сторона должна вызвать Close при завершении, чтобы его остановить.

Пример

Код:

ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, client")
}))
defer ts.Close()

client := ts.Client()
res, err := client.Get(ts.URL)
if err != nil {
    log.Fatal(err)
}

greeting, err := io.ReadAll(res.Body)
res.Body.Close()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("%s", greeting)

Вывод:

Hello, client

func NewUnstartedServer

func NewUnstartedServer(handler http.Handler) *Server

NewUnstartedServer возвращает новый Server, но не запускает его.

После изменения его конфигурации вызывающая сторона должна вызвать Start или StartTLS.

Вызывающая сторона должна вызвать Close при завершении, чтобы его остановить.

func (*Server) Certificate 1.9

func (s *Server) Certificate() *x509.Certificate

Certificate возвращает сертификат, используемый сервером, или nil, если сервер не использует TLS.

func (*Server) Client 1.9

func (s *Server) Client() *http.Client

Client возвращает HTTP-клиент, настроенный для отправки запросов на сервер. Он настроен для доверия к тестовому TLS-сертификату сервера и закроет свои свободные подключения при Server.Close. Используйте Server.URL в качестве базового URL для отправки запросов на сервер.

func (*Server) Close

func (s *Server) Close()

Close останавливает сервер и блокирует выполнение, пока все ожидающие запросы на этом сервере не завершатся.

func (*Server) CloseClientConnections

func (s *Server) CloseClientConnections()

CloseClientConnections закрывает любые открытые HTTP-соединения с тестовым сервером.

func (*Server) Start

func (s *Server) Start()

Start запускает сервер из NewUnstartedServer.

func (*Server) StartTLS

func (s *Server) StartTLS()

StartTLS запускает TLS на сервере из NewUnstartedServer.

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/net/http/httptest/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API