Trang chủ
QA Learning Hub
Chương 12 · Database Testing
Chương 12 Trung Cấp

Database Testing

SQL cần biết cho QA, data validation strategies, transaction testing và migration testing.

🗃️ SQL Quan Trọng cho QA
⚠️ Nguyên tắc an toàn
Trên Production DB: CHỈ SELECT, không bao giờ UPDATE/DELETE/INSERT. Trên test DB: luôn biết data nào bạn tạo để cleanup sau. Wrap UPDATE/DELETE trong transaction, verify với SELECT trước khi COMMIT.
-- SELECT cơ bản với điều kiện SELECT id, email, status, created_at FROM users WHERE status = 'active' AND created_at >= '2025-01-01' ORDER BY created_at DESC LIMIT 10; -- JOIN để liên kết bảng SELECT o.id AS order_id, u.email, o.total, o.status FROM orders o INNER JOIN users u ON o.user_id = u.id WHERE o.status = 'pending' ORDER BY o.created_at DESC; -- COUNT và GROUP BY — đếm phân bố SELECT status, COUNT(*) AS total FROM orders GROUP BY status ORDER BY total DESC; -- Tìm duplicates SELECT email, COUNT(*) AS occurrences FROM users GROUP BY email HAVING COUNT(*) > 1; -- NULL check — tìm data thiếu SELECT id, name, phone FROM customers WHERE phone IS NULL OR phone = ''; -- Subquery — orders không có items SELECT id FROM orders WHERE id NOT IN ( SELECT DISTINCT order_id FROM order_items );
Data Validation Strategies

Sau khi thực hiện action trên UI/API → verify data trong DB:

  • Record creation: POST /api/users → query SELECT * FROM users WHERE email = 'test@test.com' → verify row exists với đúng data
  • Record update: PUT /api/users/123 → query SELECT updated_at FROM users WHERE id = 123 → timestamp mới hơn
  • Record delete: DELETE /api/users/123 → query → row không còn (hard delete) hoặc deleted_at IS NOT NULL (soft delete)
  • Count verification: Import 1000 products → SELECT COUNT(*) FROM products = 1000
  • Foreign key integrity: Order created → order_items table có đúng số rows với đúng order_id
  • Constraint validation: UI allows duplicate email? → check DB constraint reject nó: INSERT INTO users(email) VALUES('existing@test.com'); → phải raise constraint error
  • Encoding: Input tiếng Việt "Nguyễn" → SELECT → verify không bị lỗi encoding
  • Timezone: Action lúc 10:00 AM EST → created_at trong DB phải là UTC hoặc có correct offset
🔒 Transactions & ACID Testing

ACID Properties — QA cần hiểu để thiết kế test cases:

  • AtomicityTất cả operations trong transaction phải thành công HOẶC tất cả rollback. Test: payment thành công nhưng order tạo fail → phải rollback payment (không charge). Hoặc inventory giảm nhưng order không tạo → phải rollback inventory.
  • ConsistencyDB luôn ở trạng thái hợp lệ. Test: account balance không bao giờ âm, foreign key integrity không bao giờ bị vi phạm.
  • IsolationTransactions đồng thời không ảnh hưởng nhau. Test: 2 users cùng mua item cuối cùng → chỉ 1 người mua được, người còn lại nhận out-of-stock.
  • DurabilityCommitted transaction tồn tại vĩnh viễn, ngay cả khi system crash. Test: sau server restart, data vẫn intact.
-- Test Transaction Rollback (chỉ trên test DB) BEGIN; INSERT INTO orders (user_id, total) VALUES (123, 99.99); SELECT LAST_INSERT_ID() AS order_id; -- get new order id -- Simulate failure: intentionally don't insert order_items ROLLBACK; -- Order should NOT exist after this SELECT * FROM orders WHERE user_id = 123; -- verify rollback worked
📦 ETL & Data Migration Testing
  • Reconciliation: Source record count = Destination record count. SELECT COUNT(*) FROM source_db.users vs SELECT COUNT(*) FROM target_db.users
  • Data Accuracy: Sample 100 records ngẫu nhiên, so sánh source và destination field by field
  • Transformation: Transform rules applied correctly (date format change, field rename, calculated fields)
  • Null Handling: NULL values migrate correctly, không bị converted thành empty string hoặc 0
  • Character Encoding: Special characters (accents, emoji, CJK characters) migrate intact
  • Referential Integrity: All foreign keys in destination point to existing records
  • Performance: Migration completes within acceptable time window (downtime window)
  • Rollback Plan: Verify rollback procedure works — can we restore from backup?
🧰 Database Tools cho QA
  • DBeaverFree, cross-platform, support 80+ database types. Best for multi-DB environment. Features: query editor, ER diagram, data compare, export to CSV/Excel.
  • TablePlusClean UI, fast, Mac/Windows. Hỗ trợ MySQL, PostgreSQL, SQLite, Redis, MongoDB. Bản free giới hạn 2 tabs mở cùng lúc.
  • pgAdmin 4Official PostgreSQL admin tool. Mạnh về query analysis, EXPLAIN plan visualization.
  • MySQL WorkbenchOfficial MySQL tool. Strong với ER diagram, schema design, migration wizard.
  • MongoDB CompassGUI cho MongoDB — view collections, run queries (aggregation pipeline), index management.
  • Redis InsightOfficial Redis GUI — xem keys, TTL, data types, memory usage. Hữu ích khi test cache behavior.
✏️ Bài Tập
📝 Bài Tập: SQL Queries cho Data Validation

E-commerce database có tables: users, orders, order_items, products. Viết SQL queries để:

  1. Tìm tất cả orders có total không khớp với sum của order_items
  2. Tìm users có 2+ accounts với cùng email (case-insensitive)
  3. Tìm products có stock âm (không hợp lệ)
  4. Verify rằng tất cả order_items reference đến valid order_id và valid product_id
  5. Tìm orders được tạo nhưng không có order_items nào (orphan orders)
  6. Đếm số orders theo trạng thái trong 30 ngày qua