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 Required
⚠️ 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_itemstable 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_attrong 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.usersvsSELECT 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 để:
- Tìm tất cả orders có total không khớp với sum của order_items
- Tìm users có 2+ accounts với cùng email (case-insensitive)
- Tìm products có stock âm (không hợp lệ)
- Verify rằng tất cả order_items reference đến valid order_id và valid product_id
- Tìm orders được tạo nhưng không có order_items nào (orphan orders)
- Đếm số orders theo trạng thái trong 30 ngày qua