>백엔드 개발 >Golang >STRETCHR/TESTIFY 및 MOCKERY를 사용한 GOLANG 테스트

STRETCHR/TESTIFY 및 MOCKERY를 사용한 GOLANG 테스트

Linda Hamilton
Linda Hamilton원래의
2024-10-16 22:08:29770검색

GOLANG TESTING WITH STRETCHR/TESTIFY AND MOCKERY

stretcher/testify 라이브러리의 공통 기능과 Golang의 조롱에 대한 조롱을 다루는 포괄적인 예제를 살펴보겠습니다. 이 예에는 어설션을 사용한 테스트, 엄격한 어설션을 위한 require 패키지 사용, HTTP 핸들러 테스트, mockery를 사용한 종속성 모의 작업이 포함됩니다.

대본

외부 API에서 사용자 정보를 가져오는 서비스가 있다고 상상해 보세요. 우리는 다음을 테스트하고 싶습니다:

  • 서비스 기능
  • 외부 클라이언트와 통합됩니다.
  • 외부 클라이언트를 조롱합니다.

프로젝트 구조

/project
│
├── main.go
├── service.go
├── service_test.go
├── user_client.go
├── mocks/
│   └── UserClient.go (generated by mockery)
└── go.mod

코드 개요

  1. user_client.go

    이 파일은 외부 사용자 API와 상호작용하기 위한 인터페이스를 정의합니다.

    package project
    
    type User struct {
        ID   int
        Name string
    }
    
    type UserClient interface {
        GetUserByID(id int) (*User, error)
    }
    
  2. service.go

    이 파일에는 UserClient를 사용하여 사용자 세부 정보를 가져오는 서비스가 포함되어 있습니다.

    package project
    
    import "fmt"
    
    type UserService struct {
        client UserClient
    }
    
    func NewUserService(client UserClient) *UserService {
        return &UserService{client: client}
    }
    
    func (s *UserService) GetUserDetails(id int) (string, error) {
        user, err := s.client.GetUserByID(id)
        if err != nil {
            return "", fmt.Errorf("failed to get user: %w", err)
        }
    
        return fmt.Sprintf("User: %s (ID: %d)", user.Name, user.ID), nil
    }
    
  3. 모의 모의 생성

    mockery를 사용하여 UserClient에 대한 모의 객체를 생성할 수 있습니다:

    mockery --name=UserClient --output=./mocks
    

    이것은 mocks/UserClient.go에서 모의를 생성합니다.

  4. service_test.go

    이제 testify 어설션과 모의 생성 모의 객체를 사용하여 UserService에 대한 테스트를 작성해 보겠습니다.

        package project_test
    
        import (
            "errors"
            "testing"
    
            "github.com/stretchr/testify/assert"
            "github.com/stretchr/testify/require"
            "github.com/stretchr/testify/mock"
            "project"
            "project/mocks"
        )
    
        func TestUserService_GetUserDetails_Success(t *testing.T) {
            // Create a new mock client
            mockClient := new(mocks.UserClient)
    
            // Define what the mock should return when `GetUserByID` is called
            mockClient.On("GetUserByID", 1).Return(&project.User{
                ID:   1,
                Name: "John Doe",
            }, nil)
    
            // Create the UserService with the mock client
            service := project.NewUserService(mockClient)
    
            // Test the GetUserDetails method
            result, err := service.GetUserDetails(1)
    
            // Use `require` for error checks
            require.NoError(t, err)
            require.NotEmpty(t, result)
    
            // Use `assert` for value checks
            assert.Equal(t, "User: John Doe (ID: 1)", result)
    
            // Ensure that the `GetUserByID` method was called exactly once
            mockClient.AssertExpectations(t)
        }
    
        func TestUserService_GetUserDetails_Error(t *testing.T) {
            // Create a new mock client
            mockClient := new(mocks.UserClient)
    
            // Define what the mock should return when `GetUserByID` is called with an error
            mockClient.On("GetUserByID", 2).Return(nil, errors.New("user not found"))
    
            // Create the UserService with the mock client
            service := project.NewUserService(mockClient)
    
            // Test the GetUserDetails method
            result, err := service.GetUserDetails(2)
    
            // Use `require` for error checks
            require.Error(t, err)
            assert.Contains(t, err.Error(), "user not found")
    
            // Ensure that the result is empty
            assert.Empty(t, result)
    
            // Ensure that the `GetUserByID` method was called exactly once
            mockClient.AssertExpectations(t)
        }
    
    

이 예의 핵심 사항

  1. 의 주장:
    • Assert 및 require 패키지는 다양한 유형의 검사에 사용됩니다.
    • require는 테스트가 실패할 경우 즉시 실패해야 하는 검사에 사용됩니다(예: nil 오류 검사).
    • Assert는 실패하더라도 계속할 수 있는 검사(예: 값 비교)에 사용됩니다.
  2. 조롱조롱:
    • mockery는 UserClient 인터페이스의 모의를 생성합니다.
    • 테스트에서 모의 ​​객체는 예상 입력을 지정하는 .On()과 출력을 지정하는 .Return()으로 구성됩니다.
    • AssertExpectations는 모의 메서드가 예상 입력으로 호출되었는지 확인합니다.
  3. 테스트 오류 처리:
    • 한 테스트에서는 성공적인 시나리오를 확인하고, 다른 테스트에서는 서비스가 UserClient의 오류를 처리하는 방법을 테스트합니다.

이 설정은 어설션 및 모의 조롱을 위한 Stretchr/testify의 기본 기능을 다루며 Golang의 단위 테스트에 구조화되고 유지 관리 가능한 접근 방식을 제공합니다.

위 내용은 STRETCHR/TESTIFY 및 MOCKERY를 사용한 GOLANG 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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