Maison >développement back-end >Golang >Comment tester unitairement les appels HTTP en Go à l'aide du package « httptest » ?

Comment tester unitairement les appels HTTP en Go à l'aide du package « httptest » ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-13 16:21:10567parcourir

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

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 &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)
    }

}

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 :

  1. Créer un serveur de test :
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.

  1. Mettre à jour l'original Code :
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.

  1. Créer une chaîne :
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.

  1. Démarrez une goroutine pour récupérer des tweets :
go retrieveTweets(c)

Cette goroutine démarre le processus de récupération des tweets du test serveur.

  1. Recevoir des tweets :
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn