"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go API를 위한 필수 단위 테스트 – 자신 있게 코드 구축

Go API를 위한 필수 단위 테스트 – 자신 있게 코드 구축

2024-11-08에 게시됨
검색:934

Essential Unit Testing for Go APIs – Build Code with Confidence

이 API를 구축하면서 인증, 로깅, Dockerization 등을 다루었습니다. 하지만 아직 논의하지 않은 한 가지는 테스트입니다! API를 프로덕션 준비 상태로 만들려면 견고한 단위 테스트를 추가하는 것이 중요합니다. 이번 게시물에서는 버그를 조기에 발견하고 고품질 코드를 출시할 수 있도록 Go에서 단위 테스트의 기본 사항을 살펴보겠습니다.

왜 단위 테스트인가?

단위 테스트는 코드베이스의 각 부분이 예상대로 작동하는지 확인하는 데 도움이 됩니다. 이는 버그, 회귀 및 기타 불쾌한 놀라움에 대한 첫 번째 방어선입니다. Go에 내장된 테스트 라이브러리를 사용하면 다음과 같은 테스트를 빠르게 설정할 수 있습니다.

  • 기능의 일관된 동작을 보장합니다.
  • 새로운 문제를 발생시키지 않고 코드를 더 쉽게 리팩터링할 수 있습니다.
  • 모든 것이 제대로 작동하고 있다는 자신감을 높이세요.

시작할 준비가 되셨나요? 뛰어 들어보세요! ?


1단계: 기본 테스트 설정

Go의 테스트 프레임워크는 간단하고 언어에 바로 통합되어 있습니다. _test.go 접미사를 붙여 이름을 지정하여 테스트 파일을 생성할 수 있습니다. main.go의 간단한 함수를 테스트하는 것부터 시작하겠습니다:

// main.go
package main

func Add(a, b int) int {
    return a   b
}

이제 main_test.go라는 파일을 만들고 다음 코드를 추가하세요.

// main_test.go
package main

import "testing"

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5

    if result != expected {
        t.Errorf("Add(2, 3) = %d; want %d", result, expected)
    }
}

작동 방식:

  1. 테스트 기능: Go의 모든 테스트 기능은 Test로 시작하고 *testing.T 매개변수를 허용해야 합니다.
  2. 주장: 결과가 우리의 기대와 일치하는지 확인합니다. 그렇지 않은 경우 t.Errorf.
  3. 를 사용하여 오류를 기록합니다.

테스트를 실행하려면 다음을 사용하세요.

go test

모든 것이 제대로 작동하면 확인 메시지가 표시됩니다. ?


2단계: HTTP 핸들러 테스트

이제 HTTP 핸들러 중 하나에 대한 테스트를 작성해 보겠습니다. Go의 httptest 패키지를 사용하여 모의 HTTP 요청 및 응답 레코더를 생성하겠습니다.

// main_test.go
package main

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

func TestGetBooksHandler(t *testing.T) {
    req, err := http.NewRequest("GET", "/books", nil)
    if err != nil {
        t.Fatal(err)
    }

    rr := httptest.NewRecorder()
    handler := http.HandlerFunc(getBooks)

    handler.ServeHTTP(rr, req)

    if status := rr.Code; status != http.StatusOK {
        t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
    }
}

설명:

  1. httptest.NewRequest: 새 HTTP 요청을 생성합니다. 이는 /books 엔드포인트에 대한 요청을 모의합니다.
  2. httptest.NewRecorder: HTTP 응답을 모의합니다. 나중에 이를 확인해 우리의 기대와 일치하는지 확인하겠습니다.
  3. ServeHTTP: 모의 요청 및 레코더를 사용하여 getBooks 핸들러를 호출합니다.

이 방법을 사용하면 전체 서버를 가동하지 않고도 핸들러를 격리하고 테스트할 수 있습니다. ?


3단계: 적용 범위를 사용하여 테스트 실행

Go에는 테스트 적용 범위를 확인하는 방법이 내장되어 있습니다. 테스트에 포함된 코드의 비율을 확인하려면 다음을 실행하세요.

go test -cover

더 자세한 내용을 보려면 HTML 보고서를 생성하세요.

go test -coverprofile=coverage.out
go tool cover -html=coverage.out

생성된 HTML 파일을 열어서 코드의 어느 부분이 다루고 있는지 시각화하세요. 추가 테스트가 필요한 곳을 확인할 수 있는 환상적인 방법입니다.


4단계: 외부 종속성 모의

외부 서비스(예: 데이터베이스 또는 외부 API 호출)에 의존하는 기능을 테스트할 때 인터페이스를 사용하여 해당 종속성을 모의할 수 있습니다.

// Define a simple interface for our database
type Database interface {
    GetBooks() ([]Book, error)
}

// Implement a mock database
type MockDatabase struct{}

func (m MockDatabase) GetBooks() ([]Book, error) {
    return []Book{{Title: "Mock Book"}}, nil
}

인터페이스를 사용하면 테스트 중에 실제 종속성을 모의 종속성으로 바꿀 수 있습니다. 이를 통해 테스트를 빠르고, 격리되고, 반복 가능하게 유지합니다.


다음은 무엇입니까?

이제 단위 테스트 작성을 시작했으므로 API의 다른 부분에 테스트를 추가해 보세요! ? 다음 주에는 변경 사항이 있을 때마다 이러한 테스트가 자동으로 실행될 수 있도록 CI/CD 파이프라인을 통합하는 방법을 살펴보겠습니다. 계속 지켜봐주세요!


질문: 가장 좋아하는 테스트 도구나 기술은 무엇입니까? 아래에 댓글을 남겨주세요. 다른 Go 개발자들이 테스트에 어떻게 접근하는지 듣고 싶습니다!


이러한 기본 사항을 통해 Go API를 더욱 안정적으로 만드는 견고한 테스트를 효과적으로 작성할 수 있습니다. 더 많은 테스트 팁과 고급 기술을 알아보려면 향후 게시물을 계속 지켜봐 주시기 바랍니다. 즐거운 테스트 되세요! ?

릴리스 선언문 이 기사는 https://dev.to/neelp03/essential-unit-testing-for-go-apis-build-code-with-confidence-ne3?1에서 복제됩니다. 침해가 있는 경우, Study_golang@163으로 문의해 주세요. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3