Gin、GORM、Testify、PostgreSQL を使用して Golang で包括的な統合テスト セットアップを作成するには、テスト データベースのセットアップ、CRUD 操作用のテストの作成、アサーション用の Testify の使用が含まれます。ここでは、開始するためのステップバイステップのガイドを示します:
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
データベース マッピング用に 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 }
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"}) }
データベース接続とルートを設定します。
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") }
テスト結果の設定とアサートには 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
次を使用してテストを実行します:
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
この設定を使用すると、ユーザー モデルの CRUD 操作をテストして、API が PostgreSQL で期待どおりに動作することを確認できます。 Book モデルと BorrowLog モデルについても同様にテストを拡張できます。
以上がGin、Gorm、Testify、PostgreSQL を使用した Golang 統合テストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。