> 백엔드 개발 > Golang > Go의 'httptest' 패키지는 어떻게 HTTP 핸들러 및 서버의 포괄적인 테스트를 촉진할 수 있습니까?

Go의 'httptest' 패키지는 어떻게 HTTP 핸들러 및 서버의 포괄적인 테스트를 촉진할 수 있습니까?

Linda Hamilton
풀어 주다: 2025-01-02 19:24:50
원래의
581명이 탐색했습니다.

How Can Go's `httptest` Package Facilitate Comprehensive Testing of HTTP Handlers and Servers?

httptest를 사용하여 Go에서 HTTP 호출 테스트

Go의 httptest 패키지를 사용하면 HTTP 핸들러, 서버 및 응답 본문을 포괄적으로 테스트할 수 있습니다. 응답 테스트와 서버 테스트라는 두 가지 주요 테스트 범주를 제공합니다.

응답 테스트

응답 테스트는 HTTP 응답의 특정 내용을 확인합니다. 예를 들면 다음과 같습니다.

func TestHeader3D(t *testing.T) {
    resp := httptest.NewRecorder()

    // Create a request with specified parameters.
    param := make(url.Values)
    param["param1"] = []string{"/home/test"}
    param["param2"] = []string{"997225821"}

    req, err := http.NewRequest("GET", "/3D/header/?"+param.Encode(), nil)
    if err != nil {
        t.Fatal(err)
    }

    // Send the request to the default HTTP server.
    http.DefaultServeMux.ServeHTTP(resp, req)

    // Read the response body.
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        t.Fail()
    }

    // Check the response body for expected content.
    if strings.Contains(string(body), "Error") {
        t.Errorf("header response shouldn't return error: %s", body)
    } else if !strings.Contains(string(body), `expected result`) {
        t.Errorf("header response doen't match:\n%s", body)
    }
}
로그인 후 복사

서버 테스트

서버 테스트에는 HTTP 서버 설정 및 요청이 포함됩니다. 이는 사용자 정의 HTTP 처리기 및 서버 동작을 테스트하는 데 특히 유용합니다. 예를 살펴보겠습니다.

func TestIt(t *testing.T) {
    // Create an HTTP server with a mock handler.
    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()

    // Update the Twitter URL with the mock server's URL and retrieve a channel for results.
    twitterUrl = ts.URL
    c := make(chan *twitterResult)
    go retrieveTweets(c)

    // Receive and verify the results.
    tweet := <-c
    if tweet != expected1 {
        t.Fail()
    }
    tweet = <-c
    if tweet != expected2 {
        t.Fail()
    }
}
로그인 후 복사

제공된 코드에는 err = json.Unmarshal(body, &r)에서 r(수신자)에 대한 포인터가 불필요하게 사용되었습니다. r은 이미 포인터이기 때문입니다. . 따라서 err = json.Unmarshal(body, r)로 수정되어야 합니다.

위 내용은 Go의 'httptest' 패키지는 어떻게 HTTP 핸들러 및 서버의 포괄적인 테스트를 촉진할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿