Maison >développement back-end >Golang >Comment tester unitairement les appels HTTP en Go à l'aide du package « httptest » ?
Comment tester les appels HTTP dans Go avec httptest
Introduction
Les tests unitaires sont un aspect crucial du développement logiciel, et pour les programmes Go, le package httptest fournit un outil utile pour tester les appels HTTP. Cet article montrera comment utiliser httptest pour écrire des tests unitaires pour votre code Go qui effectue des requêtes HTTP.
Le défi
Considérez le code Go suivant :
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) } }
L'objectif est d'écrire des tests unitaires pour ce code, en se concentrant sur le test des requêtes HTTP effectuées pour récupérer les tweets de la recherche Twitter API.
Solution utilisant httptest
Le package httptest propose deux types de tests : les tests de réponse et les tests de serveur. Pour ce scénario, les tests de serveur sont plus adaptés. Voici comment procéder :
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()
Ce code crée un serveur de test qui répond aux requêtes HTTP avec un Réponse JSON prédéfinie.
twitterUrl = ts.URL
Dans le code d'origine, la variable twitterUrl est modifiée pour pointer vers l'URL du serveur de test au lieu du point de terminaison réel de l'API Twitter.
c := make(chan *twitterResult)
Une chaîne est utilisée pour communiquer entre la goroutine de test et la goroutine principale dans le code d'origine.
go retrieveTweets(c)
Cette goroutine démarre le processus de récupération des tweets du test serveur.
tweet := <-c if tweet != expected1 { t.Fail() } tweet = <-c if tweet != expected2 { t.Fail() }
La goroutine de test reçoit les tweets de la chaîne et vérifie s'ils correspondent aux résultats attendus.
Autres considérations
Cela vaut la peine notant que le test ne vérifie pas le contenu de la réponse HTTP. Pour un test plus approfondi, il serait nécessaire de comparer la réponse réelle avec la réponse attendue. De plus, le serveur de test doit renvoyer une structure de réponse plus réaliste pour simuler avec précision l'API Twitter réelle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!