# Checklist kiểm thử manual - Mini E-commerce

## 1. Chức năng giỏ hàng

| ID | Mô tả kiểm tra | Bước kiểm thử | Expected (Kỳ vọng) | Actual (Thực tế) | Pass/Fail | Evidence link |
|---|---|---|---|---|---|---|
| CART-01 | Thêm sản phẩm vào giỏ từ trang chi tiết | 1) Mở trang chi tiết sản phẩm A còn hàng 2) Chọn biến thể (nếu có) 3) Nhấn Thêm vào giỏ 4) Mở trang giỏ hàng | - Hiển thị sản phẩm A đúng biến thể  - Số lượng mặc định = 1  - Đơn giá đúng  - Tạm tính = đơn giá x 1  - Biểu tượng giỏ hiển thị đúng số lượng |  |  |  |
| CART-02 | Thêm cùng sản phẩm nhiều lần gộp số lượng | 1) Thêm sản phẩm A vào giỏ 2) Thêm lại A lần nữa 3) Vào giỏ hàng | - Không tạo dòng trùng  - Số lượng A tăng lên 2  - Tạm tính cập nhật đúng  - Tổng tiền cập nhật đúng |  |  |  |
| CART-03 | Cập nhật số lượng trong giỏ | 1) Vào giỏ có sản phẩm A 2) Tăng số lượng A lên N (N hợp lệ, ≤ tồn kho) 3) Quan sát tổng/tạm tính | - Số lượng cập nhật theo N  - Tạm tính dòng và tổng tiền cập nhật ngay (debounce hợp lý)  - Không lỗi làm mới trang |  |  |  |
| CART-04 | Xóa sản phẩm khỏi giỏ | 1) Trong giỏ nhấn Xóa ở dòng A hoặc đặt số lượng = 0 2) Xác nhận (nếu có) | - Dòng sản phẩm A bị xóa  - Nếu giỏ trống: hiển thị trạng thái “Giỏ hàng trống” và CTA tiếp tục mua sắm  - Tổng tiền = 0 |  |  |  |
| CART-05 | Giới hạn tồn kho/đầu vào không hợp lệ | 1) Trong giỏ thử nhập số lượng vượt tồn kho 2) Thử nhập ký tự không phải số 3) Thử số âm | - Hiển thị thông báo “Chỉ còn X sản phẩm”  - Tự động giới hạn về tồn kho tối đa  - Từ chối ký tự không hợp lệ/số âm  - Không cho tiếp tục checkout nếu vượt tồn kho |  |  |  |
| CART-06 | Biến thể/giá đúng khi thêm | 1) Ở trang chi tiết chọn biến thể B (màu/size) có giá khác 2) Thêm vào giỏ | - Trong giỏ hiển thị đúng biến thể B  - Giá áp dụng đúng theo biến thể B  - Ảnh/thuộc tính biến thể hiển thị đúng |  |  |  |
| CART-07 | Đồng bộ biểu tượng giỏ và lưu trạng thái | 1) Thêm sản phẩm khi chưa đăng nhập 2) Làm mới trang/chuyển trang 3) Đăng nhập vào tài khoản 4) Kiểm tra giỏ | - Biểu tượng giỏ cập nhật đúng ở mọi trang  - Giỏ hàng giữ nguyên sau tải lại trang  - Sau đăng nhập: giỏ hợp nhất chính xác (không mất/spam mục) |  |  |  |

## 2. Form checkout

| ID | Mô tả kiểm tra | Bước kiểm thử | Expected (Kỳ vọng) | Actual (Thực tế) | Pass/Fail | Evidence link |
|---|---|---|---|---|---|---|
| CHECKOUT-01 | Bắt buộc trường khi gửi rỗng | 1) Vào checkout với giỏ hợp lệ 2) Để trống các trường bắt buộc 3) Nhấn Đặt hàng/Thanh toán | - Hiển thị lỗi cho từng trường bắt buộc (họ tên, email, điện thoại, địa chỉ, tỉnh/thành, quận/huyện, mã bưu chính nếu áp dụng)  - Không tạo đơn |  |  |  |
| CHECKOUT-02 | Validate định dạng email/điện thoại/mã bưu chính | 1) Nhập email sai định dạng 2) Nhập điện thoại chứa ký tự 3) Nhập mã bưu chính sai độ dài 4) Submit | - Thông báo lỗi cụ thể từng trường  - Không cho qua bước thanh toán cho đến khi hợp lệ |  |  |  |
| CHECKOUT-03 | Lựa chọn địa chỉ và hiển thị phương thức vận chuyển | 1) Chọn tỉnh/thành, quận/huyện, phường/xã hợp lệ 2) Chờ tải phương thức vận chuyển | - Danh sách phương thức vận chuyển hiển thị theo địa chỉ  - Phí vận chuyển hiển thị đúng  - Chọn được một phương thức |  |  |  |
| CHECKOUT-04 | Áp dụng mã giảm giá hợp lệ/không hợp lệ | 1) Nhập mã giảm giá hợp lệ 2) Áp dụng 3) Thử mã sai/hết hạn | - Mã hợp lệ: hiển thị giảm giá, tổng tiền cập nhật  - Mã sai: thông báo lỗi rõ ràng, không thay đổi tổng |  |  |  |
| CHECKOUT-05 | Cập nhật tổng với phí vận chuyển/thuế | 1) Chọn phương thức vận chuyển khác nhau 2) Quan sát tổng | - Tổng = Tạm tính + Phí vận chuyển + Thuế - Giảm giá  - Làm tròn/định dạng tiền tệ đúng |  |  |  |
| CHECKOUT-06 | Địa chỉ thanh toán khác địa chỉ giao hàng | 1) Bỏ chọn “Dùng địa chỉ giao hàng làm địa chỉ thanh toán” 2) Nhập địa chỉ thanh toán riêng 3) Submit | - Bắt buộc nhập đầy đủ thông tin thanh toán  - Thông tin thanh toán được lưu và hiển thị đúng trong đơn |  |  |  |
| CHECKOUT-07 | Giao diện và khả dụng của nút hành động | 1) Kiểm tra nút Đặt hàng/Thanh toán khi form chưa hợp lệ 2) Sau khi hợp lệ | - Nút bị vô hiệu khi form lỗi  - Nút hoạt động khi hợp lệ  - Không tạo nhiều đơn khi click nhanh nhiều lần (loading/disable) |  |  |  |

## 3. Thanh toán giả lập (sandbox)

| ID | Mô tả kiểm tra | Bước kiểm thử | Expected (Kỳ vọng) | Actual (Thực tế) | Pass/Fail | Evidence link |
|---|---|---|---|---|---|---|
| PAY-01 | Chuyển hướng sang cổng giả lập với số tiền đúng | 1) Ở checkout chọn phương thức “Thanh toán giả lập” 2) Nhấn Thanh toán 3) Quan sát trang cổng | - Chuyển hướng tới trang sandbox  - Hiển thị mã đơn/ID phiên và số tiền khớp tổng ở checkout  - Không thể sửa số tiền từ client |  |  |  |
| PAY-02 | Luồng thanh toán thành công | 1) Trên sandbox chọn Kết quả “Thành công” 2) Xác nhận 3) Quan sát trang cảm ơn | - Redirect về trang cảm ơn  - Hiển thị mã đơn  - Trạng thái đơn = Đã thanh toán/Đang xử lý  - Ghi nhận giao dịch trong lịch sử  - Kích hoạt gửi email xác nhận |  |  |  |
| PAY-03 | Luồng thanh toán thất bại | 1) Trên sandbox chọn “Thất bại” 2) Xác nhận | - Trở lại trang checkout hoặc trang lỗi  - Thông báo lỗi rõ ràng  - Đơn (nếu tạo trước) ở trạng thái Chờ thanh toán/Thất bại, không giao hàng  - Cho phép thử lại |  |  |  |
| PAY-04 | Hủy bởi người dùng | 1) Trên sandbox chọn “Hủy” 2) Xác nhận | - Quay lại checkout  - Thông báo đã hủy  - Không thu tiền  - Đơn ở trạng thái Chờ thanh toán (nếu đã tạo) |  |  |  |
| PAY-05 | Ngăn submit nhiều lần/charge trùng | 1) Tại checkout nhấn Thanh toán liên tục/refresh khi đang xử lý 2) Hoàn tất tại sandbox | - Chỉ tạo 1 giao dịch/1 đơn được ghi nhận  - Không bị trừ tiền nhiều lần  - Nút thanh toán bị khóa trong khi xử lý |  |  |  |
| PAY-06 | Timeout/không phản hồi từ cổng | 1) Trong sandbox mô phỏng timeout 2) Quan sát hệ thống | - Hiển thị thông báo timeout  - Đơn ở trạng thái Chờ thanh toán  - Có thể thử lại mà không nhân đôi đơn |  |  |  |
| PAY-07 | Toàn vẹn tiền tệ/số tiền | 1) So sánh tổng checkout với số tiền tại sandbox và số tiền ghi nhận khi callback | - Số tiền khớp ở mọi bước  - Không sai khác do làm tròn/đơn vị tiền  - Giao dịch bị từ chối nếu số tiền không khớp |  |  |  |

## 4. Email xác nhận đơn hàng

| ID | Mô tả kiểm tra | Bước kiểm thử | Expected (Kỳ vọng) | Actual (Thực tế) | Pass/Fail | Evidence link |
|---|---|---|---|---|---|---|
| EMAIL-01 | Gửi email sau thanh toán thành công | 1) Hoàn tất thanh toán thành công 2) Kiểm tra hộp thư người mua | - Nhận email trong thời gian hợp lý (≤ 5 phút)  - Tiêu đề đúng (VD: Xác nhận đơn #1234)  - Người gửi/địa chỉ From đúng thương hiệu |  |  |  |
| EMAIL-02 | Nội dung chi tiết đơn hàng | 1) Mở email xác nhận | - Có: mã đơn, ngày đặt, tên khách  - Danh sách sản phẩm (tên, biến thể, SL, đơn giá)  - Tạm tính, phí vận chuyển, thuế, giảm giá, tổng tiền  - Địa chỉ giao hàng/thanh toán  - Phương thức thanh toán |  |  |  |
| EMAIL-03 | Liên kết trong email hoạt động | 1) Click “Xem đơn hàng”/“Theo dõi đơn” trong email | - Link điều hướng đúng tới trang đơn hàng  - Bảo mật: yêu cầu đăng nhập hoặc token an toàn  - Không 404/500 |  |  |  |
| EMAIL-04 | Không gửi email khi thất bại/hủy | 1) Thực hiện thanh toán thất bại/hủy 2) Kiểm tra hộp thư | - Không có email xác nhận đơn  - Nếu có email thông báo thất bại (nếu thiết kế): nội dung phù hợp, không có thông tin sai |  |  |  |
| EMAIL-05 | Không gửi trùng lặp | 1) Hoàn tất 1 đơn 2) Làm mới trang cảm ơn nhiều lần 3) Kiểm tra hộp thư | - Chỉ nhận 1 email xác nhận cho 1 đơn  - Không có email trùng lặp khi refresh/callback lặp |  |  |  |
| EMAIL-06 | Hiển thị đa thiết bị/không lỗi hình ảnh | 1) Mở email trên desktop và mobile 2) Kiểm tra hình ảnh/logo/liên kết | - Bản HTML hiển thị tốt, responsive  - Có bản text thuần (nếu hỗ trợ)  - Hình ảnh tải được, không link hỏng  - Không vào thư rác (nếu có DKIM/SPF) |  |  |  |
| EMAIL-07 | Ngôn ngữ/định dạng tiền tệ | 1) Đặt ngôn ngữ site/currency khác 2) Đặt hàng 3) Kiểm tra email | - Ngôn ngữ email khớp lựa chọn người dùng  - Tiền tệ/định dạng số đúng (ký hiệu, phân cách) |  |  |  |