Пакет httptest
Обзор
Пакет httptest предоставляет утилиты для тестирования HTTP.
Индекс
Файлы пакета
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/