Gin、Gorm、Testify、PostgreSQL を使用した Golang 統合テスト

DDD
リリース: 2024-10-26 15:10:03
オリジナル
487 人が閲覧しました

Golang Integration Test With Gin, Gorm, Testify, PostgreSQL

Gin、GORM、Testify、PostgreSQL を使用して Golang で包括的な統合テスト セットアップを作成するには、テスト データベースのセットアップ、CRUD 操作用のテストの作成、アサーション用の Testify の使用が含まれます。ここでは、開始するためのステップバイステップのガイドを示します:

前提条件

  • インストールしてください
  • Docker がインストールされました
  • ライブラリ: gin-gonic/gin、gorm.io/gorm、gorm.io/driver/postgres、testify、testcontainers-go

プロジェクトの構造

myapp/
|-- main.go
|-- models/
|   |-- models.go
|-- handlers/
|   |-- handlers.go
|-- tests/
|   |-- integration_test.go
|-- go.mod
|-- go.sum
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

1. モデルをセットアップする (models/models.go)

データベース マッピング用に GORM タグを使用してモデルを定義します。

package models

import (
    "time"
    "gorm.io/gorm"
)

type User struct {
    ID        uint           `gorm:"primaryKey"`
    Name      string         `gorm:"not null"`
    Email     string         `gorm:"unique;not null"`
    CreatedAt time.Time
}

type Book struct {
    ID            uint           `gorm:"primaryKey"`
    Title         string         `gorm:"not null"`
    Author        string         `gorm:"not null"`
    PublishedDate time.Time      `gorm:"not null"`
}

type BorrowLog struct {
    ID         uint           `gorm:"primaryKey"`
    UserID     uint           `gorm:"not null"`
    BookID     uint           `gorm:"not null"`
    BorrowedAt time.Time      `gorm:"default:CURRENT_TIMESTAMP"`
    ReturnedAt *time.Time
}
ログイン後にコピー

2. ハンドラーのセットアップ (handlers/handlers.go)

Gin を使用して CRUD 操作のルートとハンドラーを定義します。

package handlers

import (
    "myapp/models"
    "net/http"

    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

type Handler struct {
    DB *gorm.DB
}

func (h *Handler) CreateUser(c *gin.Context) {
    var user models.User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := h.DB.Create(&user).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusCreated, user)
}

func (h *Handler) GetUser(c *gin.Context) {
    var user models.User
    if err := h.DB.First(&user, c.Param("id")).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
        return
    }

    c.JSON(http.StatusOK, user)
}

func (h *Handler) UpdateUser(c *gin.Context) {
    var user models.User
    if err := h.DB.First(&user, c.Param("id")).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
        return
    }

    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := h.DB.Save(&user).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, user)
}

func (h *Handler) DeleteUser(c *gin.Context) {
    if err := h.DB.Delete(&models.User{}, c.Param("id")).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"message": "User deleted"})
}
ログイン後にコピー

3. メインアプリケーション (main.go)

データベース接続とルートを設定します。

package main

import (
    "myapp/handlers"
    "myapp/models"
    "github.com/gin-gonic/gin"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "log"
    "os"
)

func main() {
    dsn := "host=localhost user=postgres password=yourpassword dbname=testdb port=5432 sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("failed to connect to database: %v", err)
    }

    // Auto migrate the models
    db.AutoMigrate(&models.User{}, &models.Book{}, &models.BorrowLog{})

    h := handlers.Handler{DB: db}

    r := gin.Default()

    r.POST("/users", h.CreateUser)
    r.GET("/users/:id", h.GetUser)
    r.PUT("/users/:id", h.UpdateUser)
    r.DELETE("/users/:id", h.DeleteUser)

    r.Run(":8080")
}
ログイン後にコピー

4. 統合テスト (tests/integration_test.go)

テスト結果の設定とアサートには Testify を使用します。

データベースについては、テスト目的で Docker 化された PostgreSQL インスタンスを使用できます。これは分離されており、テスト後にすぐに破棄できます。 testcontainers-go を使用して Golang で設定する方法は次のとおりです。

testcontainers-go をインストールします:

go get github.com/testcontainers/testcontainers-go
ログイン後にコピー

以下は、テスト用に PostgreSQL コンテナを設定する integration_test.go ファイルです。

myapp/
|-- main.go
|-- models/
|   |-- models.go
|-- handlers/
|   |-- handlers.go
|-- tests/
|   |-- integration_test.go
|-- go.mod
|-- go.sum
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

説明

  • SetupTestDB: テスト用に GORM を使用して PostgreSQL データベース接続をセットアップします。
  • TestCreateUser: 新しいユーザーを作成するための POST リクエストを送信し、応答をアサートします。
  • TestGetUser: ID によってユーザーを取得し、データが挿入されたものと一致するかどうかを確認します。
  • TestUpdateUser:
    • PUT /users/:id エンドポイントを使用してユーザーを作成し、更新します。
    • 応答ステータスが 200 OK であることをアサートします。
    • ユーザーの詳細が応答で更新されていることを確認します。
    • データベースからユーザーを取得し、変更が保持されていることを確認します。
  • テスト削除ユーザー:
    • ユーザーを作成し、DELETE /users/:id エンドポイントを使用して削除します。
    • 応答ステータスが 200 OK であることをアサートし、成功メッセージをチェックします。
    • 削除されたユーザーをデータベースから取得して、そのユーザーが存在しないことを確認し、gorm.ErrRecordNotFound のエラーをアサートします。
  • testcontainers-go: このライブラリを使用すると、Go コードから直接 Docker コンテナをスピンアップできます。統合テスト用の一時的な PostgreSQL インスタンスを作成するのに最適です。
  • setupTestDB: この関数は PostgreSQL Docker コンテナを起動し、gorm を使用してそれに接続し、データベース スキーマをセットアップします。また、テスト終了後にコンテナーが確実にクリーンアップされるようにします。
  • defer postgresC.Terminate(ctx): インメモリ アプローチをシミュレートして、テストの完了後に PostgreSQL コンテナが確実に終了されるようにします。
  • 動的ホストとポート: データベースへの接続に、コンテナーに動的に割り当てられたホストとポートを使用します。

テストの実行

次を使用してテストを実行します:

myapp/
|-- main.go
|-- models/
|   |-- models.go
|-- handlers/
|   |-- handlers.go
|-- tests/
|   |-- integration_test.go
|-- go.mod
|-- go.sum
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
testcontainers-go を使用する利点:
  1. 分離: 各テストの実行では新しい PostgreSQL インスタンスが取得され、テスト間のデータ漏洩が確実に防止されます。
  2. 本番環境を複製: 実際の PostgreSQL インスタンスに対してテストすると、メモリ内データベースを使用するよりも信頼性の高い結果が得られます。
  3. 自動化: PostgreSQL コンテナを自動的に起動および停止するため、CI/CD パイプラインでの使用が簡単になります。

重要なポイント

  • テスト データベースの使用: 本番データへの影響を避けるために、テストには別の PostgreSQL データベース (例: コンテナ化されたデータベース) を使用することをお勧めします。
  • セットアップとクリーンアップ: 一貫性を維持するために、テストの間にデータベースを必ずクリーンアップしてください。
  • Testify: 結果を検証するための強力なアサーション メソッドを提供します。
  • Gin のテスト サーバー: httptest を使用して、Gin サーバーに対する HTTP リクエストをシミュレートします。

この設定を使用すると、ユーザー モデルの CRUD 操作をテストして、API が PostgreSQL で期待どおりに動作することを確認できます。 Book モデルと BorrowLog モデルについても同様にテストを拡張できます。

以上がGin、Gorm、Testify、PostgreSQL を使用した Golang 統合テストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!