使用 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 设置和断言测试结果。
对于数据库,我们可以使用 Dockerized PostgreSQL 实例进行测试,该实例是隔离的,测试后可以快速拆除。以下是如何使用 testcontainers-go 在 Golang 中进行设置:
安装 testcontainers-go:
go get github.com/testcontainers/testcontainers-go
以下是integration_test.go 文件,用于设置用于测试的 PostgreSQL 容器:
myapp/ |-- main.go |-- models/ | |-- models.go |-- handlers/ | |-- handlers.go |-- tests/ | |-- integration_test.go |-- go.mod |-- go.sum
解释
- SetupTestDB:使用 GORM 设置 PostgreSQL 数据库连接进行测试。
- TestCreateUser:发送 POST 请求以创建新用户并断言响应。
- TestGetUser:通过 ID 检索用户并检查数据是否与插入的内容匹配。
-
测试更新用户:
- 创建用户并使用 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 的好处:
- 隔离:每次测试运行都会获得一个新的 PostgreSQL 实例,确保测试之间不会发生数据泄漏。
- 复制生产环境:针对真实的 PostgreSQL 实例进行测试可提供比使用内存数据库更可靠的结果。
- 自动化:自动启动和停止 PostgreSQL 容器,使其易于在 CI/CD 管道中使用。
要点
- 使用测试数据库:使用单独的 PostgreSQL 数据库(例如:容器化数据库)进行测试是一个很好的做法,以避免影响生产数据。
- 设置和清理:确保在测试之间清理数据库以保持一致性。
- Testify:提供强大的断言方法来验证结果。
- Gin 的测试服务器:使用 httptest 模拟针对 Gin 服务器的 HTTP 请求。
通过此设置,您可以测试用户模型的 CRUD 操作,确保 API 按预期与 PostgreSQL 配合使用。您可以类似地对 Book 和 BorrowLog 模型扩展测试。
以上是Golang 与 Gin、Gorm、Testify、PostgreSQL 的集成测试的详细内容。更多信息请关注PHP中文网其他相关文章!

在Go中,使用互斥锁和锁是确保线程安全的关键。1)使用sync.Mutex进行互斥访问,2)使用sync.RWMutex处理读写操作,3)使用原子操作进行性能优化。掌握这些工具及其使用技巧对于编写高效、可靠的并发程序至关重要。

如何优化并发Go代码的性能?使用Go的内置工具如gotest、gobench和pprof进行基准测试和性能分析。1)使用testing包编写基准测试,评估并发函数的执行速度。2)通过pprof工具进行性能分析,识别程序中的瓶颈。3)调整垃圾收集设置以减少其对性能的影响。4)优化通道操作和限制goroutine数量以提高效率。通过持续的基准测试和性能分析,可以有效提升并发Go代码的性能。

避免并发Go程序中错误处理的常见陷阱的方法包括:1.确保错误传播,2.处理超时,3.聚合错误,4.使用上下文管理,5.错误包装,6.日志记录,7.测试。这些策略有助于有效处理并发环境中的错误。

IndimitInterfaceImplementationingingoembodiesducktybybyallowingTypestoSatoSatiSatiSatiSatiSatiSatsatSatiSatplicesWithouTexpliclIctDeclaration.1)itpromotesflemotesflexibility andmodularitybybyfocusingion.2)挑战挑战InclocteSincludeUpdatingMethodSignateSignatiSantTrackingImplections.3)工具li

在Go编程中,有效管理错误的方法包括:1)使用错误值而非异常,2)采用错误包装技术,3)定义自定义错误类型,4)复用错误值以提高性能,5)谨慎使用panic和recover,6)确保错误消息清晰且一致,7)记录错误处理策略,8)将错误视为一等公民,9)使用错误通道处理异步错误。这些做法和模式有助于编写更健壮、可维护和高效的代码。

在Go中实现并发可以通过使用goroutines和channels来实现。1)使用goroutines来并行执行任务,如示例中同时享受音乐和观察朋友。2)通过channels在goroutines之间安全传递数据,如生产者和消费者模式。3)避免过度使用goroutines和死锁,合理设计系统以优化并发程序。

Gooffersmultipleapproachesforbuildingconcurrentdatastructures,includingmutexes,channels,andatomicoperations.1)Mutexesprovidesimplethreadsafetybutcancauseperformancebottlenecks.2)Channelsofferscalabilitybutmayblockiffullorempty.3)Atomicoperationsareef

go'serrorhandlingisexplicit,治疗eRROSASRETRATERTHANEXCEPTIONS,与pythonandjava.1)go'sapphifeensuresererrawaresserrorawarenessbutcanleadtoverbosecode.2)pythonandjavauseexeexceptionseforforforforforcleanerCodebutmaymobisserrors.3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),