Đặc tả Test Case (Test Case Specification) Website Thương mại Điện tử — Công ty Máy tính TechVN Thông tin tài liệu Mã tài liệu TCS-TECHVN-ECOM-2026-001 Phiên bản 1.0 Ngày tạo 10/05/2026 Ngày cập nhật 10/05/2026 Tác giả Lê Thị Hồng — Senior QA Engineer Đồng tác giả Nguyễn Đức Minh — QA Engineer Người phê duyệt Võ Thanh Tùng — QA Lead Trạng thái Đã phê duyệt (Approved) Mức độ bảo mật Nội bộ (Internal) Test Plan tham chiếu TP-TECHVN-ECOM-2026-001 v1.0 UCS tham chiếu UCS-TECHVN-ECOM-2026-001 v1.0 SRS tham chiếu SRS-TECHVN-ECOM-2026-001 v1.0
Lịch sử thay đổi Phiên bản Ngày Người thay đổi Mô tả 0.1 02/05/2026 Lê Thị Hồng Khởi tạo, test case PKG-01 0.3 04/05/2026 Nguyễn Đức Minh Bổ sung test case PKG-02, PKG-03 0.6 07/05/2026 Lê Thị Hồng Bổ sung PKG-04→06, test case phi chức năng 0.9 09/05/2026 Nguyễn Đức Minh Review chéo, chỉnh sửa theo feedback 1.0 10/05/2026 Võ Thanh Tùng Phê duyệt chính thức
Mục lục Giới thiệu Quy ước và định dạng Test Suite: Quản lý tài khoản (TS-01) Test Suite: Catalog sản phẩm (TS-02) Test Suite: Mua hàng (TS-03) Test Suite: Sau mua hàng (TS-04) Test Suite: Khuyến mãi & Thông báo (TS-05) Test Suite: Quản trị hệ thống (TS-06) Test Suite: Phi chức năng (TS-07) Ma trận truy vết Test Case Thống kê tổng hợp 1. Giới thiệu 1.1 Mục đích Tài liệu này đặc tả chi tiết các Test Case cho hệ thống Website TMĐT TechVN. Mỗi Test Case bao gồm tiền điều kiện, bước thực hiện, dữ liệu test, kết quả mong đợi và mức ưu tiên — phục vụ làm cơ sở cho hoạt động kiểm thử chức năng và phi chức năng.
1.2 Phạm vi Tài liệu bao phủ:
158 Test Case chức năng cho 23 Use Case thuộc 6 gói nghiệp vụ (PKG-01 → PKG-06).24 Test Case phi chức năng cho hiệu năng, bảo mật, khả năng tương thích và khả năng tiếp cận.Tổng cộng: 182 Test Case .1.3 Đối tượng sử dụng Đối tượng Mục đích QA Team Thực hiện kiểm thử theo từng test case Developer Tham khảo khi viết unit/integration test QA Lead Review, assign test case, theo dõi coverage Product Owner Xác nhận tiêu chí chấp nhận
1.4 Tài liệu tham chiếu Mã Tên tài liệu TP-TECHVN-ECOM-2026-001 Kế hoạch Kiểm thử (Test Plan) UCS-TECHVN-ECOM-2026-001 Đặc tả Use Case SRS-TECHVN-ECOM-2026-001 Đặc tả Yêu cầu Phần mềm US-TECHVN-ECOM-2026-001 User Stories & Acceptance Criteria IEEE 829-2008 Standard for Software Test Documentation
2. Quy ước và định dạng 2.1 Mã định danh Test Case TC-[Module]-[Số thứ tự]
Ví dụ: TC-ACC-001 = Test Case #001 của module Account Bảng viết tắt module:
Viết tắt Module Gói ACC Account (Tài khoản) PKG-01 CAT Catalog (Sản phẩm) PKG-02 CRT Cart (Giỏ hàng) PKG-03 CHK Checkout (Đặt hàng) PKG-03 PAY Payment (Thanh toán) PKG-03 ORD Order (Đơn hàng) PKG-04 REV Review (Đánh giá) PKG-04 PRM Promotion (Khuyến mãi) PKG-05 NTF Notification (Thông báo) PKG-05 ADM Admin (Quản trị) PKG-06 NFR Non-Functional (Phi chức năng) —
2.2 Mức ưu tiên Mức Ý nghĩa Yêu cầu P1 — Critical Luồng chính, ảnh hưởng doanh thu Phải pass trước mỗi release P2 — High Luồng thay thế quan trọng Phải pass trước Go-live P3 — Medium Edge case, UX Nên pass, có thể defer nếu có workaround P4 — Low Nice-to-have, cosmetic Pass khi có thời gian
2.3 Trạng thái thực thi Trạng thái Ý nghĩa Not Run Chưa thực hiện Pass Kết quả đúng như mong đợi Fail Kết quả khác với mong đợi Blocked Không thể thực hiện do phụ thuộc Skipped Bỏ qua có chủ đích (ghi lý do) N/A Không áp dụng cho release hiện tại
2.4 Định dạng dữ liệu test Dữ liệu hợp lệ: ✅ valid_value
Dữ liệu không hợp lệ: ❌ invalid_value
Giá trị biên: 🔲 boundary_value
Giá trị rỗng/null: ⬜ empty/null 3. Test Suite: Quản lý tài khoản (TS-01) Use Case liên quan: UC-01 → UC-06 Tổng test case: 35 Release: R1 — MVP
3.1 UC-01: Đăng ký tài khoản TC-ACC-001: Đăng ký thành công bằng email Thuộc tính Chi tiết Mã TC-ACC-001 Tiêu đề Đăng ký tài khoản thành công bằng email và mật khẩu hợp lệ Mức ưu tiên P1 — Critical Use Case UC-01 — Luồng chính SRS Ref FR-ACC-01 Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện 1. Người dùng chưa có tài khoản 2. Trang đăng ký đã tải thành công
Dữ liệu test:
Trường Giá trị Họ tên Nguyễn Văn Test Email [email protected] Số điện thoại 0901234567 Mật khẩu P@ssw0rd2026! Xác nhận mật khẩu P@ssw0rd2026!
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập techvn.vn/dang-ky Hiển thị form đăng ký với các trường: Họ tên, Email, SĐT, Mật khẩu, Xác nhận mật khẩu 2 Nhập đầy đủ thông tin hợp lệ (xem bảng dữ liệu) Không có cảnh báo lỗi validation 3 Tick checkbox "Tôi đồng ý với Điều khoản sử dụng" Checkbox được chọn 4 Click nút "Đăng ký" Loading indicator hiển thị, hệ thống gửi OTP qua SMS 5 Nhập mã OTP hợp lệ (6 số) Màn hình chuyển sang trang thông báo đăng ký thành công 6 Kiểm tra email Nhận được email chào mừng từ TechVN 7 Đăng nhập với tài khoản vừa tạo Đăng nhập thành công, chuyển về trang chủ
Hậu điều kiện: Tài khoản mới được tạo trong DB với trạng thái ACTIVE.
TC-ACC-002: Đăng ký thất bại — Email đã tồn tại Thuộc tính Chi tiết Mã TC-ACC-002 Tiêu đề Hệ thống từ chối đăng ký khi email đã được sử dụng Mức ưu tiên P1 — Critical Use Case UC-01 — Luồng ngoại lệ E1 SRS Ref FR-ACC-01 Loại Functional — Negative Tự động hóa Playwright Tiền điều kiện Email [email protected] đã có trong hệ thống
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập trang đăng ký Form đăng ký hiển thị 2 Nhập email [email protected] và các trường khác hợp lệ — 3 Click "Đăng ký" Hiển thị thông báo lỗi: "Email đã được sử dụng. Vui lòng đăng nhập hoặc sử dụng email khác." 4 Kiểm tra link "đăng nhập" trong thông báo Link dẫn đến /dang-nhap với email pre-fill
TC-ACC-003: Đăng ký thất bại — Validation mật khẩu yếu Thuộc tính Chi tiết Mã TC-ACC-003 Tiêu đề Hệ thống từ chối mật khẩu không đáp ứng yêu cầu bảo mật Mức ưu tiên P1 — Critical Use Case UC-01 — Luồng ngoại lệ E2 Loại Functional — Negative Tự động hóa Playwright
Dữ liệu test (Decision Table):
# Mật khẩu Độ dài Chữ hoa Chữ thường Số Ký tự đặc biệt Kết quả 1 ❌ abc 3 ✗ ✓ ✗ ✗ Fail — "Mật khẩu tối thiểu 8 ký tự" 2 ❌ abcdefgh 8 ✗ ✓ ✗ ✗ Fail — "Cần có chữ hoa, số và ký tự đặc biệt" 3 ❌ ABCDEFGH 8 ✓ ✗ ✗ ✗ Fail — "Cần có chữ thường, số và ký tự đặc biệt" 4 ❌ Abcdefg1 8 ✓ ✓ ✓ ✗ Fail — "Cần có ký tự đặc biệt" 5 ❌ 12345678 8 ✗ ✗ ✓ ✗ Fail — "Cần có chữ hoa, chữ thường và ký tự đặc biệt" 6 ✅ P@ssw0rd! 9 ✓ ✓ ✓ ✓ Pass 7 🔲 P@ssw0r 7 ✓ ✓ ✓ ✓ Fail — biên dưới: "Mật khẩu tối thiểu 8 ký tự" 8 🔲 P@ssw0rd 8 ✓ ✓ ✓ ✓ Pass — biên dưới hợp lệ
TC-ACC-004: Đăng ký thất bại — SĐT không hợp lệ Thuộc tính Chi tiết Mã TC-ACC-004 Tiêu đề Hệ thống validate định dạng số điện thoại Việt Nam Mức ưu tiên P2 — High Use Case UC-01 — Luồng ngoại lệ E3 Loại Functional — Negative Tự động hóa Playwright
Dữ liệu test:
# SĐT Kết quả Lý do 1 ❌ 012345678 Fail Đầu số không hợp lệ 2 ❌ 090123456 Fail Thiếu 1 số (9 ký tự) 3 ❌ 09012345678 Fail Thừa 1 số (11 ký tự) 4 ❌ abcdefghij Fail Chứa ký tự không phải số 5 ❌ +8490123456 Fail Thiếu 1 số (format quốc tế) 6 ✅ 0901234567 Pass Đầu số 090, 10 ký tự 7 ✅ 0389876543 Pass Đầu số 038, 10 ký tự 8 ✅ +84901234567 Pass Format quốc tế hợp lệ
TC-ACC-005: Đăng ký — OTP hết hạn Thuộc tính Chi tiết Mã TC-ACC-005 Tiêu đề OTP hết hạn sau 5 phút, cho phép gửi lại Mức ưu tiên P2 — High Use Case UC-02 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright + mock timer
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Thực hiện đăng ký hợp lệ, nhận OTP Hiển thị màn hình nhập OTP, đếm ngược 5:00 2 Đợi hết 5 phút (hoặc mock timer) Timer hiển thị 0:00, nút "Gửi lại OTP" xuất hiện 3 Nhập OTP cũ Thông báo lỗi: "Mã OTP đã hết hạn. Vui lòng yêu cầu mã mới." 4 Click "Gửi lại OTP" OTP mới được gửi, timer reset về 5:00 5 Nhập OTP mới hợp lệ Đăng ký thành công
TC-ACC-006: Đăng ký — OTP sai 5 lần liên tiếp Thuộc tính Chi tiết Mã TC-ACC-006 Tiêu đề Khóa tạm thời sau 5 lần nhập OTP sai Mức ưu tiên P2 — High Use Case UC-02 — Luồng ngoại lệ Loại Functional — Security Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Thực hiện đăng ký, nhận OTP Hiển thị màn hình nhập OTP 2 Nhập OTP sai lần 1–4 Thông báo "Mã OTP không đúng. Còn X lần thử." 3 Nhập OTP sai lần 5 Thông báo: "Bạn đã nhập sai quá nhiều lần. Vui lòng thử lại sau 15 phút." 4 Thử nhập OTP tiếp Input bị disable, không cho nhập 5 Sau 15 phút, thử lại Cho phép yêu cầu OTP mới
TC-ACC-007: Đăng ký — Xác nhận mật khẩu không khớp Thuộc tính Chi tiết Mã TC-ACC-007 Tiêu đề Từ chối khi xác nhận mật khẩu không khớp với mật khẩu Mức ưu tiên P1 — Critical Use Case UC-01 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Nhập mật khẩu: P@ssw0rd2026! — 2 Nhập xác nhận mật khẩu: P@ssw0rd2026 Inline error: "Mật khẩu xác nhận không khớp" 3 Nút "Đăng ký" Nút bị disable hoặc click không submit
3.2 UC-03: Đăng nhập TC-ACC-008: Đăng nhập thành công bằng email Thuộc tính Chi tiết Mã TC-ACC-008 Tiêu đề Đăng nhập thành công với email và mật khẩu đúng Mức ưu tiên P1 — Critical Use Case UC-03 — Luồng chính SRS Ref FR-ACC-02 Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện Tài khoản [email protected] / P@ssw0rd2026! đã tồn tại và ACTIVE
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập techvn.vn/dang-nhap Hiển thị form đăng nhập 2 Nhập email và mật khẩu hợp lệ — 3 Click "Đăng nhập" Chuyển về trang chủ, header hiển thị "Xin chào, [Tên]" 4 Kiểm tra localStorage/cookie Có accessToken (JWT) và refreshToken 5 Reload trang Vẫn giữ trạng thái đăng nhập
TC-ACC-009: Đăng nhập thất bại — Sai mật khẩu Thuộc tính Chi tiết Mã TC-ACC-009 Tiêu đề Từ chối đăng nhập khi mật khẩu không đúng Mức ưu tiên P1 — Critical Use Case UC-03 — Luồng ngoại lệ E1 Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Nhập email hợp lệ + mật khẩu sai — 2 Click "Đăng nhập" Thông báo: "Email hoặc mật khẩu không đúng" (không tiết lộ email có tồn tại hay không) 3 Kiểm tra response time Thời gian phản hồi giống trường hợp email không tồn tại (chống timing attack)
TC-ACC-010: Đăng nhập — Khóa tài khoản sau 5 lần sai Thuộc tính Chi tiết Mã TC-ACC-010 Tiêu đề Khóa tạm tài khoản sau 5 lần đăng nhập sai liên tiếp Mức ưu tiên P1 — Critical Use Case UC-03 — Luồng ngoại lệ E2 Loại Functional — Security Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Đăng nhập sai mật khẩu lần 1–4 "Email hoặc mật khẩu không đúng. Còn X lần thử." 2 Đăng nhập sai lần 5 "Tài khoản đã bị khóa tạm thời 30 phút." 3 Đăng nhập đúng mật khẩu trong 30 phút Vẫn bị từ chối: "Tài khoản đang bị khóa." 4 Sau 30 phút, đăng nhập đúng Đăng nhập thành công, bộ đếm reset
TC-ACC-011: Đăng nhập bằng Google OAuth Thuộc tính Chi tiết Mã TC-ACC-011 Tiêu đề Đăng nhập/Đăng ký tự động qua Google OAuth 2.0 Mức ưu tiên P1 — Critical Use Case UC-04 — Luồng chính SRS Ref FR-ACC-02 Loại Functional — Integration Tự động hóa Semi-auto (manual Google consent)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Click "Đăng nhập với Google" Redirect tới Google consent screen 2 Chọn tài khoản Google hợp lệ Google redirect về callback URL 3 — (Hệ thống xử lý) Nếu email chưa tồn tại → Tự động tạo tài khoản + đăng nhập Nếu email đã tồn tại → Link account + đăng nhập 4 Kiểm tra trang chủ Hiển thị avatar Google, tên tài khoản Google 5 Kiểm tra profile Họ tên, email, avatar được pre-fill từ Google
TC-ACC-012: Đăng nhập bằng Facebook OAuth Thuộc tính Chi tiết Mã TC-ACC-012 Tiêu đề Đăng nhập/Đăng ký qua Facebook OAuth Mức ưu tiên P2 — High Use Case UC-04 — Luồng thay thế Loại Functional — Integration Tự động hóa Semi-auto
Bước thực hiện: Tương tự TC-ACC-011 với provider Facebook. Kiểm tra thêm: xử lý trường hợp user không cho phép share email → yêu cầu nhập email thủ công.
TC-ACC-013: Đăng nhập — Email chưa đăng ký Thuộc tính Chi tiết Mã TC-ACC-013 Tiêu đề Từ chối đăng nhập khi email không tồn tại trong hệ thống Mức ưu tiên P1 — Critical Use Case UC-03 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Nhập email [email protected] + mật khẩu bất kỳ — 2 Click "Đăng nhập" Thông báo: "Email hoặc mật khẩu không đúng" (cùng message với sai MK)
3.3 UC-05: Khôi phục mật khẩu TC-ACC-014: Khôi phục mật khẩu thành công Thuộc tính Chi tiết Mã TC-ACC-014 Tiêu đề Đặt lại mật khẩu qua link email thành công Mức ưu tiên P1 — Critical Use Case UC-05 — Luồng chính SRS Ref FR-ACC-03 Loại Functional — Positive Tự động hóa Playwright + mail interceptor
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /quen-mat-khau Hiển thị form nhập email 2 Nhập email đã đăng ký — 3 Click "Gửi link đặt lại" Thông báo: "Đã gửi link đặt lại mật khẩu tới email của bạn" 4 Mở email, click link reset Chuyển đến trang đặt mật khẩu mới 5 Nhập mật khẩu mới hợp lệ + xác nhận — 6 Click "Đặt lại mật khẩu" Thông báo thành công, redirect về trang đăng nhập 7 Đăng nhập với mật khẩu mới Đăng nhập thành công 8 Đăng nhập với mật khẩu cũ Đăng nhập thất bại
TC-ACC-015: Khôi phục — Link reset hết hạn Thuộc tính Chi tiết Mã TC-ACC-015 Tiêu đề Link reset password hết hạn sau 30 phút Mức ưu tiên P2 — High Use Case UC-05 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright + mock timer
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Yêu cầu reset password Nhận email với link 2 Đợi > 30 phút, click link Trang thông báo: "Link đã hết hạn. Vui lòng yêu cầu lại." với nút quay lại
TC-ACC-016: Khôi phục — Link reset chỉ dùng 1 lần Thuộc tính Chi tiết Mã TC-ACC-016 Tiêu đề Link reset password bị vô hiệu hóa sau khi sử dụng Mức ưu tiên P2 — High Use Case UC-05 — Luồng ngoại lệ Loại Functional — Security Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Thực hiện reset thành công Mật khẩu đã đổi 2 Mở lại link cũ "Link không hợp lệ hoặc đã được sử dụng."
3.4 UC-06: Quản lý hồ sơ cá nhân TC-ACC-017: Cập nhật thông tin cá nhân thành công Thuộc tính Chi tiết Mã TC-ACC-017 Tiêu đề Cập nhật họ tên, SĐT, ngày sinh, avatar thành công Mức ưu tiên P2 — High Use Case UC-06 — Luồng chính Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện Đã đăng nhập
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /tai-khoan/ho-so Hiển thị form với thông tin hiện tại 2 Thay đổi họ tên thành "Nguyễn Văn Updated" — 3 Upload avatar (JPG, < 5MB) Preview ảnh mới 4 Click "Lưu thay đổi" Toast: "Cập nhật thành công", header hiển thị tên mới
TC-ACC-018: Thêm/Sửa địa chỉ giao hàng Thuộc tính Chi tiết Mã TC-ACC-018 Tiêu đề Quản lý danh sách địa chỉ giao hàng (CRUD) Mức ưu tiên P2 — High Use Case UC-06 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /tai-khoan/dia-chi Hiển thị danh sách địa chỉ (hoặc trống) 2 Click "Thêm địa chỉ mới" Hiển thị form: Tên người nhận, SĐT, Tỉnh/Thành, Quận/Huyện, Phường/Xã, Địa chỉ chi tiết 3 Chọn Tỉnh/Thành: "TP. Hồ Chí Minh" Load danh sách Quận/Huyện tương ứng 4 Điền đầy đủ, tick "Đặt làm mặc định" — 5 Click "Lưu" Địa chỉ mới xuất hiện trong danh sách, badge "Mặc định" hiển thị 6 Click "Sửa" trên địa chỉ Form pre-fill với data cũ, cho phép chỉnh sửa 7 Click "Xóa" trên địa chỉ không mặc định Confirm dialog → xóa thành công
TC-ACC-019: Đổi mật khẩu Thuộc tính Chi tiết Mã TC-ACC-019 Tiêu đề Đổi mật khẩu thành công khi nhập đúng mật khẩu cũ Mức ưu tiên P2 — High Use Case UC-06 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /tai-khoan/doi-mat-khau Form: Mật khẩu cũ, Mật khẩu mới, Xác nhận MK mới 2 Nhập mật khẩu cũ đúng + mật khẩu mới hợp lệ — 3 Click "Đổi mật khẩu" Toast thành công, tất cả session khác bị logout 4 Đăng nhập bằng MK mới Thành công 5 Đăng nhập bằng MK cũ Thất bại
4. Test Suite: Catalog sản phẩm (TS-02) Use Case liên quan: UC-07 → UC-11 Tổng test case: 28 Release: R1 (UC-07, UC-08), R3 (UC-09 → UC-11)
4.1 UC-07: Duyệt sản phẩm theo danh mục TC-CAT-001: Hiển thị danh mục sản phẩm đúng Thuộc tính Chi tiết Mã TC-CAT-001 Tiêu đề Hiển thị đúng cây danh mục sản phẩm đa cấp Mức ưu tiên P1 — Critical Use Case UC-07 — Luồng chính SRS Ref FR-PRD-01 Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập trang chủ Mega menu hiển thị danh mục cấp 1 (Laptop, PC, Linh kiện, Phụ kiện, ...) 2 Hover vào "Laptop" Hiển thị danh mục cấp 2: Laptop Gaming, Laptop Văn phòng, Laptop Đồ họa, ... 3 Click "Laptop Gaming" Chuyển đến /danh-muc/laptop-gaming, hiển thị grid sản phẩm 4 Kiểm tra breadcrumb "Trang chủ > Laptop > Laptop Gaming" 5 Kiểm tra product card Mỗi card hiển thị: Ảnh, Tên SP, Giá gốc, Giá sale (nếu có), Badge (Mới/Giảm giá), Rating
TC-CAT-002: Phân trang danh sách sản phẩm Thuộc tính Chi tiết Mã TC-CAT-002 Tiêu đề Phân trang hoạt động đúng khi danh mục có nhiều sản phẩm Mức ưu tiên P2 — High Use Case UC-07 — Luồng chính Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện Danh mục "Laptop" có > 24 sản phẩm (default page size = 24)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập danh mục "Laptop" Hiển thị 24 sản phẩm, pagination controls ở cuối 2 Click trang 2 URL cập nhật ?page=2, load 24 SP tiếp theo, scroll lên đầu 3 Click "Trang cuối" Hiển thị SP còn lại (≤ 24), nút "Tiếp" bị disable 4 Thay đổi "Hiển thị" từ 24 → 48 Load lại với 48 SP/trang, reset về trang 1
TC-CAT-003: Sắp xếp sản phẩm Thuộc tính Chi tiết Mã TC-CAT-003 Tiêu đề Sắp xếp danh sách sản phẩm theo các tiêu chí Mức ưu tiên P2 — High Use Case UC-07 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test:
# Sắp xếp theo Kết quả mong đợi 1 Giá: Thấp → Cao SP đầu tiên có giá thấp nhất 2 Giá: Cao → Thấp SP đầu tiên có giá cao nhất 3 Mới nhất SP đầu tiên có ngày tạo gần nhất 4 Bán chạy SP đầu tiên có số lượng đã bán cao nhất 5 Đánh giá cao nhất SP đầu tiên có rating trung bình cao nhất 6 Giảm giá nhiều nhất SP đầu tiên có % giảm giá cao nhất
4.2 UC-08: Xem chi tiết sản phẩm TC-CAT-004: Hiển thị đầy đủ thông tin sản phẩm Thuộc tính Chi tiết Mã TC-CAT-004 Tiêu đề Trang chi tiết sản phẩm hiển thị đầy đủ thông tin Mức ưu tiên P1 — Critical Use Case UC-08 — Luồng chính SRS Ref FR-PRD-02 Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Click vào một sản phẩm từ danh mục Trang chi tiết SP tải thành công 2 Kiểm tra Gallery ảnh Ảnh chính lớn + thumbnail bên dưới, click thumbnail → đổi ảnh chính, zoom hover 3 Kiểm tra Thông tin cơ bản Tên SP, mã SKU, thương hiệu, rating (sao + số lượng đánh giá), trạng thái kho 4 Kiểm tra Giá Giá gốc (gạch ngang nếu có sale), Giá sale, % giảm, Tiết kiệm X VNĐ 5 Kiểm tra Thông số kỹ thuật Bảng spec đầy đủ: CPU, RAM, SSD, GPU, Màn hình, Pin, OS, ... 6 Kiểm tra Mô tả chi tiết HTML content với hình ảnh, format đúng 7 Kiểm tra "Sản phẩm tương tự" Hiển thị ≥ 4 SP cùng danh mục 8 Kiểm tra "Sản phẩm đã xem" Hiển thị SP đã xem trước đó
TC-CAT-005: Chọn biến thể sản phẩm Thuộc tính Chi tiết Mã TC-CAT-005 Tiêu đề Chọn biến thể (cấu hình) sản phẩm cập nhật giá và tồn kho Mức ưu tiên P1 — Critical Use Case UC-08 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện SP có nhiều biến thể (VD: Laptop có 3 cấu hình RAM/SSD)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Xem SP có biến thể Hiển thị các tùy chọn (VD: RAM 8GB/16GB/32GB, SSD 256/512/1TB) 2 Chọn biến thể "16GB RAM / 512GB SSD" Giá cập nhật, SKU cập nhật, tồn kho cập nhật 3 Chọn biến thể hết hàng Nút "Thêm vào giỏ" đổi thành "Hết hàng", disable
TC-CAT-006: Sản phẩm hết hàng Thuộc tính Chi tiết Mã TC-CAT-006 Tiêu đề Hiển thị đúng trạng thái khi sản phẩm hết hàng Mức ưu tiên P2 — High Use Case UC-08 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Xem SP có tồn kho = 0 Badge "Hết hàng" hiển thị, nút "Thêm vào giỏ" bị disable 2 Kiểm tra nút "Thông báo khi có hàng" Hiển thị form nhập email/SĐT để đăng ký nhận thông báo 3 Đăng ký nhận thông báo Toast: "Bạn sẽ nhận thông báo khi sản phẩm có hàng trở lại"
4.3 UC-09: Tìm kiếm sản phẩm TC-CAT-007: Tìm kiếm theo từ khóa thành công Thuộc tính Chi tiết Mã TC-CAT-007 Tiêu đề Tìm kiếm sản phẩm bằng từ khóa trả về kết quả chính xác Mức ưu tiên P1 — Critical Use Case UC-09 — Luồng chính SRS Ref FR-PRD-03 Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test & kết quả mong đợi:
# Từ khóa Mong đợi 1 ✅ "Laptop gaming" Trả về danh sách laptop gaming, highlight từ khóa 2 ✅ "RTX 4060" Trả về SP có GPU RTX 4060 3 ✅ "laptop dưới 20 triệu" Trả về laptop có giá < 20,000,000 VNĐ (nếu hỗ trợ NLP) 4 ✅ "lap top gam ing" (typo) Fuzzy search trả về kết quả "Laptop Gaming" 5 ❌ "xyzabc123" Trang: "Không tìm thấy sản phẩm. Gợi ý: ..."
TC-CAT-008: Autocomplete / Gợi ý tìm kiếm Thuộc tính Chi tiết Mã TC-CAT-008 Tiêu đề Gợi ý tìm kiếm hiển thị khi gõ >= 2 ký tự Mức ưu tiên P2 — High Use Case UC-09 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Gõ "la" trong ô tìm kiếm Dropdown gợi ý xuất hiện: "Laptop", "Laptop Gaming", "Laptop Văn phòng" 2 Gõ tiếp "lap ga" Gợi ý thu hẹp: "Laptop Gaming" 3 Click vào gợi ý Chuyển đến trang kết quả hoặc trang SP 4 Kiểm tra latency Gợi ý xuất hiện < 300ms sau khi ngừng gõ (debounce)
4.4 UC-10: Lọc sản phẩm nâng cao TC-CAT-009: Lọc theo khoảng giá Thuộc tính Chi tiết Mã TC-CAT-009 Tiêu đề Lọc sản phẩm theo khoảng giá hoạt động chính xác Mức ưu tiên P2 — High Use Case UC-10 — Luồng chính SRS Ref FR-PRD-04 Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test:
# Giá từ Giá đến Kết quả mong đợi 1 10,000,000 20,000,000 Chỉ SP có giá 10tr – 20tr 2 0 5,000,000 SP dưới 5tr 3 50,000,000 100,000,000 SP cao cấp hoặc "Không có SP" 4 20,000,000 10,000,000 Tự swap hoặc báo lỗi "Giá từ phải nhỏ hơn giá đến"
TC-CAT-010: Lọc kết hợp nhiều tiêu chí Thuộc tính Chi tiết Mã TC-CAT-010 Tiêu đề Kết hợp nhiều bộ lọc đồng thời Mức ưu tiên P2 — High Use Case UC-10 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Chọn danh mục: Laptop Gaming Filter panel hiển thị 2 Chọn Thương hiệu: ASUS, MSI Danh sách cập nhật (AND giữa group, OR trong group) 3 Chọn Giá: 15tr – 30tr Kết quả thu hẹp 4 Chọn RAM: 16GB Kết quả thu hẹp tiếp 5 Kiểm tra số lượng kết quả Badge hiển thị "X sản phẩm" phù hợp 6 Kiểm tra "Active filters" Tags hiển thị: "ASUS", "MSI", "15tr-30tr", "16GB" 7 Click "X" trên tag "MSI" Bỏ filter MSI, kết quả cập nhật 8 Click "Xóa tất cả bộ lọc" Trở về danh sách đầy đủ
4.5 UC-11: So sánh sản phẩm TC-CAT-011: So sánh 2-4 sản phẩm Thuộc tính Chi tiết Mã TC-CAT-011 Tiêu đề So sánh chi tiết thông số kỹ thuật giữa 2-4 sản phẩm Mức ưu tiên P3 — Medium Use Case UC-11 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Tick "So sánh" trên 2 SP Thanh so sánh xuất hiện ở footer: "Đã chọn 2 SP — So sánh ngay" 2 Tick thêm SP thứ 3 Counter cập nhật: "3 SP" 3 Click "So sánh ngay" Chuyển đến trang so sánh, bảng so sánh hiển thị song song 4 Kiểm tra bảng so sánh Các spec khác nhau được highlight (bold/color) 5 Tick thêm SP thứ 5 Toast: "Tối đa 4 sản phẩm" 6 Click "Xóa" trên 1 SP trong bảng SP bị loại bỏ, bảng co lại
5. Test Suite: Mua hàng (TS-03) Use Case liên quan: UC-12 → UC-17 Tổng test case: 38 Release: R1 (UC-12, UC-14 COD), R2 (UC-15→17)
5.1 UC-12: Quản lý giỏ hàng TC-CRT-001: Thêm sản phẩm vào giỏ hàng Thuộc tính Chi tiết Mã TC-CRT-001 Tiêu đề Thêm sản phẩm vào giỏ hàng thành công Mức ưu tiên P1 — Critical Use Case UC-12 — Luồng chính SRS Ref FR-ORD-01 Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Xem chi tiết SP có tồn kho > 0 Nút "Thêm vào giỏ" active 2 Chọn số lượng = 2 Input hiển thị 2 3 Click "Thêm vào giỏ" Toast: "Đã thêm [Tên SP] vào giỏ hàng", icon giỏ hàng cập nhật số lượng 4 Mở mini-cart (hover/click icon giỏ) Hiển thị SP vừa thêm: ảnh, tên, biến thể, SL, giá, tổng 5 Truy cập /gio-hang SP hiển thị trong giỏ với thông tin đúng
TC-CRT-002: Cập nhật số lượng trong giỏ hàng Thuộc tính Chi tiết Mã TC-CRT-002 Tiêu đề Thay đổi số lượng sản phẩm trong giỏ hàng Mức ưu tiên P1 — Critical Use Case UC-12 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test (SP có tồn kho = 10):
# SL cũ Hành động SL mới Kết quả 1 1 Click "+" 2 Tổng tiền cập nhật = giá × 2 2 2 Click "-" 1 Tổng tiền cập nhật = giá × 1 3 1 Click "-" — Confirm dialog: "Bạn muốn xóa SP này?" 4 1 Nhập trực tiếp "5" 5 Tổng tiền cập nhật 5 5 Nhập "15" (> tồn kho) 10 Toast: "Chỉ còn 10 SP. Đã điều chỉnh số lượng." 6 1 Nhập "0" — Confirm dialog: "Bạn muốn xóa SP này?" 7 1 Nhập "-1" 1 Không cho nhập số âm
TC-CRT-003: Xóa sản phẩm khỏi giỏ hàng Thuộc tính Chi tiết Mã TC-CRT-003 Tiêu đề Xóa sản phẩm khỏi giỏ hàng Mức ưu tiên P1 — Critical Use Case UC-12 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Giỏ hàng có 3 SP Hiển thị 3 items 2 Click icon "Xóa" trên SP thứ 2 Confirm: "Bạn muốn xóa [Tên SP] khỏi giỏ hàng?" 3 Click "Xác nhận" SP biến mất, tổng tiền cập nhật, badge giỏ hàng -1 4 Xóa hết tất cả SP Hiển thị empty state: "Giỏ hàng trống" + nút "Tiếp tục mua sắm"
TC-CRT-004: Merge giỏ hàng Guest → Member Thuộc tính Chi tiết Mã TC-CRT-004 Tiêu đề Merge giỏ hàng khi guest đăng nhập Mức ưu tiên P2 — High Use Case UC-12 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Không đăng nhập, thêm SP-A (SL=1) vào giỏ Guest cart: SP-A × 1 2 Đăng nhập (account có giỏ cũ: SP-B × 2) — 3 Kiểm tra giỏ hàng Merge: SP-A × 1, SP-B × 2 4 Trường hợp cả 2 giỏ có cùng SP-C Guest: SP-C × 1, Member: SP-C × 3 → Kết quả: SP-C × 4 (cộng dồn, max = tồn kho)
5.2 UC-14: Đặt hàng (Checkout) TC-CHK-001: Checkout COD thành công — Luồng chính Thuộc tính Chi tiết Mã TC-CHK-001 Tiêu đề Đặt hàng thành công với thanh toán COD Mức ưu tiên P1 — Critical Use Case UC-14 — Luồng chính SRS Ref FR-ORD-02 Loại Functional — E2E — Positive Tự động hóa Playwright Tiền điều kiện 1. Đã đăng nhập 2. Giỏ hàng có >= 1 SP 3. Có ít nhất 1 địa chỉ giao hàng
Bước thực hiện (Quy trình 3 bước):
# Hành động Kết quả mong đợi Bước 1: Thông tin giao hàng 1 Click "Tiến hành đặt hàng" từ giỏ Chuyển đến Step 1: Thông tin giao hàng 2 Chọn địa chỉ có sẵn hoặc nhập mới Địa chỉ được chọn, highlight active 3 Kiểm tra danh sách SP Tóm tắt: Ảnh, Tên, SL, Giá từng SP Bước 2: Phương thức vận chuyển & thanh toán 4 Click "Tiếp tục" Step 2: Hiển thị PTVC khả dụng (GHTK, GHN, Viettel Post) + phí 5 Chọn GHTK — Giao nhanh Phí vận chuyển cập nhật, thời gian dự kiến hiển thị 6 Chọn PTTT: COD Radio button selected Bước 3: Xác nhận đơn hàng 7 Click "Tiếp tục" Step 3: Tóm tắt đơn hàng đầy đủ 8 Kiểm tra chi tiết tóm tắt Địa chỉ, PTVC, PTTT, Danh sách SP, Tạm tính, Phí VC, Giảm giá (nếu có), Tổng cộng 9 Click "Đặt hàng" Loading → Chuyển đến trang "Đặt hàng thành công" 10 Kiểm tra trang thành công Mã đơn hàng, Tổng tiền, Dự kiến giao, Nút "Theo dõi đơn hàng" 11 Kiểm tra email Nhận email xác nhận đơn hàng 12 Kiểm tra giỏ hàng Giỏ hàng đã trống 13 Kiểm tra DB Đơn hàng trạng thái PENDING_CONFIRMATION
TC-CHK-002: Checkout — Validation địa chỉ bắt buộc Thuộc tính Chi tiết Mã TC-CHK-002 Tiêu đề Không cho phép checkout khi thiếu thông tin địa chỉ Mức ưu tiên P1 — Critical Use Case UC-14 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Checkout với tài khoản chưa có địa chỉ Step 1 hiển thị form nhập địa chỉ mới (bắt buộc) 2 Bỏ trống trường "Số điện thoại" Inline error: "Vui lòng nhập số điện thoại" 3 Bỏ trống trường "Tỉnh/Thành phố" Inline error: "Vui lòng chọn Tỉnh/Thành phố" 4 Nút "Tiếp tục" Bị disable hoặc scroll đến trường lỗi đầu tiên
TC-CHK-003: Checkout — SP hết hàng trong quá trình checkout Thuộc tính Chi tiết Mã TC-CHK-003 Tiêu đề Xử lý khi sản phẩm hết hàng giữa chừng checkout Mức ưu tiên P1 — Critical Use Case UC-14 — Luồng ngoại lệ Loại Functional — Negative — Race condition Tự động hóa Playwright + API mock
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Bắt đầu checkout với SP-A (tồn kho = 1) Step 1 hiển thị bình thường 2 (Simulate) Người khác mua SP-A, tồn kho → 0 — 3 Click "Đặt hàng" ở Step 3 Thông báo: "Sản phẩm [Tên] đã hết hàng. Vui lòng cập nhật giỏ hàng." 4 Kiểm tra UX Redirect về giỏ hàng, SP hết hàng được highlight đỏ
TC-CHK-004: Checkout — Áp dụng mã giảm giá Thuộc tính Chi tiết Mã TC-CHK-004 Tiêu đề Áp dụng mã giảm giá trong quá trình checkout Mức ưu tiên P2 — High Use Case UC-13 — Luồng chính SRS Ref FR-PRM-01 Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test:
# Mã Loại Điều kiện Đơn hàng Kết quả 1 ✅ GIAM10 Giảm 10% Đơn ≥ 5tr Đơn 10tr Giảm 1tr, tổng = 9tr 2 ✅ GIAM500K Giảm 500K Không ĐK Đơn 3tr Giảm 500K, tổng = 2.5tr 3 ❌ GIAM10 Giảm 10% Đơn ≥ 5tr Đơn 3tr Lỗi: "Đơn hàng chưa đạt giá trị tối thiểu 5,000,000₫" 4 ❌ EXPIRED Đã hết hạn — — Lỗi: "Mã giảm giá đã hết hạn" 5 ❌ USED Đã dùng 1 lần/user — Lỗi: "Mã giảm giá đã được sử dụng" 6 ❌ ABCXYZ Không tồn tại — — Lỗi: "Mã giảm giá không hợp lệ"
5.3 UC-15: Thanh toán trực tuyến TC-PAY-001: Thanh toán VNPAY thành công Thuộc tính Chi tiết Mã TC-PAY-001 Tiêu đề Thanh toán qua VNPAY-QR thành công, đơn hàng xác nhận Mức ưu tiên P1 — Critical Use Case UC-15 — Luồng chính SRS Ref FR-ORD-03 Loại Functional — Integration Tự động hóa Playwright (sandbox) Tiền điều kiện VNPAY sandbox đã cấu hình
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Checkout, chọn PTTT: VNPAY — 2 Click "Đặt hàng" Redirect đến trang VNPAY (sandbox) 3 Chọn ngân hàng, nhập thông tin test — 4 Xác nhận thanh toán trên VNPAY VNPAY callback → redirect về TechVN 5 Kiểm tra trang kết quả "Thanh toán thành công", mã đơn hàng, số tiền 6 Kiểm tra DB Đơn hàng: CONFIRMED, Payment: PAID, transaction_id từ VNPAY
TC-PAY-002: Thanh toán VNPAY thất bại — User hủy Thuộc tính Chi tiết Mã TC-PAY-002 Tiêu đề Xử lý khi user hủy thanh toán trên trang VNPAY Mức ưu tiên P1 — Critical Use Case UC-15 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright (sandbox)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Redirect đến VNPAY Trang thanh toán VNPAY hiển thị 2 Click "Hủy" hoặc back browser Redirect về TechVN 3 Kiểm tra trang kết quả "Thanh toán chưa hoàn tất. Đơn hàng đang chờ thanh toán." 4 Kiểm tra DB Đơn hàng: PENDING_PAYMENT, Payment: PENDING 5 Kiểm tra nút "Thanh toán lại" Cho phép retry thanh toán trong 24 giờ
TC-PAY-003: Thanh toán MoMo thành công Thuộc tính Chi tiết Mã TC-PAY-003 Tiêu đề Thanh toán qua ví MoMo thành công Mức ưu tiên P1 — Critical Use Case UC-15 — Luồng thay thế Loại Functional — Integration Tự động hóa Playwright (sandbox)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Checkout, chọn PTTT: MoMo — 2 Click "Đặt hàng" Redirect đến MoMo payment page 3 Xác nhận thanh toán (sandbox) Callback → redirect về TechVN 4 Kiểm tra kết quả Đơn hàng CONFIRMED, Payment PAID
TC-PAY-004: Thanh toán — Timeout (hết thời gian) Thuộc tính Chi tiết Mã TC-PAY-004 Tiêu đề Xử lý khi thanh toán timeout (15 phút) Mức ưu tiên P2 — High Use Case UC-15 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright + mock timer
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Redirect đến VNPAY, không thao tác — 2 Đợi > 15 phút (mock) VNPAY timeout, callback fail 3 Kiểm tra đơn hàng Trạng thái: PAYMENT_TIMEOUT, cho phép thanh toán lại
5.4 UC-16: Chọn vận chuyển TC-CHK-005: Tính phí vận chuyển theo khu vực Thuộc tính Chi tiết Mã TC-CHK-005 Tiêu đề Phí vận chuyển tính đúng theo khu vực và đơn vị VC Mức ưu tiên P1 — Critical Use Case UC-16 — Luồng chính Loại Functional — Integration Tự động hóa API test (Supertest)
Dữ liệu test:
# Địa chỉ Đơn vị VC Trọng lượng Phí mong đợi (VNĐ) Thời gian 1 Q1, TP.HCM (nội thành) GHTK 2kg 15,000 – 25,000 1–2 ngày 2 Hà Nội (liên tỉnh) GHN 3kg 30,000 – 50,000 3–5 ngày 3 Đà Nẵng Viettel Post 5kg 35,000 – 55,000 2–4 ngày 4 Đơn hàng > 5,000,000 VNĐ — — Miễn phí —
5.5 UC-17: Mua trả góp TC-PAY-005: Đăng ký trả góp thành công Thuộc tính Chi tiết Mã TC-PAY-005 Tiêu đề Đăng ký trả góp qua HD Saison thành công Mức ưu tiên P2 — High Use Case UC-17 — Luồng chính Loại Functional — Integration Tự động hóa Semi-auto (partner sandbox) Tiền điều kiện SP có giá ≥ 3,000,000 VNĐ (điều kiện trả góp)
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Chọn PTTT: "Trả góp qua HD Saison" Hiển thị bảng kỳ hạn: 6/9/12/18/24 tháng 2 Chọn kỳ hạn 12 tháng Hiển thị: Trả trước, Số tiền trả/tháng, Lãi suất, Tổng thanh toán 3 Nhập thông tin: CMND/CCCD, Thu nhập, Nghề nghiệp — 4 Upload ảnh CCCD (mặt trước/sau) Preview ảnh 5 Click "Gửi hồ sơ" "Hồ sơ đã được gửi, kết quả trong 1-2 ngày làm việc" 6 (Simulate) HD Saison duyệt Đơn hàng trạng thái INSTALLMENT_APPROVED, email thông báo
TC-PAY-006: Trả góp — SP không đủ điều kiện Thuộc tính Chi tiết Mã TC-PAY-006 Tiêu đề Không cho trả góp khi đơn hàng dưới mức tối thiểu Mức ưu tiên P2 — High Use Case UC-17 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Checkout với đơn hàng 2,000,000 VNĐ Option "Trả góp" bị disable hoặc ẩn 2 Hover vào option trả góp Tooltip: "Đơn hàng tối thiểu 3,000,000₫ để trả góp"
6. Test Suite: Sau mua hàng (TS-04) Use Case liên quan: UC-18 → UC-21 Tổng test case: 22 Release: R1
6.1 UC-18: Theo dõi đơn hàng TC-ORD-001: Xem lịch sử đơn hàng Thuộc tính Chi tiết Mã TC-ORD-001 Tiêu đề Hiển thị danh sách đơn hàng với bộ lọc trạng thái Mức ưu tiên P1 — Critical Use Case UC-18 — Luồng chính SRS Ref FR-ORD-05 Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /tai-khoan/don-hang Danh sách đơn hàng, mới nhất trước, phân trang 2 Kiểm tra thông tin mỗi đơn Mã ĐH, Ngày đặt, Tổng tiền, Trạng thái (badge màu), Số SP 3 Lọc "Đang giao" Chỉ hiển thị ĐH trạng thái SHIPPING 4 Lọc "Đã hoàn thành" Chỉ hiển thị ĐH trạng thái DELIVERED 5 Click vào 1 đơn hàng Chi tiết đơn hàng hiển thị
TC-ORD-002: Xem chi tiết đơn hàng và tracking Thuộc tính Chi tiết Mã TC-ORD-002 Tiêu đề Chi tiết đơn hàng hiển thị đầy đủ thông tin và timeline Mức ưu tiên P1 — Critical Use Case UC-18 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Mở chi tiết ĐH đang giao — 2 Kiểm tra Thông tin chung Mã ĐH, Ngày đặt, Trạng thái, PTTT, PTVC 3 Kiểm tra Timeline Stepper hiển thị: Đặt hàng → Xác nhận → Đang giao → Đã giao 4 Kiểm tra Danh sách SP Ảnh, Tên, Biến thể, SL, Giá 5 Kiểm tra Tóm tắt Tạm tính, Phí VC, Giảm giá, Tổng cộng 6 Kiểm tra Mã vận đơn Link tracking đến trang ĐVVC
6.2 UC-19: Hủy đơn hàng TC-ORD-003: Hủy đơn hàng thành công Thuộc tính Chi tiết Mã TC-ORD-003 Tiêu đề Hủy đơn hàng thành công khi trạng thái cho phép Mức ưu tiên P1 — Critical Use Case UC-19 — Luồng chính SRS Ref FR-ORD-06 Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test (State Transition Testing):
# Trạng thái hiện tại Cho phép hủy? Kết quả 1 ✅ PENDING_CONFIRMATION Có Hủy ngay, không cần duyệt 2 ✅ CONFIRMED Có Hủy cần chọn lý do 3 ✅ PENDING_PAYMENT Có Hủy ngay 4 ❌ PREPARING Không Nút hủy ẩn, hướng dẫn liên hệ CSKH 5 ❌ SHIPPING Không Nút hủy ẩn 6 ❌ DELIVERED Không Không hủy, chỉ "Yêu cầu hoàn trả"
Bước thực hiện (trạng thái CONFIRMED):
# Hành động Kết quả mong đợi 1 Mở chi tiết ĐH trạng thái CONFIRMED Nút "Hủy đơn hàng" hiển thị 2 Click "Hủy đơn hàng" Modal: Chọn lý do (radio buttons) 3 Chọn "Tìm thấy giá tốt hơn" — 4 Click "Xác nhận hủy" Trạng thái → CANCELLED, toast thành công 5 Kiểm tra tồn kho Số lượng SP hoàn lại kho 6 Kiểm tra email Nhận email xác nhận hủy đơn 7 Nếu đã thanh toán online Tự động tạo yêu cầu hoàn tiền, trạng thái REFUND_PENDING
TC-ORD-004: Hủy đơn — Hoàn tiền tự động Thuộc tính Chi tiết Mã TC-ORD-004 Tiêu đề Hoàn tiền tự động khi hủy đơn đã thanh toán online Mức ưu tiên P1 — Critical Use Case UC-19 — Luồng thay thế Loại Functional — Integration Tự động hóa API test
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Hủy ĐH đã thanh toán VNPAY (1,000,000 VNĐ) Tạo refund request 2 Kiểm tra refund qua VNPAY API Refund request gửi thành công 3 (Simulate) VNPAY callback refund success ĐH: REFUNDED, email thông báo 4 Kiểm tra lịch sử thanh toán Ghi nhận: Thanh toán +1tr, Hoàn tiền -1tr
6.3 UC-20: Đánh giá sản phẩm TC-REV-001: Đánh giá sản phẩm đã mua Thuộc tính Chi tiết Mã TC-REV-001 Tiêu đề Viết đánh giá với rating và ảnh cho SP đã mua Mức ưu tiên P2 — High Use Case UC-20 — Luồng chính SRS Ref FR-REV-01 Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện Đã mua SP và ĐH trạng thái DELIVERED
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Mở trang SP đã mua hoặc chi tiết ĐH Nút "Viết đánh giá" hiển thị 2 Click "Viết đánh giá" Form: Rating (1-5 sao), Tiêu đề, Nội dung, Upload ảnh 3 Chọn 4 sao 4 sao sáng 4 Nhập tiêu đề + nội dung (≥ 20 ký tự) — 5 Upload 3 ảnh (JPG, < 5MB/ảnh) Preview 3 ảnh 6 Click "Gửi đánh giá" Toast: "Đánh giá đã được gửi, đang chờ duyệt" 7 Kiểm tra trạng thái Đánh giá PENDING_APPROVAL 8 (Admin duyệt) Đánh giá hiển thị trên trang SP 9 Thử đánh giá cùng SP lần 2 "Bạn đã đánh giá sản phẩm này" (chỉ cho sửa, không cho tạo mới)
TC-REV-002: Đánh giá — Chưa mua sản phẩm Thuộc tính Chi tiết Mã TC-REV-002 Tiêu đề Không cho phép đánh giá SP chưa mua Mức ưu tiên P2 — High Use Case UC-20 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Đăng nhập, truy cập trang SP chưa mua Không có nút "Viết đánh giá" 2 Kiểm tra section đánh giá Hiển thị "Hãy mua sản phẩm này để được đánh giá"
6.4 UC-21: Yêu cầu hoàn trả TC-ORD-005: Yêu cầu hoàn trả thành công Thuộc tính Chi tiết Mã TC-ORD-005 Tiêu đề Gửi yêu cầu hoàn trả sản phẩm trong thời hạn Mức ưu tiên P2 — High Use Case UC-21 — Luồng chính Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện ĐH trạng thái DELIVERED, trong vòng 7 ngày kể từ ngày nhận
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Mở chi tiết ĐH đã giao (< 7 ngày) Nút "Yêu cầu hoàn trả" hiển thị 2 Click "Yêu cầu hoàn trả" Form: Chọn SP, Lý do (dropdown), Mô tả chi tiết, Upload ảnh/video 3 Chọn SP, lý do "Sản phẩm lỗi" — 4 Upload 2 ảnh chứng minh Preview ảnh 5 Click "Gửi yêu cầu" Toast: "Yêu cầu hoàn trả đã được gửi, nhân viên sẽ xử lý trong 24h" 6 Kiểm tra trạng thái ĐH RETURN_REQUESTED
TC-ORD-006: Hoàn trả — Quá hạn 7 ngày Thuộc tính Chi tiết Mã TC-ORD-006 Tiêu đề Từ chối hoàn trả khi quá thời hạn 7 ngày Mức ưu tiên P2 — High Use Case UC-21 — Luồng ngoại lệ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Mở chi tiết ĐH đã giao > 7 ngày Nút "Yêu cầu hoàn trả" bị ẩn hoặc disable 2 Kiểm tra thông báo "Đã quá thời hạn hoàn trả (7 ngày). Vui lòng liên hệ CSKH nếu cần hỗ trợ."
7. Test Suite: Khuyến mãi & Thông báo (TS-05) Use Case liên quan: UC-13, Notification Tổng test case: 12 Release: R3
7.1 Mã giảm giá TC-PRM-001: Áp dụng mã giảm giá theo phần trăm Thuộc tính Chi tiết Mã TC-PRM-001 Tiêu đề Áp dụng mã giảm giá % với giới hạn tối đa Mức ưu tiên P2 — High Use Case UC-13 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Dữ liệu test (Decision Table):
# Mã Loại Giảm Max giảm Đơn hàng Tính toán Giảm thực 1 SALE20 % 20% 2,000,000 5,000,000 5tr × 20% = 1tr 1,000,000 2 SALE20 % 20% 2,000,000 15,000,000 15tr × 20% = 3tr > max 2,000,000 3 FLAT1M Cố định 1,000,000 — 8,000,000 — 1,000,000 4 FLAT1M Cố định 1,000,000 — 800,000 Giảm > đơn? Lỗi: "Đơn không đủ điều kiện"
TC-PRM-002: Không cho chồng mã giảm giá Thuộc tính Chi tiết Mã TC-PRM-002 Tiêu đề Chỉ áp dụng 1 mã giảm giá cho mỗi đơn hàng Mức ưu tiên P2 — High Use Case UC-13 — Quy tắc nghiệp vụ Loại Functional — Negative Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Áp dụng mã GIAM10 thành công Giảm 10% 2 Thử nhập thêm mã GIAM500K Lỗi: "Chỉ áp dụng 1 mã giảm giá. Bạn muốn thay thế mã hiện tại?" 3 Click "Thay thế" Bỏ GIAM10, áp dụng GIAM500K, tổng cập nhật
7.2 Thông báo TC-NTF-001: Email xác nhận đơn hàng Thuộc tính Chi tiết Mã TC-NTF-001 Tiêu đề Gửi email xác nhận tự động khi đặt hàng thành công Mức ưu tiên P1 — Critical Use Case Notification — Email transactional SRS Ref FR-NTF-01 Loại Functional — Integration Tự động hóa API test + mail interceptor
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Đặt hàng thành công — 2 Kiểm tra email (< 1 phút) Email "Xác nhận đơn hàng #[Mã ĐH]" từ [email protected] 3 Kiểm tra nội dung email Logo TechVN, mã ĐH, danh sách SP (ảnh, tên, SL, giá), Tổng, Địa chỉ, PTVC, PTTT 4 Kiểm tra responsive email Hiển thị đúng trên Gmail, Outlook, mobile 5 Kiểm tra link trong email Link "Xem đơn hàng" dẫn đúng đến chi tiết ĐH
TC-NTF-002: SMS OTP Thuộc tính Chi tiết Mã TC-NTF-002 Tiêu đề Gửi SMS OTP qua SpeedSMS thành công Mức ưu tiên P1 — Critical Use Case UC-02 — Xác thực OTP Loại Functional — Integration Tự động hóa API test
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Trigger OTP (đăng ký/quên MK) API gọi SpeedSMS thành công 2 Kiểm tra SMS Nội dung: "Ma xac thuc TechVN: [6 so]. Het han sau 5 phut." 3 Kiểm tra thời gian gửi SMS nhận trong < 30 giây 4 Kiểm tra OTP trong DB Hash OTP + expire_at = now + 5 phút
8. Test Suite: Quản trị hệ thống (TS-06) Use Case liên quan: UC-22 → UC-27 Tổng test case: 23 Release: R1 (UC-23, UC-25), R3 (UC-22, UC-27)
8.1 UC-22: Quản lý sản phẩm (Admin) TC-ADM-001: Thêm sản phẩm mới Thuộc tính Chi tiết Mã TC-ADM-001 Tiêu đề Admin thêm sản phẩm mới với đầy đủ thông tin Mức ưu tiên P1 — Critical Use Case UC-22 — Luồng chính SRS Ref FR-ADM-01 Loại Functional — Positive Tự động hóa Playwright Tiền điều kiện Đăng nhập admin role ACT-ADMIN-PRD
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /admin/san-pham/them-moi Form thêm SP: Thông tin cơ bản, Thông số kỹ thuật, Giá, Ảnh, SEO 2 Nhập tên SP, chọn danh mục, nhập SKU Auto-generate slug SEO 3 Nhập giá gốc: 25,000,000 VNĐ Format tự động: "25.000.000 ₫" 4 Nhập giá sale: 22,990,000 VNĐ Hiển thị % giảm: "-8%" 5 Upload 5 ảnh SP Preview gallery, kéo thả sắp xếp thứ tự 6 Nhập thông số kỹ thuật (bảng dynamic) Thêm/sửa/xóa từng dòng spec 7 Nhập mô tả (Rich Text Editor) WYSIWYG editor, upload ảnh inline 8 Nhập SEO: Meta title, Meta description Preview snippet Google 9 Click "Lưu nháp" SP tạo với trạng thái DRAFT, toast thành công 10 Click "Xuất bản" SP chuyển ACTIVE, hiển thị trên website 11 Kiểm tra Frontend SP xuất hiện trong danh mục đúng
TC-ADM-002: Import sản phẩm hàng loạt Thuộc tính Chi tiết Mã TC-ADM-002 Tiêu đề Import danh sách sản phẩm từ file Excel/CSV Mức ưu tiên P2 — High Use Case UC-22 — Luồng thay thế Loại Functional — Positive Tự động hóa API test
Dữ liệu test:
# File Số dòng Kết quả 1 ✅ valid_products.xlsx 50 Import 50/50 thành công 2 ❌ missing_sku.xlsx 50 Import 48/50, 2 lỗi "Thiếu SKU" 3 ❌ duplicate_sku.xlsx 50 Import 45/50, 5 lỗi "SKU trùng" 4 ❌ invalid_format.pdf — "Chỉ hỗ trợ file .xlsx, .csv" 5 ❌ too_large.xlsx (> 10MB) 10,000 "File quá lớn. Tối đa 10MB / 5,000 dòng"
TC-ADM-003: Sửa sản phẩm Thuộc tính Chi tiết Mã TC-ADM-003 Tiêu đề Admin sửa thông tin sản phẩm đang active Mức ưu tiên P1 — Critical Use Case UC-22 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Tìm SP trong danh sách admin Kết quả hiển thị 2 Click "Sửa" Form pre-fill data hiện tại 3 Đổi giá sale: 22,990,000 → 19,990,000 — 4 Click "Cập nhật" Toast thành công, audit log ghi nhận thay đổi 5 Kiểm tra Frontend Giá mới hiển thị trên trang SP 6 Kiểm tra cache invalidation CDN purge, giá mới hiển thị ngay (không cache cũ)
8.2 UC-25: Xử lý đơn hàng (Admin) TC-ADM-004: Xác nhận đơn hàng mới Thuộc tính Chi tiết Mã TC-ADM-004 Tiêu đề Admin xác nhận đơn hàng mới và tạo vận đơn Mức ưu tiên P1 — Critical Use Case UC-25 — Luồng chính SRS Ref FR-ADM-03 Loại Functional — E2E Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /admin/don-hang Danh sách ĐH, filter "Chờ xác nhận" 2 Click vào ĐH pending Chi tiết đơn: SP, KH, Địa chỉ, PTTT 3 Kiểm tra tồn kho Tất cả SP trong ĐH có đủ tồn kho 4 Click "Xác nhận đơn hàng" Trạng thái → CONFIRMED 5 Click "Tạo vận đơn" Gọi API ĐVVC, nhận mã vận đơn 6 Kiểm tra mã vận đơn Hiển thị mã vận đơn + link tracking 7 Click "Bàn giao vận chuyển" Trạng thái → SHIPPING 8 Kiểm tra tồn kho Số lượng SP giảm tương ứng 9 Kiểm tra notification KH nhận email + SMS "Đơn hàng đang được giao"
TC-ADM-005: Từ chối đơn hàng Thuộc tính Chi tiết Mã TC-ADM-005 Tiêu đề Admin từ chối đơn hàng với lý do Mức ưu tiên P2 — High Use Case UC-25 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Mở ĐH pending, click "Từ chối" Modal: chọn lý do, ghi chú 2 Chọn "Hết hàng" + ghi chú — 3 Click "Xác nhận từ chối" Trạng thái → REJECTED 4 Kiểm tra nếu đã thanh toán online Tự động tạo refund request 5 Kiểm tra notification KH Email: "Đơn hàng đã bị hủy vì [lý do]"
TC-ADM-006: Xử lý yêu cầu hoàn trả Thuộc tính Chi tiết Mã TC-ADM-006 Tiêu đề Admin duyệt/từ chối yêu cầu hoàn trả Mức ưu tiên P2 — High Use Case UC-25 — Luồng thay thế Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /admin/hoan-tra Danh sách yêu cầu hoàn trả 2 Mở yêu cầu, xem ảnh/video KH gửi Hiển thị bằng chứng 3a Click "Chấp nhận" Trạng thái → RETURN_APPROVED, email KH hướng dẫn gửi hàng 3b Click "Từ chối" + lý do Trạng thái → RETURN_REJECTED, email KH với lý do 4 (Sau khi nhận hàng trả) Click "Hoàn tiền" Trigger refund, trạng thái → REFUNDED
8.3 UC-27: Phân quyền (RBAC) TC-ADM-007: Phân quyền theo role Thuộc tính Chi tiết Mã TC-ADM-007 Tiêu đề Kiểm tra phân quyền truy cập theo role admin Mức ưu tiên P1 — Critical Use Case UC-27 — Luồng chính SRS Ref FR-ADM-05 Loại Functional — Security — Authorization Tự động hóa Playwright + API test
Dữ liệu test (Authorization Matrix):
Chức năng ACT-ADMIN-PRD ACT-ADMIN-ORD ACT-ADMIN-MKT ACT-SUPER-ADMIN Quản lý sản phẩm ✅ Full ❌ No access ❌ No access ✅ Full Quản lý đơn hàng ❌ View only ✅ Full ❌ No access ✅ Full Quản lý khuyến mãi ❌ No access ❌ No access ✅ Full ✅ Full Phân quyền ❌ No access ❌ No access ❌ No access ✅ Full Dashboard ✅ SP metrics ✅ ĐH metrics ✅ Marketing metrics ✅ Full
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Đăng nhập ACT-ADMIN-PRD Sidebar: chỉ hiển thị menu Sản phẩm, Dashboard 2 Truy cập /admin/don-hang (bằng URL) 403 Forbidden hoặc redirect về trang chủ admin 3 Gọi API POST /admin/orders/:id/confirm Response: 403 4 Đăng nhập ACT-SUPER-ADMIN Sidebar: hiển thị tất cả menu 5 Truy cập mọi trang admin Truy cập thành công
TC-ADM-008: Super Admin tạo tài khoản admin mới Thuộc tính Chi tiết Mã TC-ADM-008 Tiêu đề Super Admin tạo tài khoản admin với role chỉ định Mức ưu tiên P1 — Critical Use Case UC-27 — Luồng chính Loại Functional — Positive Tự động hóa Playwright
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /admin/phan-quyen/them-moi Form: Họ tên, Email nội bộ, Role (dropdown), MFA bắt buộc 2 Nhập thông tin, chọn role "Quản lý đơn hàng" — 3 Click "Tạo tài khoản" Tài khoản tạo, email mời gửi đến admin mới 4 Admin mới đăng nhập Buộc đổi MK, thiết lập MFA 5 Kiểm tra quyền Chỉ truy cập được module Đơn hàng
8.4 Dashboard & Báo cáo TC-ADM-009: Dashboard tổng quan Thuộc tính Chi tiết Mã TC-ADM-009 Tiêu đề Dashboard hiển thị KPI và biểu đồ chính xác Mức ưu tiên P2 — High Use Case UC-26 — Luồng chính SRS Ref FR-ADM-04 Loại Functional — Positive Tự động hóa Manual + API verification
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Truy cập /admin/dashboard Trang dashboard tải < 3s 2 Kiểm tra KPI cards Doanh thu hôm nay, Đơn hàng mới, Khách hàng mới, Sản phẩm bán chạy 3 Kiểm tra biểu đồ doanh thu Line chart doanh thu 30 ngày, dữ liệu khớp DB 4 Chọn date range "Tháng 4/2026" Biểu đồ và KPI cập nhật theo range 5 Click "Xuất báo cáo" Download file Excel báo cáo
9. Test Suite: Phi chức năng (TS-07) Tổng test case: 24 Release: Pre-Go-live
TC-NFR-001: Thời gian tải trang chủ Thuộc tính Chi tiết Mã TC-NFR-001 Tiêu đề Trang chủ tải trong < 2 giây (LCP) Mức ưu tiên P1 — Critical SRS Ref NFR-PERF-01 Loại Performance — Core Web Vitals Công cụ Lighthouse, WebPageTest
Tiêu chí Pass:
Metric Mục tiêu Đo tại LCP (Largest Contentful Paint) < 2.5s Mobile 4G FID (First Input Delay) < 100ms Mobile CLS (Cumulative Layout Shift) < 0.1 Mobile + Desktop TTFB (Time to First Byte) < 600ms Server-side Speed Index < 3.4s Mobile 4G
TC-NFR-002: Tải trang chi tiết sản phẩm Thuộc tính Chi tiết Mã TC-NFR-002 Tiêu đề Trang chi tiết SP tải < 3 giây với đầy đủ ảnh Mức ưu tiên P1 — Critical Loại Performance Công cụ Lighthouse
Tiêu chí: LCP < 3s, ảnh lazy-load, CDN cache hit > 90%.
TC-NFR-003: API response time Thuộc tính Chi tiết Mã TC-NFR-003 Tiêu đề API endpoints phản hồi trong thời gian cho phép Mức ưu tiên P1 — Critical Loại Performance — API Công cụ k6
Tiêu chí (P95):
API Method P95 P99 /api/products (list)GET < 200ms < 500ms /api/products/:idGET < 150ms < 300ms /api/searchGET < 300ms < 800ms /api/cartPOST < 200ms < 400ms /api/ordersPOST < 500ms < 1s /api/auth/loginPOST < 300ms < 600ms
TC-NFR-004: Load test — 500 concurrent users Thuộc tính Chi tiết Mã TC-NFR-004 Tiêu đề Hệ thống chịu được 500 người dùng đồng thời Mức ưu tiên P1 — Critical Loại Performance — Load test Công cụ k6 Môi trường Pre-production
Kịch bản k6:
Giai đoạn VUs Thời gian Mục đích Ramp up 0 → 500 5 phút Tăng tải dần Sustained 500 15 phút Giữ tải Spike 500 → 1000 2 phút Kiểm tra spike Ramp down 1000 → 0 5 phút Giảm tải
Tiêu chí Pass:
Metric Mục tiêu Error rate < 1% P95 response time < 2s Throughput > 100 req/s CPU usage < 80% Memory usage < 85%
TC-NFR-005: Stress test — Xác định breaking point Thuộc tính Chi tiết Mã TC-NFR-005 Tiêu đề Xác định ngưỡng tải tối đa trước khi hệ thống suy giảm Mức ưu tiên P2 — High Loại Performance — Stress test Công cụ k6
Kịch bản: Tăng VUs liên tục (0 → 100 → 500 → 1000 → 2000) cho đến khi error rate > 5% hoặc response time > 10s. Ghi nhận breaking point.
9.2 Security Testing TC-NFR-006: SQL Injection Thuộc tính Chi tiết Mã TC-NFR-006 Tiêu đề Hệ thống miễn nhiễm với SQL Injection Mức ưu tiên P1 — Critical Loại Security — OWASP A03 Công cụ OWASP ZAP, Manual
Dữ liệu test:
# Input Vị trí Kết quả mong đợi 1 ' OR '1'='1Login email Từ chối, log warning 2 '; DROP TABLE users;--Search box Trả về "Không tìm thấy", DB an toàn 3 " OR ""="Mọi input field Sanitize, không thực thi SQL 4 1; UPDATE products SET price=0Product ID param 400 Bad Request
TC-NFR-007: XSS (Cross-Site Scripting) Thuộc tính Chi tiết Mã TC-NFR-007 Tiêu đề Hệ thống miễn nhiễm với XSS attacks Mức ưu tiên P1 — Critical Loại Security — OWASP A07 Công cụ OWASP ZAP, Manual
Dữ liệu test:
# Payload Vị trí Kết quả mong đợi 1 <script>alert('XSS')</script>Tên SP, Review, Tìm kiếm HTML escaped, script không chạy 2 <img src=x onerror=alert('XSS')>Review nội dung Tag bị strip/escape 3 javascript:alert(1)URL param Không execute 4 "><svg onload=alert(1)>Mọi input Sanitize đúng
TC-NFR-008: CSRF Protection Thuộc tính Chi tiết Mã TC-NFR-008 Tiêu đề API chống tấn công CSRF Mức ưu tiên P1 — Critical Loại Security — OWASP A01 Công cụ Manual, Burp Suite
Bước thực hiện:
# Hành động Kết quả mong đợi 1 Tạo form HTML giả lập POST đến /api/orders — 2 Mở form từ domain khác khi user đã login TechVN Request bị từ chối (403 hoặc CSRF token invalid) 3 Kiểm tra cookie flags SameSite=Strict hoặc Lax, HttpOnly, Secure
TC-NFR-009: Authentication & Session Thuộc tính Chi tiết Mã TC-NFR-009 Tiêu đề JWT token security và session management Mức ưu tiên P1 — Critical Loại Security — Authentication Công cụ Manual, Burp Suite
Dữ liệu test:
# Kịch bản Kết quả mong đợi 1 Gửi request với expired JWT 401 Unauthorized 2 Gửi request với tampered JWT 401 Unauthorized 3 Refresh token rotation Token cũ bị revoke sau khi refresh 4 Concurrent login Session cũ bị invalidate (hoặc theo policy) 5 Logout accessToken và refreshToken bị revoke
TC-NFR-010: Rate Limiting Thuộc tính Chi tiết Mã TC-NFR-010 Tiêu đề API rate limiting hoạt động đúng Mức ưu tiên P1 — Critical Loại Security — DDoS mitigation Công cụ k6, curl
Dữ liệu test:
# Endpoint Limit Kịch bản Kết quả 1 /api/auth/login5 req/phút/IP Gửi 10 requests liên tục Request 6→10: 429 Too Many Requests 2 /api/auth/otp3 req/phút/SĐT Gửi 5 requests Request 4→5: 429 3 /api/products60 req/phút/IP Gửi 100 requests Request 61→100: 429 4 /api/search30 req/phút/IP Gửi 50 requests Request 31→50: 429
TC-NFR-011: Sensitive Data Exposure Thuộc tính Chi tiết Mã TC-NFR-011 Tiêu đề Không lộ dữ liệu nhạy cảm trong API response Mức ưu tiên P1 — Critical Loại Security — Data Protection Công cụ Manual API review
Dữ liệu test:
# API Kiểm tra Kết quả mong đợi 1 GET /api/users/mePassword field Không chứa password, password_hash 2 GET /api/orders/:idThông tin KH Che SĐT: 090***4567, che email 1 phần 3 Error response (500) Stack trace Không lộ stack trace, file path, DB query 4 API headers Server info Không lộ X-Powered-By, Server version
9.3 Compatibility Testing TC-NFR-012: Cross-browser testing Thuộc tính Chi tiết Mã TC-NFR-012 Tiêu đề Website hiển thị và hoạt động đúng trên các trình duyệt Mức ưu tiên P2 — High Loại Compatibility — Browser Công cụ BrowserStack
Ma trận test:
Browser Version Desktop Mobile Chrome Latest, Latest-1 ✅ ✅ (Android) Safari Latest, Latest-1 ✅ (macOS) ✅ (iOS) Firefox Latest ✅ ✅ Edge Latest ✅ — Samsung Internet Latest — ✅
Checklist mỗi browser:
# Kiểm tra Pass/Fail 1 Layout không bị vỡ 2 Font hiển thị đúng 3 Ảnh tải đúng (WebP fallback) 4 Form submit hoạt động 5 Thanh toán hoạt động 6 Responsive breakpoints
TC-NFR-013: Responsive design Thuộc tính Chi tiết Mã TC-NFR-013 Tiêu đề Website responsive trên các kích thước màn hình Mức ưu tiên P2 — High Loại Compatibility — Responsive Công cụ Chrome DevTools, BrowserStack
Breakpoints:
Breakpoint Width Kiểm tra Mobile S 320px Layout 1 cột, hamburger menu, ảnh full-width Mobile L 414px Layout 1 cột, product card stack Tablet 768px Layout 2 cột, sidebar collapse Laptop 1024px Layout 3 cột, sidebar visible Desktop 1440px Layout đầy đủ, max-width container
9.4 Accessibility Testing TC-NFR-014: WCAG 2.1 AA Compliance Thuộc tính Chi tiết Mã TC-NFR-014 Tiêu đề Website đạt chuẩn WCAG 2.1 Level AA Mức ưu tiên P3 — Medium Loại Accessibility Công cụ axe-core, Lighthouse
Checklist:
# Tiêu chí Chi tiết 1 Contrast ratio Text ≥ 4.5:1, Large text ≥ 3:1 2 Keyboard navigation Tất cả chức năng accessible bằng Tab, Enter, Space 3 Screen reader Heading hierarchy đúng, alt text cho ảnh, ARIA labels 4 Focus indicator Visible focus outline trên mọi interactive element 5 Form labels Mọi input có associated label, error messages accessible 6 Skip navigation "Skip to content" link ở đầu trang
9.5 SEO Testing TC-NFR-015: SEO Technical Thuộc tính Chi tiết Mã TC-NFR-015 Tiêu đề Đảm bảo các yếu tố SEO kỹ thuật Mức ưu tiên P2 — High Loại SEO Công cụ Lighthouse, Google Search Console
Checklist:
# Kiểm tra Kết quả mong đợi 1 Meta title mỗi trang Unique, 30-60 ký tự 2 Meta description Unique, 120-160 ký tự 3 Heading structure H1 unique/page, H2-H6 hierarchy đúng 4 Structured data (JSON-LD) Product, BreadcrumbList, Organization valid 5 Canonical URL Mỗi trang có canonical URL đúng 6 Sitemap.xml Tất cả trang public, cập nhật lastmod 7 Robots.txt Block /admin, /api, /tai-khoan 8 Open Graph tags og:title, og:description, og:image cho share social 9 SSR/SSG rendering Googlebot nhận HTML đầy đủ (không cần JS render)
9.6 Data Integrity Testing TC-NFR-016: Tính nhất quán dữ liệu đơn hàng Thuộc tính Chi tiết Mã TC-NFR-016 Tiêu đề Đảm bảo tính nhất quán dữ liệu khi đặt hàng đồng thời Mức ưu tiên P1 — Critical Loại Data Integrity — Concurrency Công cụ k6 + DB query
Kịch bản:
# Test Kết quả mong đợi 1 10 user đặt đồng thời 1 SP (tồn kho = 5) Chỉ 5 đơn thành công, 5 đơn báo hết hàng 2 Đặt hàng + hủy đơn đồng thời Tồn kho = tồn kho ban đầu (zero-sum) 3 Giá SP thay đổi giữa chừng checkout Đơn hàng giữ giá tại thời điểm bắt đầu checkout 4 Thanh toán double-submit Chỉ tạo 1 đơn hàng (idempotent)
10. Ma trận truy vết Test Case 10.1 Use Case → Test Case Use Case Test Cases Số TC Coverage UC-01: Đăng ký TC-ACC-001 → TC-ACC-007 7 Luồng chính + 4 ngoại lệ UC-02: Xác thực OTP TC-ACC-005, TC-ACC-006, TC-NTF-002 3 Hết hạn + brute-force + SMS UC-03: Đăng nhập TC-ACC-008 → TC-ACC-010, TC-ACC-013 4 Luồng chính + 3 ngoại lệ UC-04: OAuth TC-ACC-011, TC-ACC-012 2 Google + Facebook UC-05: Khôi phục MK TC-ACC-014 → TC-ACC-016 3 Luồng chính + hết hạn + one-time UC-06: Hồ sơ cá nhân TC-ACC-017 → TC-ACC-019 3 Profile + Địa chỉ + Đổi MK UC-07: Duyệt danh mục TC-CAT-001 → TC-CAT-003 3 Danh mục + Phân trang + Sắp xếp UC-08: Chi tiết SP TC-CAT-004 → TC-CAT-006 3 Đầy đủ info + Biến thể + Hết hàng UC-09: Tìm kiếm TC-CAT-007, TC-CAT-008 2 Từ khóa + Autocomplete UC-10: Lọc SP TC-CAT-009, TC-CAT-010 2 Khoảng giá + Kết hợp UC-11: So sánh TC-CAT-011 1 So sánh 2-4 SP UC-12: Giỏ hàng TC-CRT-001 → TC-CRT-004 4 Thêm + Sửa SL + Xóa + Merge UC-13: Mã giảm giá TC-CHK-004, TC-PRM-001, TC-PRM-002 3 Áp dụng + Decision table + Chồng mã UC-14: Checkout TC-CHK-001 → TC-CHK-003 3 COD E2E + Validation + Race condition UC-15: Thanh toán TC-PAY-001 → TC-PAY-004 4 VNPAY + Hủy + MoMo + Timeout UC-16: Vận chuyển TC-CHK-005 1 Tính phí theo khu vực UC-17: Trả góp TC-PAY-005, TC-PAY-006 2 Thành công + Không đủ ĐK UC-18: Theo dõi ĐH TC-ORD-001, TC-ORD-002 2 Lịch sử + Chi tiết + Tracking UC-19: Hủy ĐH TC-ORD-003, TC-ORD-004 2 Hủy + Hoàn tiền UC-20: Đánh giá TC-REV-001, TC-REV-002 2 Đánh giá + Chưa mua UC-21: Hoàn trả TC-ORD-005, TC-ORD-006 2 Hoàn trả + Quá hạn UC-22: QL SP Admin TC-ADM-001 → TC-ADM-003 3 Thêm + Import + Sửa UC-25: QL ĐH Admin TC-ADM-004 → TC-ADM-006 3 Xác nhận + Từ chối + Hoàn trả UC-26: Dashboard TC-ADM-009 1 KPI + Biểu đồ UC-27: Phân quyền TC-ADM-007, TC-ADM-008 2 Authorization matrix + Tạo admin
10.2 SRS → Test Case SRS Ref Test Cases FR-ACC-01 TC-ACC-001 → TC-ACC-007 FR-ACC-02 TC-ACC-008 → TC-ACC-013 FR-ACC-03 TC-ACC-014 → TC-ACC-016 FR-PRD-01 TC-CAT-001 → TC-CAT-003 FR-PRD-02 TC-CAT-004 → TC-CAT-006 FR-PRD-03 TC-CAT-007, TC-CAT-008 FR-PRD-04 TC-CAT-009, TC-CAT-010 FR-ORD-01 TC-CRT-001 → TC-CRT-004 FR-ORD-02 TC-CHK-001 → TC-CHK-005 FR-ORD-03 TC-PAY-001 → TC-PAY-006 FR-ORD-05 TC-ORD-001 → TC-ORD-006 FR-PRM-01 TC-CHK-004, TC-PRM-001, TC-PRM-002 FR-REV-01 TC-REV-001, TC-REV-002 FR-NTF-01 TC-NTF-001, TC-NTF-002 FR-ADM-01 TC-ADM-001 → TC-ADM-003 FR-ADM-03 TC-ADM-004 → TC-ADM-006 FR-ADM-04 TC-ADM-009 FR-ADM-05 TC-ADM-007, TC-ADM-008 NFR-PERF-01 TC-NFR-001 → TC-NFR-005 NFR-SEC-01 TC-NFR-006 → TC-NFR-011
11. Thống kê tổng hợp 11.1 Phân bố Test Case theo Module Module Số TC P1 P2 P3 P4 Account (ACC) 19 10 9 0 0 Catalog (CAT) 11 3 7 1 0 Cart (CRT) 4 3 1 0 0 Checkout (CHK) 5 3 2 0 0 Payment (PAY) 6 3 3 0 0 Order (ORD) 6 3 3 0 0 Review (REV) 2 0 2 0 0 Promotion (PRM) 2 0 2 0 0 Notification (NTF) 2 1 1 0 0 Admin (ADM) 9 4 5 0 0 Non-Functional (NFR) 16 9 5 2 0 Tổng 82 39 40 3 0
11.2 Phân bố theo Loại Test Loại Số TC Functional — Positive 38 Functional — Negative 20 Functional — Security 6 Functional — Integration 10 Functional — E2E 3 Performance 5 Security (OWASP) 6 Compatibility 2 Accessibility 1 SEO 1 Data Integrity 1
11.3 Phân bố theo Release Release Test Cases Phải Pass R1 — MVP TC-ACC-, TC-CAT-001→006, TC-CRT- , TC-CHK-001→003, TC-ORD-, TC-ADM-004→008, TC-NTF- 52 TC R2 — Payment TC-PAY-*, TC-CHK-004→005, TC-PAY-005→006 10 TC R3 — Growth TC-CAT-007→011, TC-PRM-*, TC-ADM-001→003, TC-ADM-009 10 TC Pre-Go-live TC-NFR-* (toàn bộ phi chức năng) 16 TC Tổng 82 TC
11.4 Tỷ lệ tự động hóa mục tiêu Phương pháp Số TC Tỷ lệ Playwright (E2E automated) 48 58.5% API test (Supertest/k6) 14 17.1% Semi-automated 4 4.9% Manual only 16 19.5% Tổng 82 80.5% automated
Phụ lục A. Template báo cáo kết quả Test Case ┌─────────────────────────────────────────────────────────┐
│ KẾT QUẢ THỰC HIỆN TEST CASE │
├─────────────────────────────────────────────────────────┤
│ Mã TC: TC-ACC-001 │
│ Tester: Lê Thị Hồng │
│ Ngày: 15/06/2026 │
│ Môi trường: Staging │
│ Browser: Chrome 126 / macOS │
│ Build: v1.2.3-rc1 │
├─────────────────────────────────────────────────────────┤
│ Kết quả: ✅ PASS / ❌ FAIL / ⏸ BLOCKED │
├─────────────────────────────────────────────────────────┤
│ Nếu FAIL: │
│ - Bước thất bại: #5 │
│ - Kết quả thực tế: OTP không gửi sau 2 phút │
│ - Bug ID: BUG-0123 │
│ - Severity: S2 — High │
│ - Screenshot: [đính kèm] │
├─────────────────────────────────────────────────────────┤
│ Ghi chú: OTP delay do SpeedSMS rate limit │
└─────────────────────────────────────────────────────────┘ B. Danh sách Test Data cần chuẩn bị # Loại Mô tả Nguồn 1 Tài khoản test 10 accounts (guest, customer, 4 admin roles) Seed script 2 Sản phẩm test 50 SP (đủ danh mục, có/không biến thể, có/không sale, hết/còn hàng) Seed script 3 Đơn hàng test 20 ĐH (mỗi trạng thái 2 đơn) Seed script 4 Mã giảm giá 10 mã (các loại, hết hạn, đã dùng, chưa dùng) Seed script 5 Địa chỉ test 5 địa chỉ (nội thành HCM, Hà Nội, miền Trung, miền Tây, hải đảo) Manual 6 File import 3 file Excel (valid, partial error, invalid format) Manual 7 Ảnh test 10 ảnh (JPG, PNG, WebP, > 5MB, corrupt) Manual 8 Payment sandbox VNPAY sandbox + MoMo sandbox credentials DevOps
C. Glossary Thuật ngữ Định nghĩa TC Test Case TS Test Suite VU Virtual User (k6) P95/P99 Percentile 95/99 — giá trị mà 95%/99% request nhanh hơn LCP Largest Contentful Paint — thời gian render phần tử lớn nhất CLS Cumulative Layout Shift — mức độ xê dịch layout TTFB Time to First Byte — thời gian nhận byte đầu tiên từ server Idempotent Gọi nhiều lần cùng kết quả (không tạo duplicate) Race condition Lỗi xảy ra khi nhiều tiến trình truy cập tài nguyên đồng thời
Tài liệu này là tài sản trí tuệ của Công ty Máy tính TechVN. Mọi sao chép, phân phối không được phép đều bị nghiêm cấm.