Có, và đây là loại test hay bị bỏ nhất dù hậu quả nặng nhất — migration chạy sai trên production thường không thể undo bằng cách deploy lại code.
Ba việc phải kiểm:
1. Migration chạy được từ trạng thái thật. Chạy toàn bộ chuỗi migration từ đầu trên một DB rỗng (Testcontainers) trong CI. Nếu có down, kiểm up → down → up không lỗi. Cách này bắt được migration phụ thuộc ngầm vào một bảng do người khác thêm sau.
2. Dữ liệu cũ được chuyển đúng. Với migration có biến đổi dữ liệu: seed dữ liệu ở dạng cũ, chạy migration, khẳng định dạng mới đúng — gồm cả case xấu: giá trị NULL, chuỗi rỗng, bản ghi trùng, dữ liệu không parse được.
3. Code cũ và schema mới sống chung được. Trong lúc deploy luôn có khoảng thời gian instance cũ và instance mới cùng chạy. Vì vậy đổi cột trực tiếp là sai, phải làm theo expand-contract:
expand : thêm cột mới (nullable), code mới ghi cả hai cột
migrate : backfill dữ liệu cũ sang cột mới theo lô
switch : code chuyển sang đọc cột mới
contract : release sau mới xoá cột cũMỗi bước là một release riêng, mỗi bước đều rollback được vì không có bước nào phá vỡ phiên bản code đang chạy.
Hai điểm cộng khi trả lời: backfill theo lô cho bảng lớn (UPDATE ... LIMIT lặp lại) để không giữ lock lâu, và diễn tập migration một lần trên bản sao dữ liệu production đã ẩn danh để biết trước nó chạy mất bao lâu.