[go] Go 언어를 사용한 RESTful API의 테스트 자동화 방법

RESTful API를 개발하고자 할 때, 테스트 자동화는 매우 중요한 요소입니다. 테스트 자동화는 코드의 신뢰성을 높이고 개발자들이 빠른 피드백을 받을 수 있도록 도와줍니다. 이번 글에서는 Go 언어를 사용하여 RESTful API의 테스트 자동화를 어떻게 수행할 수 있는지 알아보겠습니다.

1. 가짜 서버 구축하기

RESTful API를 테스트하기 위해서는 가짜 서버를 구축해야 합니다. 이렇게 하면 실제 서버에 요청을 보내지 않고도 API의 기능을 테스트할 수 있습니다.

Go 언어에서는 httptest 패키지를 사용하여 가짜 서버를 만들 수 있습니다. 이 패키지를 사용하면 간단하게 서버를 구축하고 요청을 처리할 수 있습니다. 다음은 가짜 서버를 구축하는 코드의 예시입니다.

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "Hello, World!")
    }))
    defer server.Close()

    // 서버에 요청 보내기 및 응답 확인
    // ...
}

위의 코드에서는 httptest.NewServer 함수를 사용하여 가짜 서버를 만들고, 람다 함수를 이용하여 요청 처리 로직을 작성하였습니다. 이제 실제 요청을 보내기 전에 가짜 서버를 실행시키고 응답을 확인할 수 있습니다.

2. HTTP 클라이언트를 사용한 요청 보내기

Go 언어에서는 http 패키지를 사용하여 HTTP 클라이언트를 작성할 수 있습니다. 이를 사용하여 가짜 서버에 요청을 보내고 응답을 확인할 수 있습니다.

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "Hello, World!")
    }))
    defer server.Close()

    // 가짜 서버에 GET 요청 보내기
    resp, err := http.Get(server.URL)
    if err != nil {
        // 에러 처리
        return
    }
    defer resp.Body.Close()

    // 응답 출력
    // ...
}

위의 코드에서는 http.Get 함수를 사용하여 가짜 서버에 GET 요청을 보내고, 응답을 확인하고 처리하는 간단한 예제입니다. 필요에 따라 http.Post 등 다른 메서드를 사용하여 다양한 종류의 요청을 보낼 수 있습니다.

3. 응답 검증하기

테스트 자동화를 위해 응답을 검증하는 것은 매우 중요합니다. 응답 데이터의 형식, 상태코드 등을 확인하여 원하는 결과를 얻었는지를 판단할 수 있습니다. Go 언어에서는 testing 패키지의 gotest 패키지를 사용하여 간단한 검증을 수행할 수 있습니다.

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestAPI(t *testing.T) {
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        fmt.Fprintln(w, "Hello, World!")
    }))
    defer server.Close()

    resp, err := http.Get(server.URL)
    if err != nil {
        t.Fatalf("Failed to send request: %s", err)
    }
    defer resp.Body.Close()

    assert.Equal(t, http.StatusOK, resp.StatusCode)
    // 기타 검증 로직 추가
}

위의 코드에서는 testing 패키지의 gotest를 사용하여 테스트 함수를 작성하고, assert 패키지를 사용하여 응답 상태코드를 검증하는 예시입니다.

4. Mocking을 사용한 의존성 제어

API를 테스트할 때 종종 의존성이 있는 경우가 있습니다. 예를 들어, 데이터베이스에 연결해야 하는 경우를 생각해보겠습니다. 하지만 테스트를 위해 매번 실제 데이터베이스에 접속하는 것은 번거로울 수 있습니다.

이런 경우에는 Mocking을 사용하여 가짜 데이터베이스를 만들어 테스트를 수행할 수 있습니다. Go 언어에서는 gomock 패키지를 사용하여 Mocking을 구현할 수 있습니다.

package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "github.com/golang/mock/gomock"
    "github.com/stretchr/testify/assert"
    "example.com/myapp/mocks"
)

func main() {
    ctrl := gomock.NewController(t)
    defer ctrl.Finish()

    mockDB := mocks.NewMockDB(ctrl)
    mockDB.EXPECT().GetUser(1).Return(&User{Name: "Alice"}, nil)

    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        u, err := mockDB.GetUser(1)
        // ...
    }))
    defer server.Close()

    // 서버에 요청 보내고 응답 검증
    // ...
}

위의 코드에서는 gomock 패키지를 사용하여 데이터베이스의 Mocking을 구현하고 있습니다. 이를 통해 테스트 도중에 실제 데이터베이스에 접속하지 않고도 테스트를 수행할 수 있습니다.

결론

Go 언어를 사용하여 RESTful API의 테스트 자동화를 수행하는 방법을 알아보았습니다. 가짜 서버를 만들고 HTTP 클라이언트를 사용하여 요청을 보내고, 응답을 검증하며, Mocking을 사용하여 의존성을 제어하는 방법을 살펴보았습니다. 이러한 방법들을 통해 효율적이고 안정적인 RESTful API 개발을 할 수 있습니다.

참고 자료