GIN, GORM, TESTIFY, MYSQL을 사용한 GOLANG 통합 테스트

Patricia Arquette
풀어 주다: 2024-10-18 14:07:02
원래의
488명이 탐색했습니다.

GOLANG INTEGRATION TEST WITH GIN, GORM, TESTIFY, MYSQL

Gin, Gorm, Testify 및 MySQL(인메모리 솔루션 사용)과 같은 라이브러리를 사용하여 Golang 애플리케이션에 대한 포괄적인 통합 테스트를 생성하려면 테스트 환경 설정, 경로 정의 및 처리기를 사용하고 실제 데이터베이스에 대해 테스트합니다(단, MySQL 인메모리를 사용하려면 단순성을 위해 인메모리 모드에서 SQLite를 사용하는 것과 같은 해결 방법이 필요할 수 있음).

다음은 통합 테스트 설정의 예입니다.

1. 종속성:

  • Gin: HTTP 서버를 생성합니다.
  • Gorm: ORM이 데이터베이스와 상호 작용합니다.
  • 증언: 주장을 위해.
  • SQLite 인메모리: 테스트 중에 MySQL을 대체하는 역할을 합니다.

2. 설정:

  • 기본 모델과 Gorm 설정을 정의합니다.
  • HTTP 경로 및 핸들러를 생성합니다.
  • Testify와 SQLite를 메모리 내 데이터베이스로 사용하여 테스트를 작성하세요.

전체 예는 다음과 같습니다.

// main.go
package main

import (
    "github.com/gin-gonic/gin"
    "gorm.io/driver/mysql"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "net/http"
)

// User represents a simple user model.
type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string `json:"name"`
    Email string `json:"email" gorm:"unique"`
}

// SetupRouter initializes the Gin engine with routes.
func SetupRouter(db *gorm.DB) *gin.Engine {
    r := gin.Default()

    // Inject the database into the handler
    r.POST("/users", func(c *gin.Context) {
        var user User
        if err := c.ShouldBindJSON(&user); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        if err := db.Create(&user).Error; err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusCreated, user)
    })

    r.GET("/users/:id", func(c *gin.Context) {
        var user User
        id := c.Param("id")
        if err := db.First(&user, id).Error; err != nil {
            c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
            return
        }
        c.JSON(http.StatusOK, user)
    })

    return r
}

func main() {
    // For production, use MySQL
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    db.AutoMigrate(&User{})

    r := SetupRouter(db)
    r.Run(":8080")
}
로그인 후 복사

통합 테스트

// main_test.go
package main

import (
    "bytes"
    "encoding/json"
    "github.com/stretchr/testify/assert"
    "net/http"
    "net/http/httptest"
    "testing"

    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

// SetupTestDB sets up an in-memory SQLite database for testing.
func SetupTestDB() *gorm.DB {
    db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
    if err != nil {
        panic("failed to connect to the test database")
    }
    db.AutoMigrate(&User{})
    return db
}

func TestCreateUser(t *testing.T) {
    db := SetupTestDB()
    r := SetupRouter(db)

    // Create a new user.
    user := User{Name: "John Doe", Email: "john@example.com"}
    jsonValue, _ := json.Marshal(user)
    req, _ := http.NewRequest("POST", "/users", bytes.NewBuffer(jsonValue))
    req.Header.Set("Content-Type", "application/json")
    w := httptest.NewRecorder()
    r.ServeHTTP(w, req)

    assert.Equal(t, http.StatusCreated, w.Code)

    var createdUser User
    json.Unmarshal(w.Body.Bytes(), &createdUser)
    assert.Equal(t, "John Doe", createdUser.Name)
    assert.Equal(t, "john@example.com", createdUser.Email)
}

func TestGetUser(t *testing.T) {
    db := SetupTestDB()
    r := SetupRouter(db)

    // Insert a user into the in-memory database.
    user := User{Name: "Jane Doe", Email: "jane@example.com"}
    db.Create(&user)

    // Make a GET request.
    req, _ := http.NewRequest("GET", "/users/1", nil)
    w := httptest.NewRecorder()
    r.ServeHTTP(w, req)

    assert.Equal(t, http.StatusOK, w.Code)

    var fetchedUser User
    json.Unmarshal(w.Body.Bytes(), &fetchedUser)
    assert.Equal(t, "Jane Doe", fetchedUser.Name)
    assert.Equal(t, "jane@example.com", fetchedUser.Email)
}

func TestGetUserNotFound(t *testing.T) {
    db := SetupTestDB()
    r := SetupRouter(db)

    // Make a GET request for a non-existent user.
    req, _ := http.NewRequest("GET", "/users/999", nil)
    w := httptest.NewRecorder()
    r.ServeHTTP(w, req)

    assert.Equal(t, http.StatusNotFound, w.Code)
}

로그인 후 복사

설명

  1. main.go:

    • Gin을 사용하여 사용자 구조체를 정의하고 기본 CRUD 작업을 설정합니다.
    • 데이터베이스 상호작용을 위해 Gorm을 사용하고 사용자 테이블을 자동으로 마이그레이션합니다.
    • SetupRouter는 HTTP 엔드포인트를 구성합니다.
  2. main_test.go:

    • SetupTestDB는 격리된 테스트를 위해 메모리 내 SQLite 데이터베이스를 초기화합니다.
    • TestCreateUser: 사용자 생성을 테스트합니다.
    • TestGetUser: 기존 사용자 가져오기를 테스트합니다.
    • TestGetUserNotFound: 존재하지 않는 사용자 가져오기를 테스트합니다.
    • HTTP 요청 및 응답을 시뮬레이션하기 위해 httptest.NewRecorder 및 http.NewRequest를 사용합니다.
    • HTTP 상태 코드 확인 및 JSON 응답 확인과 같은 어설션에 Testify를 사용합니다.

테스트 실행

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

go test -v
로그인 후 복사

고려사항

  • 인 메모리 테스트를 위한 SQLite: MySQL은 기본적으로 Gorm의 인 메모리 모드를 지원하지 않으므로 이 예에서는 인 메모리 테스트에 SQLite를 사용합니다. MySQL 관련 기능을 사용하는 테스트의 경우 MySQL 컨테이너와 함께 Docker 기반 설정을 사용하는 것이 좋습니다.
  • 데이터베이스 마이그레이션: 테스트에서 AutoMigrate를 사용하여 항상 데이터베이스 스키마가 최신 상태인지 확인하세요.
  • 격리: 각 테스트 기능은 새로운 인메모리 데이터베이스를 초기화하여 테스트가 서로 간섭하지 않도록 합니다.

위 내용은 GIN, GORM, TESTIFY, MYSQL을 사용한 GOLANG 통합 테스트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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