...

パッケージ httptest

import "net/http/httptest"
概要
目次

概要 ▾

httptest パッケージは,HTTP テストに便利な関数を提供します。

定数

DefaultRemoteAddr は,明示的な DefaultRemoteAddr が ResponseRecorder に設定されていない場合に RemoteAddr に返されるデフォルトのリモートアドレスです。

const DefaultRemoteAddr = "1.2.3.4"

func NewRequest 1.7

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

NewRequest は,テストのために http.Handler に渡すのに適した,新しい着信サーバーリクエストを返します。

ターゲットは RFC 7230 "request-target" です。 パスまたは絶対 URL のどちらでも構いません。 target が絶対 URL の場合は, URL からのホスト名が使用されます。 それ以外の場合は, "example.com" が使用されます。

target のスキームが "https" の場合, TLS フィールドは nil 以外のダミー値に設定されます。

Request.Proto は常に HTTP/1.1 です。

空のメソッドは "GET" を意味します。

渡されるボディは nil でも構いません。 ボディの型が *bytes.Reader , *strings.Reader ,または *bytes.Buffer の場合, Request.ContentLength が設定されます。

NewRequest はパニックが許容される場合,テストでの使いやすさのためエラーでパニックを起こします。

サーバーリクエストの代わりにクライアント HTTP リクエストを生成するには, net/http パッケージの NewRequest 関数を参照してください。

type ResponseRecorder

ResponseRecorder は,テストでの後の検査のために変更を記録する http.ResponseWriter の実装です。

type ResponseRecorder struct {
    // Code は, WriteHeader によって設定された HTTP レスポンスコードです。
    //
    // Handler が WriteHeader や Write を呼び出さない場合は,暗黙の http.StatusOK ではなく 0 になる可能性があります。
    // 暗黙的な値を取得するには, Result メソッドを使用します。
    Code int

    // HeaderMap には, Handler によって明示的に設定されたヘッダーが含まれています。
    // それは内部の詳細です。
    //
    // 非推奨: HeaderMap は歴史的な互換性のために存在しており使用されるべきではありません。
    // ハンドラによって返されたヘッダにアクセスするには, Result メソッドによって返された Response.Header マップを使用します。
    HeaderMap http.Header

    // Body は, Handler の Write 呼び出しが送信されるバッファです。
    // nil なら, Writes は黙って捨てられます。
    Body *bytes.Buffer

    // Flushed は, Handler が Flush を呼び出したかどうかです。
    Flushed bool
    // エクスポートされていないフィールドがあります
}

コード:

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, _ := ioutil.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 を実装します。 ハンドラー内で変更するレスポンスヘッダーを返します。 ハンドラーの完了後に書き込まれたヘッダーをテストするには, Result メソッドを使用して,返された Response 値のヘッダーを確認します。

func (*ResponseRecorder) Result 1.7

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

Result は,ハンドラによって生成されたレスポンスを返します。

返されたレスポンスには,少なくとも 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 を実装します。 nil でない場合, buf のデータは rw.Body に書き込まれます。

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 を実装します。 nil でない場合, str のデータは rw.Body に書き込まれます。

type Server

Server は,エンドツーエンドの HTTP テストで使用するための,ローカルループバックインターフェース上のシステムが選択したポートで待機する HTTP サーバーです。

type Server struct {
    URL      string // 末尾にスラッシュを付けない形式 http://ipaddr:port のベース URL
    Listener net.Listener

    // TLS はオプションの TLS 設定で, TLS の起動後に新しい設定が追加されます。
    // StartTLS が呼び出される前に未起動サーバーに設定されている場合,既存のフィールドは新しい構成にコピーされます。
    TLS *tls.Config

    // Config は,NewUnstartedServer を呼び出した後, Start または StartTLS の前に変更することができます。
    Config *http.Server
    // エクスポートされていないフィールドがあります
}

コード:

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)

出力:

Hello, client

func NewServer

func NewServer(handler http.Handler) *Server

NewServer が起動し,新しいサーバーを返します。 呼び出し側は終了したら Close を呼び出して終了します。

func NewTLSServer

func NewTLSServer(handler http.Handler) *Server

NewTLSServer が起動し, 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 := ioutil.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 は新しいサーバーを返しますが,起動しません。

設定を変更した後,呼び出し側は Start または StartTLS を呼び出す必要があります。

呼び出し側は終了したら Close を呼び出して終了します。

func (*Server) Certificate 1.9

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

Certificate はサーバーが使用している証明書を返します。 サーバーが TLS を使用していない場合は nil を返します。

func (*Server) Client 1.9

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

Client は,サーバーにリクエストを出すように構成された HTTP クライアントを返します。 サーバーの TLS テスト証明書を信頼するように構成されており, Server.Close 上のアイドル接続を閉じます。

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 は NewUnstartedServer からサーバー上の TLS を開始します。