GoLang:: 테스트 코드 예제
🙊

GoLang:: 테스트 코드 예제

Created
Jun 4, 2024 06:03 AM
Last edited time
Last updated June 4, 2024
Tags
Language
Language
GoLang
URL

Intro::

테스트 코드 예제입니다.
검색 API 구현 코드에 대한 테스트 코드 예제 입니다.

사전 설정

  • 파일명은 [테스트 파일명]_test.go
    • Go에서 테스트 파일의 이름은 반드시 _test.go로 끝나야 합니다. 그래야 go test 명령어로 테스트를 실행할 때 해당 파일이 테스트 파일로 인식됩니다.
  • package 는 테스트 파일과 같은 package example혹은 package example_test 처럼 작성
    • 동일한 패키지로 작성하면 패키지의 비공개(내부) 함수와 변수를 테스트할 수 있고, example_test와 같이 작성하면 패키지의 공개 함수만 테스트할 수 있습니다.
  • 테스트 함수명은 Test_로 시작해야 하며, 이 후에 대문자로 시작하는 이름을 사용해야 합니다. 이 규칙을 따르지 않으면 go test 명령어로 테스트를 실행할 때 인식되지 않습니다.
    • func Test_SearchMovie(t *testing.T) {}

테스트 코드

package controller_test import ( "encoding/json" "log" "net/http" "net/http/httptest" "searchAPI/controller" customerror "searchAPI/global/customError" "searchAPI/handler" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" ) type mockHandler struct{} func (m *mockHandler) EsSearchAllMovies(query map[string]string) ([]interface{}, customerror.CustomError) { // 가짜 데이터 반환 return []interface{}{"Movie1", "Movie2"}, customerror.CustomError{} } func (m *mockHandler) EsSearchNameMovie(query map[string]string) ([]interface{}, customerror.CustomError) { if query["search"] == "fail" { return nil, customerror.CustomError{Code: 404, Cerror: customerror.ErrNotFound} } return []interface{}{"Movie1", "Movie2"}, customerror.CustomError{} } func Test_SearchMovie(t *testing.T) { gin.SetMode(gin.TestMode) var mock handler.MovieHandler = &mockHandler{} c := controller.MovieController{Handler: mock} pathNQuery := []string{"/movies", "/movies?search='movie'", "/movies?search='movie'&page=2", "/movies?search=fail"} for _, target := range pathNQuery { log.Println(target, "테스트 시작") req, _ := http.NewRequest(http.MethodGet, target, nil) // gin Context 생성 w := httptest.NewRecorder() ctx, _ := gin.CreateTestContext(w) ctx.Request = req // 요청을 수행할 핸들러 메서드 호출 c.SearchMovie(ctx) // 응답 확인 assert.Equal(t, http.StatusOK, w.Code) // 예상된 JSON 결과 var expected string if target == "/movies?search=fail" { expected = `{"desc":"NOT FOUND", "result":null, "status":404}` } else { expected = `{"desc":"", "result":["Movie1", "Movie2"], "status":200}` } // 응답 JSON 결과 var expectedJSON map[string]interface{} var actualJSON map[string]interface{} // JSON 파싱 err := json.Unmarshal([]byte(expected), &expectedJSON) assert.NoError(t, err) // err 가 nil 인지 확인, JSON 디코딩 과정에서 오류 발생시 테스트 실패 err = json.Unmarshal(w.Body.Bytes(), &actualJSON) assert.NoError(t, err) // JSON 객체 비교 assert.Equal(t, expectedJSON, actualJSON) } }
 

References::

 

Loading Comments...