>백엔드 개발 >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)
    }

}

목표는 트위터 검색에서 트윗을 검색하기 위해 만들어진 HTTP 요청을 테스트하는 데 초점을 맞춰 이 코드에 대한 단위 테스트를 작성하는 것입니다. API.

httptest를 사용한 솔루션

httptest 패키지는 응답 테스트와 서버 테스트라는 두 가지 테스트 유형을 제공합니다. 이 시나리오에서는 서버 테스트가 더 적합합니다. 진행 방법은 다음과 같습니다.

  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)

채널은 원본 코드에서 테스트 고루틴과 기본 고루틴 간의 통신에 사용됩니다.

  1. 시작 검색할 고루틴 트윗:
go retrieveTweets(c)

이 goroutine은 테스트 서버에서 트윗을 검색하는 프로세스를 시작합니다.

  1. 트윗 수신:
tweet := <-c
if tweet != expected1 {
    t.Fail()
}

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

테스트 고루틴은 채널의 트윗을 확인하고 예상 결과와 일치하는지 확인합니다.

추가 고려 사항

테스트에서는 HTTP 응답의 내용을 확인하지 않는다는 점에 주목할 필요가 있습니다. 보다 철저한 테스트를 위해서는 실제 응답과 예상 응답을 비교해야 합니다. 또한 테스트 서버는 실제 Twitter API를 정확하게 시뮬레이션하기 위해 보다 현실적인 응답 구조를 반환해야 합니다.

위 내용은 `httptest` 패키지를 사용하여 Go에서 HTTP 호출을 단위 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.