Maison >développement back-end >Golang >Test d'intégration Golang avec Gin, Gorm, Testify, PostgreSQL
La création d'une configuration de test d'intégration complète dans Golang avec Gin, GORM, Testify et PostgreSQL implique la configuration d'une base de données de tests, l'écriture de tests pour les opérations CRUD et l'utilisation de Testify pour les assertions. Voici un guide étape par étape pour vous aider à démarrer :
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
Définissez les modèles avec les balises GORM pour le mappage de base de données.
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 }
Définissez les routes et les gestionnaires pour les opérations CRUD à l'aide de Gin.
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"}) }
Configurez la connexion à la base de données et les itinéraires.
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") }
Utilisez Testify pour configurer et valider les résultats des tests.
Pour la base de données, nous pouvons utiliser une instance PostgreSQL Dockerisée à des fins de test, qui est isolée et peut être rapidement démontée après les tests. Voici comment le configurer dans Golang à l'aide de testcontainers-go :
Installez testcontainers-go :
go get github.com/testcontainers/testcontainers-go
Voici le fichier Integration_test.go qui configure un conteneur PostgreSQL pour les tests :
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
Exécutez les tests en utilisant :
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
Avec cette configuration, vous pouvez tester les opérations CRUD pour un modèle utilisateur, garantissant ainsi que l'API fonctionne comme prévu avec PostgreSQL. Vous pouvez étendre les tests de la même manière pour les modèles Book et BorrowLog.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!