httptest を使用して Go で HTTP 呼び出しをテストする方法
はじめに
単体テストはこれはソフトウェア開発の重要な側面であり、Go プログラムの場合、httptest パッケージは HTTP 呼び出しをテストするための便利なツールを提供します。この記事では、httptest を使用して、HTTP リクエストを行う Go コードの単体テストを作成する方法を説明します。
課題
次の Go コードを考えてみましょう。
package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "time" ) type twitterResult struct { Results []struct { Text string `json:"text"` Ids string `json:"id_str"` Name string `json:"from_user_name"` Username string `json:"from_user"` UserId string `json:"from_user_id_str"` } } var ( twitterUrl = "http://search.twitter.com/search.json?q=%23UCL" pauseDuration = 5 * time.Second ) func retrieveTweets(c chan<- *twitterResult) { for { resp, err := http.Get(twitterUrl) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) r := new(twitterResult) //or &twitterResult{} which returns *twitterResult err = json.Unmarshal(body, &r) if err != nil { log.Fatal(err) } c <- r time.Sleep(pauseDuration) } } func displayTweets(c chan *twitterResult) { tweets := <-c for _, v := range tweets.Results { fmt.Printf("%v:%v\n", v.Username, v.Text) } } func main() { c := make(chan *twitterResult) go retrieveTweets(c) for { displayTweets(c) } }
目的は、Twitter の検索からツイートを取得するために行われる HTTP リクエストのテストに重点を置いて、このコードの単体テストを作成することです。 API.
httptest を使用したソリューション
httptest パッケージは、レスポンス テストとサーバー テストの 2 種類のテストを提供します。このシナリオには、サーバー テストの方が適しています。続行方法は次のとおりです:
func TestRetrieveTweets(t *testing.T){ ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") fmt.Fprintln(w, `{"fake twitter json string"}`) })) defer ts.Close()
このコードは、HTTP リクエストに応答するテスト サーバーを作成します。事前定義された JSON レスポンス。
twitterUrl = ts.URL
元のコードでは、twitterUrl 変数は実際の Twitter API エンドポイントではなくテスト サーバーの URL を指すように変更されています。
c := make(chan *twitterResult)
チャネルは、元のコードのテスト goroutine と main goroutine の間で通信するために使用されます。
go retrieveTweets(c)
このゴルーチンは、テスト サーバーからツイートを取得するプロセスを開始します。
tweet := <-c if tweet != expected1 { t.Fail() } tweet = <-c if tweet != expected2 { t.Fail() }
テストゴルーチンはツイートを受信します
さらなる考慮事項
テストでは HTTP 応答の内容が検証されていないことに注意してください。より徹底的なテストを行うには、実際の応答と予想される応答を比較する必要があります。さらに、テスト サーバーは、実際の Twitter API を正確にシミュレートするために、より現実的な応答構造を返す必要があります。
以上が`httptest` パッケージを使用して Go で HTTP 呼び出しを単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。