# Kiểm thử Cơ sở dữ liệu (Database Testing)

## Mục đích (Purpose)
Xác minh rằng dữ liệu được lưu trữ, truy xuất, cập nhật và xóa bỏ một cách chính xác trong cơ sở dữ liệu. Đảm bảo tính nhất quán, toàn vẹn và bảo mật của dữ liệu, đồng thời kiểm tra các ràng buộc kỹ thuật và hiệu suất của các câu lệnh truy vấn.

## Kiến thức cần có (Required Knowledge)
- Thành thạo ngôn ngữ truy vấn SQL (DML: Select, Insert, Update, Delete; DDL: Create, Alter, Drop).
- Hiểu về các thuộc tính ACID (Atomicity, Consistency, Isolation, Durability) trong giao dịch (Transactions).
- Nắm vững cấu trúc Schema, các bảng, quan hệ (Primary Key, Foreign Key) và các ràng buộc (Constraints).
- Hiểu về Indexing và cách tối ưu hóa truy vấn.
- Kiến thức về Store Procedures, Triggers và Views (nếu có).

## Quy trình thực hiện (Process)
1. **Kiểm tra cấu trúc (Schema Validation):** Xác minh tên bảng, tên cột, kiểu dữ liệu và độ dài của các trường dữ liệu đúng với thiết kế.
2. **Kiểm thử Ràng buộc (Constraint Testing):** Kiểm tra tính thực thi của các ràng buộc Primary Key, Unique, Not Null, Check constraints.
3. **Kiểm thử tính nhất quán dữ liệu (Data Integrity):** Thực hiện các thao tác trên UI/API và dùng SQL để truy vấn trực tiếp DB, đối chiếu kết quả để đảm bảo dữ liệu lưu xuống đúng và đủ.
4. **Kiểm thử Giao dịch (Transaction Testing):** Thực hiện các luồng nghiệp vụ phức tạp và giả lập lỗi giữa chừng để kiểm tra tính năng Rollback (quay lại trạng thái cũ) và Commit (lưu thay đổi).
5. **Kiểm thử Truy cập đồng thời (Concurrency Testing):** Kiểm tra các vấn đề Deadlock hoặc tranh chấp dữ liệu khi nhiều người dùng/tiến trình cùng truy cập một bản ghi.
6. **Kiểm tra Trigger và Store Procedure:** Xác minh các logic tự động hóa trong DB hoạt động đúng khi có sự kiện kích hoạt.

## Checklist
### Cấu trúc & Ràng buộc
- [ ] Kiểu dữ liệu và độ dài các trường trong DB khớp với tài liệu thiết kế.
- [ ] Ràng buộc NOT NULL hoạt động: Không thể lưu giá trị null vào trường bắt buộc.
- [ ] Ràng buộc UNIQUE hoạt động: Không thể lưu hai giá trị giống nhau vào trường duy nhất.
- [ ] Ràng buộc Foreign Key hoạt động: Không thể lưu giá trị không tồn tại trong bảng cha hoặc xóa bản ghi cha khi đang có bản ghi con tham chiếu.

### Dữ liệu & Thao tác
- [ ] Dữ liệu lưu trong DB không bị cắt xén (Truncation) nếu độ dài vượt quá giới hạn hiển thị trên UI.
- [ ] Các giá trị mặc định (Default values) được gán đúng khi không có dữ liệu nhập vào.
- [ ] Dữ liệu ngày tháng (Date/Time) được lưu đúng múi giờ và định dạng.
- [ ] Các ký tự đặc biệt và Unicode (Tiếng Việt) được lưu và hiển thị đúng (không bị lỗi font).

### Giao dịch & Hiệu năng
- [ ] Giao dịch thành công được lưu vĩnh viễn (Durability).
- [ ] Giao dịch thất bại được Rollback hoàn toàn, không để lại dữ liệu rác.
- [ ] Các câu lệnh truy vấn phức tạp trả về kết quả trong thời gian cho phép (Response time).
- [ ] Các Index được sử dụng hiệu quả để tăng tốc độ tìm kiếm.

## Output mong đợi (Expected Output)
- Danh sách các câu lệnh SQL (Scripts) dùng để xác minh dữ liệu.
- Kết quả đối chiếu dữ liệu giữa UI/API và Database.
- Báo cáo về các lỗi vi phạm ràng buộc hoặc lỗi nhất quán dữ liệu.
