0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Kiểm Thử Tích Hợp Với Golang Sử Dụng Gin, Gorm, Testify và MySQL

Đăng vào 4 ngày trước

• 3 phút đọc

Hướng Dẫn Kiểm Thử Tích Hợp Với Golang Sử Dụng Gin, Gorm, Testify và MySQL

Trong bài viết này, chúng ta sẽ khám phá cách viết chương trình kiểm thử tích hợp (integration test) cho ứng dụng Golang. Chúng ta sẽ sử dụng các thư viện nổi bật như Gin, Gorm, Testify, kết hợp với MySQL thông qua giải pháp in-memory. Bài viết sẽ trình bày các bước setup môi trường kiểm thử, định nghĩa các routes và handlers, và kiểm tra chúng bằng một cơ sở dữ liệu thực tế (thay vì MySQL, chúng ta sẽ sử dụng SQLite để làm đơn giản hơn).

Mục Lục

  1. Các Thư Viện Cần Thiết
  2. Thiết Lập Môi Trường
  3. Viết Chương Trình Kiểm Thử Tích Hợp
  4. Giải Thích Chi Tiết
  5. Chạy Chương Trình Kiểm Thử

Các Thư Viện Cần Thiết

  • Gin: Thư viện giúp tạo HTTP server nhanh chóng.
  • Gorm: Thư viện ORM mạnh mẽ để tương tác với cơ sở dữ liệu.
  • Testify: Hỗ trợ kiểm tra (assertions) dễ dàng hơn.
  • SQLite in-memory: Sử dụng thay thế cho MySQL trong quá trình kiểm thử.

Thiết Lập Môi Trường

  1. Định nghĩa một model đơn giản và thiết lập Gorm.
  2. Tạo các HTTP routes và handlers cho ứng dụng.
  3. Viết các bài test bằng cách sử dụng Testify và SQLite như một cơ sở dữ liệu in-memory.

Viết Chương Trình Kiểm Thử Tích Hợp

Dưới đây là ví dụ chi tiết về cách thiết lập chương trình kiểm thử tích hợp này:

go Copy
// main.go
package main

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

// User đại diện cho mô hình người dùng đơn giản.
type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `json:"name"`
	Email string `json:"email" gorm:"unique"`
}

// SetupRouter khởi tạo Gin engine với các routes.
func SetupRouter(db *gorm.DB) *gin.Engine {
	r := gin.Default()

	// Inject database vào 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)
	})
	
	// Các phương thức PUT và DELETE cho User sẽ được định nghĩa ở đây...
	
	return r
}

func main() {
	// Sử dụng MySQL cho môi trường sản xuất
	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")
}

Giải Thích Chi Tiết

  1. main.go: Định nghĩa một struct User và thiết lập các thao tác CRUD cơ bản sử dụng Gin, Gorm để tương tác với cơ sở dữ liệu và tự động migrate bảng User. Hàm SetupRouter sẽ cấu hình các endpoint HTTP cho ứng dụng.
  2. main_test.go: Tạo một database SQLite in-memory để kiểm thử. Mỗi bài test sẽ kiểm tra các chức năng tạo, lấy, cập nhật, và xóa người dùng với các assertions sử dụng Testify.

Chạy Chương Trình Kiểm Thử

Để thực hiện các bài kiểm thử, bạn chỉ cần chạy lệnh sau trong terminal:

bash Copy
go test -v

Lưu Ý Quan Trọng

  • SQLite for In-memory Testing: Đây là lựa chọn tốt cho các bài kiểm thử nhỏ gọn. Nếu bạn cần sử dụng các tính năng cụ thể của MySQL, hãy xem xét giải pháp Docker với container MySQL.
  • Database Migrations: Đảm bảo cập nhật schema cơ sở dữ liệu một cách chính xác bằng cách sử dụng AutoMigrate trong các bài kiểm thử.
  • Isolation: Mỗi trường hợp test sẽ tạo một database in-memory mới để tránh sự ảnh hưởng giữa các hàm test.

Nếu bạn thấy bài viết này hữu ích, hãy cho mình biết bằng cách để lại phản hồi hoặc chia sẻ với bạn bè! Cảm ơn bạn đã đọc!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào