HTTPの相互作用をテストするためのGoパッケージです.関連キーワード:COM


以前私はカバー github.com/h2non/gock , そのパッケージはHTTPリクエストをテストするために使用され、手動で両方の要求と応答を模擬することによって動作する方法です.今回は別のアプローチを取っています.代わりに、将来のテストでそれらを再生するための備品としてリクエストとレスポンスの両方を保存しています.

Please refer to the full example code for more details.


あなたに紹介しましょう github.com/dnaeon/go-vcr .

DNAEON/GO VCRの使用
このパッケージの動作方法はhttp.RoundTripper に割り当てられるTransport 使用中のフィールドhttp.Client , for example :
// recorder is "github.com/dnaeon/go-vcr/recorder"
r, err := recorder.New(path.Join("fixtures", "weather_401"))
if err != nil {
    t.Fatalf("failed creating recorder %s", err)
}

return &http.Client{Transport: r}, r.Stop
このコードが初めて実行されると、新しいファイルを作成しますfixtures/weather_401.yaml , それが存在しないならば、質問に関連するすべての情報を保存してください.
このファイルを保存するという考えは、将来同じテストを実行するとき、同じ結果を得る決定論的方法を持つことです.dnaeon/go-vcr 舞台裏では、そのファイルを適切にリクエストと一致させて、以前に保存されたレスポンスを返します.

秘密の削除
実際に証明書を使用している場合、HTTPヘッダーやクエリ引数として使用できます.dnaeon/go-vcr それらをリークしないようにそれらを削除することができます.for example :
r, err := recorder.New(path.Join("fixtures", "weather_200"))
if err != nil {
        t.Fatalf("failed creating recorder %s", err)
}

cleanURL := func(u *url.URL) *url.URL {
    q := u.Query()
    q.Del("appid")

    u.RawQuery = q.Encode()

    return u
}

r.AddFilter(func(i *cassette.Interaction) error {
    u, err := url.Parse(i.Request.URL)
    if err != nil {
        return err
    }

    i.URL = cleanURL(u).String()

    return nil
})

r.SetMatcher(func(r *http.Request, i cassette.Request) bool {
    r.URL = cleanURL(r.URL)

    return cassette.DefaultMatcher(r, i)
})

return &http.Client{Transport: r}, r.Stop
上記の場合、両方ともです.
  • リクエストのクエリ引数を削除し、
  • Matcherを更新してその値を考慮しない.
  • これを行うことで、決定的にテストを実行できます.

    最後の思考dnaeon/go-vcr and h2non/gock お互いを補いなさい.go-vcr サードパーティAPIで動作するときには、いくつかのフィールドを使用している場合に便利ですが、将来の私たちは、すでに既知のフィールドを使用してサポートを追加したり、サードパーティ製API上で利用可能なオプションについての意思決定を追加するようなものを決定するために保存されたフィクスチャを参照することができます.
    とどのつまりdnaeon/go-vcr は、非常に推奨する必要があります.