SQL cơ bản cho tester: Những câu truy vấn cần biết để kiểm tra dữ liệu

4 tháng trước · 10 phút đọc
Tại sao tester cần biết SQL?
Mình nhớ lần đầu test tính năng đăng ký tài khoản. Bấm Submit, thấy màn hình hiện "Đăng ký thành công" - mình đánh dấu pass và chuyển sang test case tiếp. Kết quả? Bug nổ production vì dữ liệu user thật ra không được lưu vào database, chỉ có thông báo hiển thị đúng thôi.
Từ đó mình học được một điều: giao diện nói gì không quan trọng bằng database lưu gì.
Verify trên UI chưa đủ - phải kiểm tra tận database
SQL (Structured Query Language) là ngôn ngữ để "nói chuyện" với database. Bạn không cần biết lập trình, không cần viết code phức tạp. Chỉ cần biết đủ để:
- Xác minh dữ liệu có được lưu đúng sau khi submit form
- Đối chiếu con số hiển thị trên UI với dữ liệu thật trong DB
- Tìm record cụ thể để reproduce bug
- Kiểm tra dữ liệu có bị trùng, bị thiếu, bị sai định dạng không
Good news: Tester không cần viết query phức tạp như dev. Phần lớn tester dùng SQL chủ yếu chỉ cần 4-5 câu lệnh cơ bản là đủ xử lý 90% công việc thực tế.
Bài này mình tập trung vào đúng những gì cần thiết - không dạy thừa, không bỏ sót phần quan trọng.
SELECT và WHERE: Bộ đôi kiểm tra dữ liệu cơ bản nhất
SELECT là câu lệnh lấy dữ liệu từ bảng. WHERE là điều kiện lọc. Hai cái này bạn sẽ dùng hàng ngày.
Cú pháp cơ bản:
Tình huống thực tế: Bạn vừa test tính năng đăng ký tài khoản với email [email protected]. Cần verify xem DB có lưu đúng không:
Một query SELECT đơn giản có thể xác nhận cả 5 trường dữ liệu cùng lúc
Nếu query trả về 1 row với đầy đủ thông tin đúng - pass. Nếu empty hoặc sai field - bug.
Những điều kiện WHERE hay dùng khi test:
Cái cuối quan trọng lắm. Mình từng test form đăng ký có field "Số điện thoại" bắt buộc - UI validate đúng, nhưng query IS NULL lại trả về hàng loạt record. Hóa ra frontend validate nhưng backend không lưu. Bug nghiêm trọng mà nhìn UI không phát hiện được.
Mẹo nhỏ: Dùng SELECT * khi muốn xem tất cả cột, dùng SELECT cột cụ thể khi bảng có nhiều cột và bạn chỉ cần verify một vài trường. Khi bảng có hàng triệu record, thêm LIMIT 10 vào cuối để không bị timeout:
ORDER BY, DISTINCT và COUNT: Ba thứ cần biết thêm
Ba câu lệnh này ngắn nhưng giải quyết được nhiều tình huống test thực tế.
ORDER BY - Sắp xếp để dễ kiểm tra
Khi test tính năng "hiển thị danh sách theo thứ tự mới nhất", cần verify DB trả dữ liệu đúng thứ tự:
DESC = giảm dần (mới nhất trước), ASC = tăng dần (cũ nhất trước). Đối chiếu thứ tự này với cái UI đang hiển thị - nếu khác nhau là bug.
DISTINCT - Phát hiện dữ liệu trùng
Mình dùng cái này khá nhiều khi test form submit. Điều đơn giản nhất: email user có bị duplicate không?
Query tìm duplicate email - bug điển hình khi thiếu unique constraint
Nếu query này trả về kết quả, database đang có record trùng - đây là bug cần report ngay.
COUNT - Đối chiếu số lượng UI vs DB
UI hiển thị "Tổng 150 sản phẩm" nhưng thực tế bao nhiêu?
So con số COUNT trả về với con số trên UI. Khác nhau = bug. Đơn giản vậy thôi, nhưng mình thấy nhiều fresher bỏ qua bước này và miss bug về pagination, filter.
GROUP BY: Kiểm tra thống kê và báo cáo
Tính năng báo cáo, dashboard thống kê là nơi GROUP BY cực kỳ hữu ích cho tester. UI hiển thị "Doanh thu theo tháng" hay "Số đơn hàng theo trạng thái" - bạn cần query để cross-check.
Cú pháp:
Ví dụ thực chiến - Test dashboard thống kê đơn hàng:
Kết quả trả về dạng:
status | so_don_hang
pending | 45
processing | 23
delivered | 189
cancelled | 12
Đem con số này so với widget dashboard trên UI. Một trường hợp mình hay gặp: UI hiển thị tổng nhưng không tách đúng theo status, hoặc filter theo ngày bị off 1 ngày do timezone.
GROUP BY giúp đối chiếu số liệu dashboard với dữ liệu thật trong DB
Thêm HAVING để lọc nhóm:
HAVING là WHERE nhưng dùng sau GROUP BY - lọc theo kết quả tổng hợp:
Lưu ý nhỏ nhưng quan trọng: WHERE lọc trước khi GROUP, HAVING lọc sau khi GROUP. Nhớ cái này để không viết nhầm điều kiện vào chỗ sai.
JOIN: Khi dữ liệu nằm ở nhiều bảng
Phần lớn ứng dụng thực tế lưu dữ liệu phân tán ở nhiều bảng liên quan nhau. Thông tin đơn hàng ở bảng orders, tên khách hàng ở bảng users, tên sản phẩm ở bảng products. JOIN là cách kết hợp dữ liệu từ nhiều bảng trong một query.
Bạn không cần nhớ hết các loại JOIN phức tạp. Tester chủ yếu dùng INNER JOIN và đôi khi LEFT JOIN.
INNER JOIN - Lấy record có ở CẢ HAI bảng:
INNER JOIN kết hợp dữ liệu từ 2 bảng - như ghép 2 danh sách lại với nhau
Tình huống test cụ thể: Bạn test tính năng "Quản lý đơn hàng". UI hiển thị tên khách hàng kèm đơn hàng - bạn cần verify thông tin này khớp với DB, không phải random hay hiển thị nhầm user.
LEFT JOIN - Tìm record không có dữ liệu liên kết:
Cái này đặc biệt hữu ích để tìm bug "dữ liệu mồ côi":
Thấy khó ở phần JOIN bình thường - mình cũng mất cả tuần mới quen. Cách mình nhớ: INNER JOIN như "giao 2 vòng tròn", LEFT JOIN như "toàn bộ vòng trái + phần giao". Thực hành 5-10 query là thấm ngay.
Quy trình kiểm tra dữ liệu sau khi submit form
Đây là tình huống test phổ biến nhất mà mình muốn tổng hợp lại thành quy trình cụ thể. Mỗi lần submit form là bạn cần verify ít nhất 3 điều trong database.
Bước 1: Record có được tạo không?
Empty = bug. Record có = tiếp tục bước 2.
Bước 2: Dữ liệu có được lưu đúng không?
Checklist 3 bước verify sau submit - quy trình tester nên làm thành thói quen
Bước 3: Không có dữ liệu thừa/trùng không?
Nếu so_lan > 1 khi bạn chỉ submit 1 lần, đó là bug trùng record. Nếu bạn cố tình submit 2 lần, bạn cần xem hệ thống có chặn được không.
Checklist đầy đủ khi test form: Tải checklist verify DB sau submit form
Quy trình 3 bước này nghe đơn giản nhưng mình thấy nhiều tester skip bước 2 và 3, chỉ check bước 1. Đó là lý do bug "field lưu sai" hay "submit 2 lần được" tồn tại đến tận production.