ホームページ >バックエンド開発 >Golang >`httptest` パッケージを使用して Go で HTTP 呼び出しを単体テストする方法

`httptest` パッケージを使用して Go で HTTP 呼び出しを単体テストする方法

Susan Sarandon
Susan Sarandonオリジナル
2024-12-13 16:21:10567ブラウズ

How to Unit Test HTTP Calls in Go using the `httptest` Package?

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 &amp;twitterResult{} which returns *twitterResult
        err = json.Unmarshal(body, &amp;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 種類のテストを提供します。このシナリオには、サーバー テストの方が適しています。続行方法は次のとおりです:

  1. テスト サーバーの作成:
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 レスポンス。

  1. オリジナルを更新コード:
twitterUrl = ts.URL

元のコードでは、twitterUrl 変数は実際の Twitter API エンドポイントではなくテスト サーバーの URL を指すように変更されています。

  1. を作成するチャネル:
c := make(chan *twitterResult)

チャネルは、元のコードのテスト goroutine と main goroutine の間で通信するために使用されます。

  1. Start a取得するゴルーチンTweets:
go retrieveTweets(c)

このゴルーチンは、テスト サーバーからツイートを取得するプロセスを開始します。

  1. ツイートの受信:
tweet := <-c
if tweet != expected1 {
    t.Fail()
}

tweet = <-c
if tweet != expected2 {
    t.Fail()
}

テストゴルーチンはツイートを受信します

さらなる考慮事項

テストでは HTTP 応答の内容が検証されていないことに注意してください。より徹底的なテストを行うには、実際の応答と予想される応答を比較する必要があります。さらに、テスト サーバーは、実際の Twitter API を正確にシミュレートするために、より現実的な応答構造を返す必要があります。

以上が`httptest` パッケージを使用して Go で HTTP 呼び出しを単体テストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。