如何使用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) } }
使用httptest的解決方案
httptest 套件提供兩種類型的測試:回應測試和伺服器測試。對於這種場景,伺服器測試更合適。操作步驟如下: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()
twitterUrl = ts.URL
c := make(chan *twitterResult)
go retrieveTweets(c)
tweet := <-c if tweet != expected1 { t.Fail() } tweet = <-c if tweet != expected2 { t.Fail() }
進一步注意事項
值得注意的是,測試並未驗證 HTTP 回應的內容。為了進行更徹底的測試,有必要將實際響應與預期響應進行比較。此外,測試伺服器應該返回更真實的回應結構,以準確模擬實際的 Twitter API。以上是如何使用 `httptest` 套件在 Go 中對 HTTP 呼叫進行單元測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!