Skip to content

Đặ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ệuTCS-TECHVN-ECOM-2026-001
Phiên bản1.0
Ngày tạo10/05/2026
Ngày cập nhật10/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ệtVõ Thanh Tùng — QA Lead
Trạng tháiĐã phê duyệt (Approved)
Mức độ bảo mậtNội bộ (Internal)
Test Plan tham chiếuTP-TECHVN-ECOM-2026-001 v1.0
UCS tham chiếuUCS-TECHVN-ECOM-2026-001 v1.0
SRS tham chiếuSRS-TECHVN-ECOM-2026-001 v1.0

Lịch sử thay đổi

Phiên bảnNgàyNgười thay đổiMô tả
0.102/05/2026Lê Thị HồngKhởi tạo, test case PKG-01
0.304/05/2026Nguyễn Đức MinhBổ sung test case PKG-02, PKG-03
0.607/05/2026Lê Thị HồngBổ sung PKG-04→06, test case phi chức năng
0.909/05/2026Nguyễn Đức MinhReview chéo, chỉnh sửa theo feedback
1.010/05/2026Võ Thanh TùngPhê duyệt chính thức

Mục lục

  1. Giới thiệu
  2. Quy ước và định dạng
  3. Test Suite: Quản lý tài khoản (TS-01)
  4. Test Suite: Catalog sản phẩm (TS-02)
  5. Test Suite: Mua hàng (TS-03)
  6. Test Suite: Sau mua hàng (TS-04)
  7. Test Suite: Khuyến mãi & Thông báo (TS-05)
  8. Test Suite: Quản trị hệ thống (TS-06)
  9. Test Suite: Phi chức năng (TS-07)
  10. Ma trận truy vết Test Case
  11. 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ượngMục đích
QA TeamThực hiện kiểm thử theo từng test case
DeveloperTham khảo khi viết unit/integration test
QA LeadReview, assign test case, theo dõi coverage
Product OwnerXác nhận tiêu chí chấp nhận

1.4 Tài liệu tham chiếu

Tên tài liệu
TP-TECHVN-ECOM-2026-001Kế 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-001User Stories & Acceptance Criteria
IEEE 829-2008Standard 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ắtModuleGói
ACCAccount (Tài khoản)PKG-01
CATCatalog (Sản phẩm)PKG-02
CRTCart (Giỏ hàng)PKG-03
CHKCheckout (Đặt hàng)PKG-03
PAYPayment (Thanh toán)PKG-03
ORDOrder (Đơn hàng)PKG-04
REVReview (Đánh giá)PKG-04
PRMPromotion (Khuyến mãi)PKG-05
NTFNotification (Thông báo)PKG-05
ADMAdmin (Quản trị)PKG-06
NFRNon-Functional (Phi chức năng)

2.2 Mức ưu tiên

MứcÝ nghĩaYêu cầu
P1 — CriticalLuồng chính, ảnh hưởng doanh thuPhải pass trước mỗi release
P2 — HighLuồng thay thế quan trọngPhải pass trước Go-live
P3 — MediumEdge case, UXNên pass, có thể defer nếu có workaround
P4 — LowNice-to-have, cosmeticPass khi có thời gian

2.3 Trạng thái thực thi

Trạng tháiÝ nghĩa
Not RunChưa thực hiện
PassKết quả đúng như mong đợi
FailKết quả khác với mong đợi
BlockedKhông thể thực hiện do phụ thuộc
SkippedBỏ qua có chủ đích (ghi lý do)
N/AKhô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ínhChi tiết
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ênP1 — Critical
Use CaseUC-01 — Luồng chính
SRS RefFR-ACC-01
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiện1. 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ườngGiá trị
Họ tênNguyễn Văn Test
Email[email protected]
Số điện thoại0901234567
Mật khẩuP@ssw0rd2026!
Xác nhận mật khẩuP@ssw0rd2026!

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập techvn.vn/dang-kyHiể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
2Nhập đầy đủ thông tin hợp lệ (xem bảng dữ liệu)Không có cảnh báo lỗi validation
3Tick checkbox "Tôi đồng ý với Điều khoản sử dụng"Checkbox được chọn
4Click nút "Đăng ký"Loading indicator hiển thị, hệ thống gửi OTP qua SMS
5Nhậ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
6Kiểm tra emailNhậ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ínhChi tiết
TC-ACC-002
Tiêu đềHệ thống từ chối đăng ký khi email đã được sử dụng
Mức ưu tiênP1 — Critical
Use CaseUC-01 — Luồng ngoại lệ E1
SRS RefFR-ACC-01
LoạiFunctional — Negative
Tự động hóaPlaywright
Tiền điều kiệnEmail [email protected] đã có trong hệ thống

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập trang đăng kýForm đăng ký hiển thị
2Nhập email [email protected] và các trường khác hợp lệ
3Click "Đă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."
4Kiểm tra link "đăng nhập" trong thông báoLink 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ínhChi tiết
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ênP1 — Critical
Use CaseUC-01 — Luồng ngoại lệ E2
LoạiFunctional — Negative
Tự động hóaPlaywright

Dữ liệu test (Decision Table):

#Mật khẩuĐộ dàiChữ hoaChữ thườngSốKý tự đặc biệtKết quả
1abc3Fail — "Mật khẩu tối thiểu 8 ký tự"
2abcdefgh8Fail — "Cần có chữ hoa, số và ký tự đặc biệt"
3ABCDEFGH8Fail — "Cần có chữ thường, số và ký tự đặc biệt"
4Abcdefg18Fail — "Cần có ký tự đặc biệt"
5123456788Fail — "Cần có chữ hoa, chữ thường và ký tự đặc biệt"
6P@ssw0rd!9Pass
7🔲 P@ssw0r7Fail — biên dưới: "Mật khẩu tối thiểu 8 ký tự"
8🔲 P@ssw0rd8Pass — 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ínhChi tiết
TC-ACC-004
Tiêu đềHệ thống validate định dạng số điện thoại Việt Nam
Mức ưu tiênP2 — High
Use CaseUC-01 — Luồng ngoại lệ E3
LoạiFunctional — Negative
Tự động hóaPlaywright

Dữ liệu test:

#SĐTKết quảLý do
1012345678FailĐầu số không hợp lệ
2090123456FailThiếu 1 số (9 ký tự)
309012345678FailThừa 1 số (11 ký tự)
4abcdefghijFailChứa ký tự không phải số
5+8490123456FailThiếu 1 số (format quốc tế)
60901234567PassĐầu số 090, 10 ký tự
70389876543PassĐầu số 038, 10 ký tự
8+84901234567PassFormat quốc tế hợp lệ

TC-ACC-005: Đăng ký — OTP hết hạn

Thuộc tínhChi tiết
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ênP2 — High
Use CaseUC-02 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright + mock timer

Bước thực hiện:

#Hành độngKết quả mong đợi
1Thực hiện đăng ký hợp lệ, nhận OTPHiể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
3Nhậ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."
4Click "Gửi lại OTP"OTP mới được gửi, timer reset về 5:00
5Nhậ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ínhChi tiết
TC-ACC-006
Tiêu đềKhóa tạm thời sau 5 lần nhập OTP sai
Mức ưu tiênP2 — High
Use CaseUC-02 — Luồng ngoại lệ
LoạiFunctional — Security
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Thực hiện đăng ký, nhận OTPHiển thị màn hình nhập OTP
2Nhập OTP sai lần 1–4Thông báo "Mã OTP không đúng. Còn X lần thử."
3Nhập OTP sai lần 5Thông báo: "Bạn đã nhập sai quá nhiều lần. Vui lòng thử lại sau 15 phút."
4Thử nhập OTP tiếpInput bị disable, không cho nhập
5Sau 15 phút, thử lạiCho 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ínhChi tiết
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ênP1 — Critical
Use CaseUC-01 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Nhập mật khẩu: P@ssw0rd2026!
2Nhập xác nhận mật khẩu: P@ssw0rd2026Inline error: "Mật khẩu xác nhận không khớp"
3Nú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ínhChi tiết
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ênP1 — Critical
Use CaseUC-03 — Luồng chính
SRS RefFR-ACC-02
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnTài khoản [email protected] / P@ssw0rd2026! đã tồn tại và ACTIVE

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập techvn.vn/dang-nhapHiển thị form đăng nhập
2Nhập email và mật khẩu hợp lệ
3Click "Đăng nhập"Chuyển về trang chủ, header hiển thị "Xin chào, [Tên]"
4Kiểm tra localStorage/cookieaccessToken (JWT) và refreshToken
5Reload trangVẫ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ínhChi tiết
TC-ACC-009
Tiêu đềTừ chối đăng nhập khi mật khẩu không đúng
Mức ưu tiênP1 — Critical
Use CaseUC-03 — Luồng ngoại lệ E1
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Nhập email hợp lệ + mật khẩu sai
2Click "Đă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)
3Kiểm tra response timeThờ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ínhChi tiết
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ênP1 — Critical
Use CaseUC-03 — Luồng ngoại lệ E2
LoạiFunctional — Security
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKế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útVẫn bị từ chối: "Tài khoản đang bị khóa."
4Sau 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ínhChi tiết
TC-ACC-011
Tiêu đềĐăng nhập/Đăng ký tự động qua Google OAuth 2.0
Mức ưu tiênP1 — Critical
Use CaseUC-04 — Luồng chính
SRS RefFR-ACC-02
LoạiFunctional — Integration
Tự động hóaSemi-auto (manual Google consent)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Click "Đăng nhập với Google"Redirect tới Google consent screen
2Chọ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
4Kiểm tra trang chủHiển thị avatar Google, tên tài khoản Google
5Kiểm tra profileHọ tên, email, avatar được pre-fill từ Google

TC-ACC-012: Đăng nhập bằng Facebook OAuth

Thuộc tínhChi tiết
TC-ACC-012
Tiêu đềĐăng nhập/Đăng ký qua Facebook OAuth
Mức ưu tiênP2 — High
Use CaseUC-04 — Luồng thay thế
LoạiFunctional — Integration
Tự động hóaSemi-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ínhChi tiết
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ênP1 — Critical
Use CaseUC-03 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Nhập email [email protected] + mật khẩu bất kỳ
2Click "Đă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ínhChi tiết
TC-ACC-014
Tiêu đềĐặt lại mật khẩu qua link email thành công
Mức ưu tiênP1 — Critical
Use CaseUC-05 — Luồng chính
SRS RefFR-ACC-03
LoạiFunctional — Positive
Tự động hóaPlaywright + mail interceptor

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /quen-mat-khauHiển thị form nhập email
2Nhập email đã đăng ký
3Click "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"
4Mở email, click link resetChuyển đến trang đặt mật khẩu mới
5Nhập mật khẩu mới hợp lệ + xác nhận
6Click "Đặ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

Thuộc tínhChi tiết
TC-ACC-015
Tiêu đềLink reset password hết hạn sau 30 phút
Mức ưu tiênP2 — High
Use CaseUC-05 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright + mock timer

Bước thực hiện:

#Hành độngKết quả mong đợi
1Yêu cầu reset passwordNhận email với link
2Đợi > 30 phút, click linkTrang 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

Thuộc tínhChi tiết
TC-ACC-016
Tiêu đềLink reset password bị vô hiệu hóa sau khi sử dụng
Mức ưu tiênP2 — High
Use CaseUC-05 — Luồng ngoại lệ
LoạiFunctional — Security
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Thực hiện reset thành côngMật khẩu đã đổi
2Mở 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ínhChi tiết
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ênP2 — High
Use CaseUC-06 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnĐã đăng nhập

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /tai-khoan/ho-soHiển thị form với thông tin hiện tại
2Thay đổi họ tên thành "Nguyễn Văn Updated"
3Upload avatar (JPG, < 5MB)Preview ảnh mới
4Click "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ínhChi tiết
TC-ACC-018
Tiêu đềQuản lý danh sách địa chỉ giao hàng (CRUD)
Mức ưu tiênP2 — High
Use CaseUC-06 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /tai-khoan/dia-chiHiển thị danh sách địa chỉ (hoặc trống)
2Click "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
3Chọ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"
5Click "Lưu"Địa chỉ mới xuất hiện trong danh sách, badge "Mặc định" hiển thị
6Click "Sửa" trên địa chỉForm pre-fill với data cũ, cho phép chỉnh sửa
7Click "Xóa" trên địa chỉ không mặc địnhConfirm dialog → xóa thành công

TC-ACC-019: Đổi mật khẩu

Thuộc tínhChi tiết
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ênP2 — High
Use CaseUC-06 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /tai-khoan/doi-mat-khauForm: Mật khẩu cũ, Mật khẩu mới, Xác nhận MK mới
2Nhập mật khẩu cũ đúng + mật khẩu mới hợp lệ
3Click "Đổ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ớiThà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ínhChi tiết
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ênP1 — Critical
Use CaseUC-07 — Luồng chính
SRS RefFR-PRD-01
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập trang chủMega menu hiển thị danh mục cấp 1 (Laptop, PC, Linh kiện, Phụ kiện, ...)
2Hover vào "Laptop"Hiển thị danh mục cấp 2: Laptop Gaming, Laptop Văn phòng, Laptop Đồ họa, ...
3Click "Laptop Gaming"Chuyển đến /danh-muc/laptop-gaming, hiển thị grid sản phẩm
4Kiểm tra breadcrumb"Trang chủ > Laptop > Laptop Gaming"
5Kiểm tra product cardMỗ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ínhChi tiết
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ênP2 — High
Use CaseUC-07 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnDanh mục "Laptop" có > 24 sản phẩm (default page size = 24)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập danh mục "Laptop"Hiển thị 24 sản phẩm, pagination controls ở cuối
2Click trang 2URL cập nhật ?page=2, load 24 SP tiếp theo, scroll lên đầu
3Click "Trang cuối"Hiển thị SP còn lại (≤ 24), nút "Tiếp" bị disable
4Thay đổi "Hiển thị" từ 24 → 48Load 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ínhChi tiết
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ênP2 — High
Use CaseUC-07 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test:

#Sắp xếp theoKết quả mong đợi
1Giá: Thấp → CaoSP đầu tiên có giá thấp nhất
2Giá: Cao → ThấpSP đầu tiên có giá cao nhất
3Mới nhấtSP đầu tiên có ngày tạo gần nhất
4Bán chạySP đầu tiên có số lượng đã bán cao nhất
5Đánh giá cao nhấtSP đầu tiên có rating trung bình cao nhất
6Giảm giá nhiều nhấtSP đầ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ínhChi tiết
TC-CAT-004
Tiêu đềTrang chi tiết sản phẩm hiển thị đầy đủ thông tin
Mức ưu tiênP1 — Critical
Use CaseUC-08 — Luồng chính
SRS RefFR-PRD-02
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Click vào một sản phẩm từ danh mụcTrang chi tiết SP tải thành công
2Kiểm tra Gallery ảnhẢnh chính lớn + thumbnail bên dưới, click thumbnail → đổi ảnh chính, zoom hover
3Kiểm tra Thông tin cơ bảnTên SP, mã SKU, thương hiệu, rating (sao + số lượng đánh giá), trạng thái kho
4Kiểm tra GiáGiá gốc (gạch ngang nếu có sale), Giá sale, % giảm, Tiết kiệm X VNĐ
5Kiểm tra Thông số kỹ thuậtBảng spec đầy đủ: CPU, RAM, SSD, GPU, Màn hình, Pin, OS, ...
6Kiểm tra Mô tả chi tiếtHTML content với hình ảnh, format đúng
7Kiểm tra "Sản phẩm tương tự"Hiển thị ≥ 4 SP cùng danh mục
8Kiể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ínhChi tiết
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ênP1 — Critical
Use CaseUC-08 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnSP có nhiều biến thể (VD: Laptop có 3 cấu hình RAM/SSD)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Xem SP có biến thểHiển thị các tùy chọn (VD: RAM 8GB/16GB/32GB, SSD 256/512/1TB)
2Chọ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
3Chọn biến thể hết hàngNú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ínhChi tiết
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ênP2 — High
Use CaseUC-08 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Xem SP có tồn kho = 0Badge "Hết hàng" hiển thị, nút "Thêm vào giỏ" bị disable
2Kiể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áoToast: "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ínhChi tiết
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ênP1 — Critical
Use CaseUC-09 — Luồng chính
SRS RefFR-PRD-03
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test & kết quả mong đợi:

#Từ khóaMong đợ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ínhChi tiết
TC-CAT-008
Tiêu đềGợi ý tìm kiếm hiển thị khi gõ >= 2 ký tự
Mức ưu tiênP2 — High
Use CaseUC-09 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Gõ "la" trong ô tìm kiếmDropdown gợi ý xuất hiện: "Laptop", "Laptop Gaming", "Laptop Văn phòng"
2Gõ tiếp "lap ga"Gợi ý thu hẹp: "Laptop Gaming"
3Click vào gợi ýChuyển đến trang kết quả hoặc trang SP
4Kiểm tra latencyGợ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ínhChi tiết
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ênP2 — High
Use CaseUC-10 — Luồng chính
SRS RefFR-PRD-04
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test:

#Giá từGiá đếnKết quả mong đợi
110,000,00020,000,000Chỉ SP có giá 10tr – 20tr
205,000,000SP dưới 5tr
350,000,000100,000,000SP cao cấp hoặc "Không có SP"
420,000,00010,000,000Tự 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ínhChi tiết
TC-CAT-010
Tiêu đềKết hợp nhiều bộ lọc đồng thời
Mức ưu tiênP2 — High
Use CaseUC-10 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Chọn danh mục: Laptop GamingFilter panel hiển thị
2Chọn Thương hiệu: ASUS, MSIDanh sách cập nhật (AND giữa group, OR trong group)
3Chọn Giá: 15tr – 30trKết quả thu hẹp
4Chọn RAM: 16GBKết quả thu hẹp tiếp
5Kiểm tra số lượng kết quảBadge hiển thị "X sản phẩm" phù hợp
6Kiểm tra "Active filters"Tags hiển thị: "ASUS", "MSI", "15tr-30tr", "16GB"
7Click "X" trên tag "MSI"Bỏ filter MSI, kết quả cập nhật
8Click "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ínhChi tiết
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ênP3 — Medium
Use CaseUC-11 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Tick "So sánh" trên 2 SPThanh so sánh xuất hiện ở footer: "Đã chọn 2 SP — So sánh ngay"
2Tick thêm SP thứ 3Counter cập nhật: "3 SP"
3Click "So sánh ngay"Chuyển đến trang so sánh, bảng so sánh hiển thị song song
4Kiểm tra bảng so sánhCác spec khác nhau được highlight (bold/color)
5Tick thêm SP thứ 5Toast: "Tối đa 4 sản phẩm"
6Click "Xóa" trên 1 SP trong bảngSP 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ínhChi tiết
TC-CRT-001
Tiêu đềThêm sản phẩm vào giỏ hàng thành công
Mức ưu tiênP1 — Critical
Use CaseUC-12 — Luồng chính
SRS RefFR-ORD-01
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Xem chi tiết SP có tồn kho > 0Nút "Thêm vào giỏ" active
2Chọn số lượng = 2Input hiển thị 2
3Click "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
4Mở mini-cart (hover/click icon giỏ)Hiển thị SP vừa thêm: ảnh, tên, biến thể, SL, giá, tổng
5Truy cập /gio-hangSP 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ínhChi tiết
TC-CRT-002
Tiêu đềThay đổi số lượng sản phẩm trong giỏ hàng
Mức ưu tiênP1 — Critical
Use CaseUC-12 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test (SP có tồn kho = 10):

#SL cũHành độngSL mớiKết quả
11Click "+"2Tổng tiền cập nhật = giá × 2
22Click "-"1Tổng tiền cập nhật = giá × 1
31Click "-"Confirm dialog: "Bạn muốn xóa SP này?"
41Nhập trực tiếp "5"5Tổng tiền cập nhật
55Nhập "15" (> tồn kho)10Toast: "Chỉ còn 10 SP. Đã điều chỉnh số lượng."
61Nhập "0"Confirm dialog: "Bạn muốn xóa SP này?"
71Nhập "-1"1Không cho nhập số âm

TC-CRT-003: Xóa sản phẩm khỏi giỏ hàng

Thuộc tínhChi tiết
TC-CRT-003
Tiêu đềXóa sản phẩm khỏi giỏ hàng
Mức ưu tiênP1 — Critical
Use CaseUC-12 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Giỏ hàng có 3 SPHiển thị 3 items
2Click icon "Xóa" trên SP thứ 2Confirm: "Bạn muốn xóa [Tên SP] khỏi giỏ hàng?"
3Click "Xác nhận"SP biến mất, tổng tiền cập nhật, badge giỏ hàng -1
4Xóa hết tất cả SPHiể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ínhChi tiết
TC-CRT-004
Tiêu đềMerge giỏ hàng khi guest đăng nhập
Mức ưu tiênP2 — High
Use CaseUC-12 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Khô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)
3Kiểm tra giỏ hàngMerge: SP-A × 1, SP-B × 2
4Trường hợp cả 2 giỏ có cùng SP-CGuest: 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ínhChi tiết
TC-CHK-001
Tiêu đềĐặt hàng thành công với thanh toán COD
Mức ưu tiênP1 — Critical
Use CaseUC-14 — Luồng chính
SRS RefFR-ORD-02
LoạiFunctional — E2E — Positive
Tự động hóaPlaywright
Tiền điều kiện1. Đã đă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 độngKết quả mong đợi
Bước 1: Thông tin giao hàng
1Click "Tiến hành đặt hàng" từ giỏChuyển đến Step 1: Thông tin giao hàng
2Chọn địa chỉ có sẵn hoặc nhập mớiĐịa chỉ được chọn, highlight active
3Kiểm tra danh sách SPTó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
4Click "Tiếp tục"Step 2: Hiển thị PTVC khả dụng (GHTK, GHN, Viettel Post) + phí
5Chọn GHTK — Giao nhanhPhí vận chuyển cập nhật, thời gian dự kiến hiển thị
6Chọn PTTT: CODRadio button selected
Bước 3: Xác nhận đơn hàng
7Click "Tiếp tục"Step 3: Tóm tắt đơn hàng đầy đủ
8Kiể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
9Click "Đặt hàng"Loading → Chuyển đến trang "Đặt hàng thành công"
10Kiểm tra trang thành côngMã đơn hàng, Tổng tiền, Dự kiến giao, Nút "Theo dõi đơn hàng"
11Kiểm tra emailNhận email xác nhận đơn hàng
12Kiểm tra giỏ hàngGiỏ hàng đã trống
13Kiể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ínhChi tiết
TC-CHK-002
Tiêu đềKhông cho phép checkout khi thiếu thông tin địa chỉ
Mức ưu tiênP1 — Critical
Use CaseUC-14 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Checkout 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)
2Bỏ trống trường "Số điện thoại"Inline error: "Vui lòng nhập số điện thoại"
3Bỏ trống trường "Tỉnh/Thành phố"Inline error: "Vui lòng chọn Tỉnh/Thành phố"
4Nú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ínhChi tiết
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ênP1 — Critical
Use CaseUC-14 — Luồng ngoại lệ
LoạiFunctional — Negative — Race condition
Tự động hóaPlaywright + API mock

Bước thực hiện:

#Hành độngKết quả mong đợi
1Bắ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
3Click "Đặt hàng" ở Step 3Thông báo: "Sản phẩm [Tên] đã hết hàng. Vui lòng cập nhật giỏ hàng."
4Kiểm tra UXRedirect 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ínhChi tiết
TC-CHK-004
Tiêu đềÁp dụng mã giảm giá trong quá trình checkout
Mức ưu tiênP2 — High
Use CaseUC-13 — Luồng chính
SRS RefFR-PRM-01
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test:

#LoạiĐiều kiệnĐơn hàngKết quả
1✅ GIAM10Giảm 10%Đơn ≥ 5trĐơn 10trGiảm 1tr, tổng = 9tr
2✅ GIAM500KGiảm 500KKhông ĐKĐơn 3trGiảm 500K, tổng = 2.5tr
3❌ GIAM10Giảm 10%Đơn ≥ 5trĐơn 3trLỗi: "Đơn hàng chưa đạt giá trị tối thiểu 5,000,000₫"
4❌ EXPIREDĐã hết hạnLỗi: "Mã giảm giá đã hết hạn"
5❌ USEDĐã dùng1 lần/userLỗi: "Mã giảm giá đã được sử dụng"
6❌ ABCXYZKhông tồn tạiLỗ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ínhChi tiết
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ênP1 — Critical
Use CaseUC-15 — Luồng chính
SRS RefFR-ORD-03
LoạiFunctional — Integration
Tự động hóaPlaywright (sandbox)
Tiền điều kiệnVNPAY sandbox đã cấu hình

Bước thực hiện:

#Hành độngKết quả mong đợi
1Checkout, chọn PTTT: VNPAY
2Click "Đặt hàng"Redirect đến trang VNPAY (sandbox)
3Chọn ngân hàng, nhập thông tin test
4Xác nhận thanh toán trên VNPAYVNPAY callback → redirect về TechVN
5Kiểm tra trang kết quả"Thanh toán thành công", mã đơn hàng, số tiền
6Kiể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ínhChi tiết
TC-PAY-002
Tiêu đềXử lý khi user hủy thanh toán trên trang VNPAY
Mức ưu tiênP1 — Critical
Use CaseUC-15 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright (sandbox)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Redirect đến VNPAYTrang thanh toán VNPAY hiển thị
2Click "Hủy" hoặc back browserRedirect về TechVN
3Kiểm tra trang kết quả"Thanh toán chưa hoàn tất. Đơn hàng đang chờ thanh toán."
4Kiểm tra DBĐơn hàng: PENDING_PAYMENT, Payment: PENDING
5Kiể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ínhChi tiết
TC-PAY-003
Tiêu đềThanh toán qua ví MoMo thành công
Mức ưu tiênP1 — Critical
Use CaseUC-15 — Luồng thay thế
LoạiFunctional — Integration
Tự động hóaPlaywright (sandbox)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Checkout, chọn PTTT: MoMo
2Click "Đặt hàng"Redirect đến MoMo payment page
3Xác nhận thanh toán (sandbox)Callback → redirect về TechVN
4Kiể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ínhChi tiết
TC-PAY-004
Tiêu đềXử lý khi thanh toán timeout (15 phút)
Mức ưu tiênP2 — High
Use CaseUC-15 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright + mock timer

Bước thực hiện:

#Hành độngKết quả mong đợi
1Redirect đến VNPAY, không thao tác
2Đợi > 15 phút (mock)VNPAY timeout, callback fail
3Kiểm tra đơn hàngTrạ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ínhChi tiết
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ênP1 — Critical
Use CaseUC-16 — Luồng chính
LoạiFunctional — Integration
Tự động hóaAPI test (Supertest)

Dữ liệu test:

#Địa chỉĐơn vị VCTrọng lượngPhí mong đợi (VNĐ)Thời gian
1Q1, TP.HCM (nội thành)GHTK2kg15,000 – 25,0001–2 ngày
2Hà Nội (liên tỉnh)GHN3kg30,000 – 50,0003–5 ngày
3Đà NẵngViettel Post5kg35,000 – 55,0002–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ínhChi tiết
TC-PAY-005
Tiêu đềĐăng ký trả góp qua HD Saison thành công
Mức ưu tiênP2 — High
Use CaseUC-17 — Luồng chính
LoạiFunctional — Integration
Tự động hóaSemi-auto (partner sandbox)
Tiền điều kiệnSP có giá ≥ 3,000,000 VNĐ (điều kiện trả góp)

Bước thực hiện:

#Hành độngKết quả mong đợi
1Chọn PTTT: "Trả góp qua HD Saison"Hiển thị bảng kỳ hạn: 6/9/12/18/24 tháng
2Chọn kỳ hạn 12 thángHiển thị: Trả trước, Số tiền trả/tháng, Lãi suất, Tổng thanh toán
3Nhập thông tin: CMND/CCCD, Thu nhập, Nghề nghiệp
4Upload ảnh CCCD (mặt trước/sau)Preview ảnh
5Click "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ínhChi tiết
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ênP2 — High
Use CaseUC-17 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Checkout với đơn hàng 2,000,000 VNĐOption "Trả góp" bị disable hoặc ẩn
2Hover vào option trả gópTooltip: "Đơ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ínhChi tiết
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ênP1 — Critical
Use CaseUC-18 — Luồng chính
SRS RefFR-ORD-05
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /tai-khoan/don-hangDanh sách đơn hàng, mới nhất trước, phân trang
2Kiểm tra thông tin mỗi đơnMã ĐH, Ngày đặt, Tổng tiền, Trạng thái (badge màu), Số SP
3Lọc "Đang giao"Chỉ hiển thị ĐH trạng thái SHIPPING
4Lọc "Đã hoàn thành"Chỉ hiển thị ĐH trạng thái DELIVERED
5Click vào 1 đơn hàngChi tiết đơn hàng hiển thị

TC-ORD-002: Xem chi tiết đơn hàng và tracking

Thuộc tínhChi tiết
TC-ORD-002
Tiêu đềChi tiết đơn hàng hiển thị đầy đủ thông tin và timeline
Mức ưu tiênP1 — Critical
Use CaseUC-18 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Mở chi tiết ĐH đang giao
2Kiểm tra Thông tin chungMã ĐH, Ngày đặt, Trạng thái, PTTT, PTVC
3Kiểm tra TimelineStepper hiển thị: Đặt hàng → Xác nhận → Đang giao → Đã giao
4Kiểm tra Danh sách SPẢnh, Tên, Biến thể, SL, Giá
5Kiểm tra Tóm tắtTạm tính, Phí VC, Giảm giá, Tổng cộng
6Kiểm tra Mã vận đơnLink 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ínhChi tiết
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ênP1 — Critical
Use CaseUC-19 — Luồng chính
SRS RefFR-ORD-06
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test (State Transition Testing):

#Trạng thái hiện tạiCho phép hủy?Kết quả
1✅ PENDING_CONFIRMATIONHủy ngay, không cần duyệt
2✅ CONFIRMEDHủy cần chọn lý do
3✅ PENDING_PAYMENTHủy ngay
4❌ PREPARINGKhôngNút hủy ẩn, hướng dẫn liên hệ CSKH
5❌ SHIPPINGKhôngNút hủy ẩn
6❌ DELIVEREDKhôngKhông hủy, chỉ "Yêu cầu hoàn trả"

Bước thực hiện (trạng thái CONFIRMED):

#Hành độngKết quả mong đợi
1Mở chi tiết ĐH trạng thái CONFIRMEDNút "Hủy đơn hàng" hiển thị
2Click "Hủy đơn hàng"Modal: Chọn lý do (radio buttons)
3Chọn "Tìm thấy giá tốt hơn"
4Click "Xác nhận hủy"Trạng thái → CANCELLED, toast thành công
5Kiểm tra tồn khoSố lượng SP hoàn lại kho
6Kiểm tra emailNhận email xác nhận hủy đơn
7Nếu đã thanh toán onlineTự độ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ínhChi tiết
TC-ORD-004
Tiêu đềHoàn tiền tự động khi hủy đơn đã thanh toán online
Mức ưu tiênP1 — Critical
Use CaseUC-19 — Luồng thay thế
LoạiFunctional — Integration
Tự động hóaAPI test

Bước thực hiện:

#Hành độngKết quả mong đợi
1Hủy ĐH đã thanh toán VNPAY (1,000,000 VNĐ)Tạo refund request
2Kiểm tra refund qua VNPAY APIRefund request gửi thành công
3(Simulate) VNPAY callback refund successĐH: REFUNDED, email thông báo
4Kiểm tra lịch sử thanh toánGhi 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ínhChi tiết
TC-REV-001
Tiêu đềViết đánh giá với rating và ảnh cho SP đã mua
Mức ưu tiênP2 — High
Use CaseUC-20 — Luồng chính
SRS RefFR-REV-01
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnĐã mua SP và ĐH trạng thái DELIVERED

Bước thực hiện:

#Hành độngKết quả mong đợi
1Mở trang SP đã mua hoặc chi tiết ĐHNút "Viết đánh giá" hiển thị
2Click "Viết đánh giá"Form: Rating (1-5 sao), Tiêu đề, Nội dung, Upload ảnh
3Chọn 4 sao4 sao sáng
4Nhập tiêu đề + nội dung (≥ 20 ký tự)
5Upload 3 ảnh (JPG, < 5MB/ảnh)Preview 3 ảnh
6Click "Gửi đánh giá"Toast: "Đánh giá đã được gửi, đang chờ duyệt"
7Kiểm tra trạng tháiĐánh giá PENDING_APPROVAL
8(Admin duyệt)Đánh giá hiển thị trên trang SP
9Thử đá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ínhChi tiết
TC-REV-002
Tiêu đềKhông cho phép đánh giá SP chưa mua
Mức ưu tiênP2 — High
Use CaseUC-20 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Đăng nhập, truy cập trang SP chưa muaKhông có nút "Viết đánh giá"
2Kiể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ínhChi tiết
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ênP2 — High
Use CaseUC-21 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright
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 độngKết quả mong đợi
1Mở chi tiết ĐH đã giao (< 7 ngày)Nút "Yêu cầu hoàn trả" hiển thị
2Click "Yêu cầu hoàn trả"Form: Chọn SP, Lý do (dropdown), Mô tả chi tiết, Upload ảnh/video
3Chọn SP, lý do "Sản phẩm lỗi"
4Upload 2 ảnh chứng minhPreview ảnh
5Click "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"
6Kiểm tra trạng thái ĐHRETURN_REQUESTED

TC-ORD-006: Hoàn trả — Quá hạn 7 ngày

Thuộc tínhChi tiết
TC-ORD-006
Tiêu đềTừ chối hoàn trả khi quá thời hạn 7 ngày
Mức ưu tiênP2 — High
Use CaseUC-21 — Luồng ngoại lệ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Mở chi tiết ĐH đã giao > 7 ngàyNút "Yêu cầu hoàn trả" bị ẩn hoặc disable
2Kiể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ínhChi tiết
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ênP2 — High
Use CaseUC-13 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Dữ liệu test (Decision Table):

#LoạiGiảmMax giảmĐơn hàngTính toánGiảm thực
1SALE20%20%2,000,0005,000,0005tr × 20% = 1tr1,000,000
2SALE20%20%2,000,00015,000,00015tr × 20% = 3tr > max2,000,000
3FLAT1MCố định1,000,0008,000,0001,000,000
4FLAT1MCố định1,000,000800,000Giả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ínhChi tiết
TC-PRM-002
Tiêu đềChỉ áp dụng 1 mã giảm giá cho mỗi đơn hàng
Mức ưu tiênP2 — High
Use CaseUC-13 — Quy tắc nghiệp vụ
LoạiFunctional — Negative
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Áp dụng mã GIAM10 thành côngGiảm 10%
2Thử nhập thêm mã GIAM500KLỗi: "Chỉ áp dụng 1 mã giảm giá. Bạn muốn thay thế mã hiện tại?"
3Click "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ínhChi tiết
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ênP1 — Critical
Use CaseNotification — Email transactional
SRS RefFR-NTF-01
LoạiFunctional — Integration
Tự động hóaAPI test + mail interceptor

Bước thực hiện:

#Hành độngKết quả mong đợi
1Đặt hàng thành công
2Kiểm tra email (< 1 phút)Email "Xác nhận đơn hàng #[Mã ĐH]" từ [email protected]
3Kiểm tra nội dung emailLogo TechVN, mã ĐH, danh sách SP (ảnh, tên, SL, giá), Tổng, Địa chỉ, PTVC, PTTT
4Kiểm tra responsive emailHiển thị đúng trên Gmail, Outlook, mobile
5Kiểm tra link trong emailLink "Xem đơn hàng" dẫn đúng đến chi tiết ĐH

TC-NTF-002: SMS OTP

Thuộc tínhChi tiết
TC-NTF-002
Tiêu đềGửi SMS OTP qua SpeedSMS thành công
Mức ưu tiênP1 — Critical
Use CaseUC-02 — Xác thực OTP
LoạiFunctional — Integration
Tự động hóaAPI test

Bước thực hiện:

#Hành độngKết quả mong đợi
1Trigger OTP (đăng ký/quên MK)API gọi SpeedSMS thành công
2Kiểm tra SMSNội dung: "Ma xac thuc TechVN: [6 so]. Het han sau 5 phut."
3Kiểm tra thời gian gửiSMS nhận trong < 30 giây
4Kiểm tra OTP trong DBHash 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ínhChi tiết
TC-ADM-001
Tiêu đềAdmin thêm sản phẩm mới với đầy đủ thông tin
Mức ưu tiênP1 — Critical
Use CaseUC-22 — Luồng chính
SRS RefFR-ADM-01
LoạiFunctional — Positive
Tự động hóaPlaywright
Tiền điều kiệnĐăng nhập admin role ACT-ADMIN-PRD

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /admin/san-pham/them-moiForm thêm SP: Thông tin cơ bản, Thông số kỹ thuật, Giá, Ảnh, SEO
2Nhập tên SP, chọn danh mục, nhập SKUAuto-generate slug SEO
3Nhập giá gốc: 25,000,000 VNĐFormat tự động: "25.000.000 ₫"
4Nhập giá sale: 22,990,000 VNĐHiển thị % giảm: "-8%"
5Upload 5 ảnh SPPreview gallery, kéo thả sắp xếp thứ tự
6Nhập thông số kỹ thuật (bảng dynamic)Thêm/sửa/xóa từng dòng spec
7Nhập mô tả (Rich Text Editor)WYSIWYG editor, upload ảnh inline
8Nhập SEO: Meta title, Meta descriptionPreview snippet Google
9Click "Lưu nháp"SP tạo với trạng thái DRAFT, toast thành công
10Click "Xuất bản"SP chuyển ACTIVE, hiển thị trên website
11Kiểm tra FrontendSP xuất hiện trong danh mục đúng

TC-ADM-002: Import sản phẩm hàng loạt

Thuộc tínhChi tiết
TC-ADM-002
Tiêu đềImport danh sách sản phẩm từ file Excel/CSV
Mức ưu tiênP2 — High
Use CaseUC-22 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaAPI test

Dữ liệu test:

#FileSố dòngKết quả
1✅ valid_products.xlsx50Import 50/50 thành công
2❌ missing_sku.xlsx50Import 48/50, 2 lỗi "Thiếu SKU"
3❌ duplicate_sku.xlsx50Import 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ínhChi tiết
TC-ADM-003
Tiêu đềAdmin sửa thông tin sản phẩm đang active
Mức ưu tiênP1 — Critical
Use CaseUC-22 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Tìm SP trong danh sách adminKết quả hiển thị
2Click "Sửa"Form pre-fill data hiện tại
3Đổi giá sale: 22,990,000 → 19,990,000
4Click "Cập nhật"Toast thành công, audit log ghi nhận thay đổi
5Kiểm tra FrontendGiá mới hiển thị trên trang SP
6Kiểm tra cache invalidationCDN 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ínhChi tiết
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ênP1 — Critical
Use CaseUC-25 — Luồng chính
SRS RefFR-ADM-03
LoạiFunctional — E2E
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /admin/don-hangDanh sách ĐH, filter "Chờ xác nhận"
2Click vào ĐH pendingChi tiết đơn: SP, KH, Địa chỉ, PTTT
3Kiểm tra tồn khoTất cả SP trong ĐH có đủ tồn kho
4Click "Xác nhận đơn hàng"Trạng thái → CONFIRMED
5Click "Tạo vận đơn"Gọi API ĐVVC, nhận mã vận đơn
6Kiểm tra mã vận đơnHiển thị mã vận đơn + link tracking
7Click "Bàn giao vận chuyển"Trạng thái → SHIPPING
8Kiểm tra tồn khoSố lượng SP giảm tương ứng
9Kiểm tra notificationKH nhận email + SMS "Đơn hàng đang được giao"

TC-ADM-005: Từ chối đơn hàng

Thuộc tínhChi tiết
TC-ADM-005
Tiêu đềAdmin từ chối đơn hàng với lý do
Mức ưu tiênP2 — High
Use CaseUC-25 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Mở ĐH pending, click "Từ chối"Modal: chọn lý do, ghi chú
2Chọn "Hết hàng" + ghi chú
3Click "Xác nhận từ chối"Trạng thái → REJECTED
4Kiểm tra nếu đã thanh toán onlineTự động tạo refund request
5Kiểm tra notification KHEmail: "Đơn hàng đã bị hủy vì [lý do]"

TC-ADM-006: Xử lý yêu cầu hoàn trả

Thuộc tínhChi tiết
TC-ADM-006
Tiêu đềAdmin duyệt/từ chối yêu cầu hoàn trả
Mức ưu tiênP2 — High
Use CaseUC-25 — Luồng thay thế
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /admin/hoan-traDanh sách yêu cầu hoàn trả
2Mở yêu cầu, xem ảnh/video KH gửiHiển thị bằng chứng
3aClick "Chấp nhận"Trạng thái → RETURN_APPROVED, email KH hướng dẫn gửi hàng
3bClick "Từ chối" + lý doTrạ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ínhChi tiết
TC-ADM-007
Tiêu đềKiểm tra phân quyền truy cập theo role admin
Mức ưu tiênP1 — Critical
Use CaseUC-27 — Luồng chính
SRS RefFR-ADM-05
LoạiFunctional — Security — Authorization
Tự động hóaPlaywright + API test

Dữ liệu test (Authorization Matrix):

Chức năngACT-ADMIN-PRDACT-ADMIN-ORDACT-ADMIN-MKTACT-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 độngKết quả mong đợi
1Đăng nhập ACT-ADMIN-PRDSidebar: chỉ hiển thị menu Sản phẩm, Dashboard
2Truy cập /admin/don-hang (bằng URL)403 Forbidden hoặc redirect về trang chủ admin
3Gọi API POST /admin/orders/:id/confirmResponse: 403
4Đăng nhập ACT-SUPER-ADMINSidebar: hiển thị tất cả menu
5Truy cập mọi trang adminTruy cập thành công

TC-ADM-008: Super Admin tạo tài khoản admin mới

Thuộc tínhChi tiết
TC-ADM-008
Tiêu đềSuper Admin tạo tài khoản admin với role chỉ định
Mức ưu tiênP1 — Critical
Use CaseUC-27 — Luồng chính
LoạiFunctional — Positive
Tự động hóaPlaywright

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /admin/phan-quyen/them-moiForm: Họ tên, Email nội bộ, Role (dropdown), MFA bắt buộc
2Nhập thông tin, chọn role "Quản lý đơn hàng"
3Click "Tạo tài khoản"Tài khoản tạo, email mời gửi đến admin mới
4Admin mới đăng nhậpBuộc đổi MK, thiết lập MFA
5Kiểm tra quyềnChỉ 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ínhChi tiết
TC-ADM-009
Tiêu đềDashboard hiển thị KPI và biểu đồ chính xác
Mức ưu tiênP2 — High
Use CaseUC-26 — Luồng chính
SRS RefFR-ADM-04
LoạiFunctional — Positive
Tự động hóaManual + API verification

Bước thực hiện:

#Hành độngKết quả mong đợi
1Truy cập /admin/dashboardTrang dashboard tải < 3s
2Kiểm tra KPI cardsDoanh thu hôm nay, Đơn hàng mới, Khách hàng mới, Sản phẩm bán chạy
3Kiểm tra biểu đồ doanh thuLine chart doanh thu 30 ngày, dữ liệu khớp DB
4Chọn date range "Tháng 4/2026"Biểu đồ và KPI cập nhật theo range
5Click "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


9.1 Performance Testing

TC-NFR-001: Thời gian tải trang chủ

Thuộc tínhChi tiết
TC-NFR-001
Tiêu đềTrang chủ tải trong < 2 giây (LCP)
Mức ưu tiênP1 — Critical
SRS RefNFR-PERF-01
LoạiPerformance — Core Web Vitals
Công cụLighthouse, WebPageTest

Tiêu chí Pass:

MetricMục tiêuĐo tại
LCP (Largest Contentful Paint)< 2.5sMobile 4G
FID (First Input Delay)< 100msMobile
CLS (Cumulative Layout Shift)< 0.1Mobile + Desktop
TTFB (Time to First Byte)< 600msServer-side
Speed Index< 3.4sMobile 4G

TC-NFR-002: Tải trang chi tiết sản phẩm

Thuộc tínhChi tiết
TC-NFR-002
Tiêu đềTrang chi tiết SP tải < 3 giây với đầy đủ ảnh
Mức ưu tiênP1 — Critical
LoạiPerformance
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ínhChi tiết
TC-NFR-003
Tiêu đềAPI endpoints phản hồi trong thời gian cho phép
Mức ưu tiênP1 — Critical
LoạiPerformance — API
Công cụk6

Tiêu chí (P95):

APIMethodP95P99
/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ínhChi tiết
TC-NFR-004
Tiêu đềHệ thống chịu được 500 người dùng đồng thời
Mức ưu tiênP1 — Critical
LoạiPerformance — Load test
Công cụk6
Môi trườngPre-production

Kịch bản k6:

Giai đoạnVUsThời gianMục đích
Ramp up0 → 5005 phútTăng tải dần
Sustained50015 phútGiữ tải
Spike500 → 10002 phútKiểm tra spike
Ramp down1000 → 05 phútGiảm tải

Tiêu chí Pass:

MetricMụ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ínhChi tiết
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ênP2 — High
LoạiPerformance — 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ínhChi tiết
TC-NFR-006
Tiêu đềHệ thống miễn nhiễm với SQL Injection
Mức ưu tiênP1 — Critical
LoạiSecurity — OWASP A03
Công cụOWASP ZAP, Manual

Dữ liệu test:

#InputVị tríKết quả mong đợi
1' OR '1'='1Login emailTừ chối, log warning
2'; DROP TABLE users;--Search boxTrả về "Không tìm thấy", DB an toàn
3" OR ""="Mọi input fieldSanitize, không thực thi SQL
41; UPDATE products SET price=0Product ID param400 Bad Request

TC-NFR-007: XSS (Cross-Site Scripting)

Thuộc tínhChi tiết
TC-NFR-007
Tiêu đềHệ thống miễn nhiễm với XSS attacks
Mức ưu tiênP1 — Critical
LoạiSecurity — OWASP A07
Công cụOWASP ZAP, Manual

Dữ liệu test:

#PayloadVị tríKết quả mong đợi
1<script>alert('XSS')</script>Tên SP, Review, Tìm kiếmHTML escaped, script không chạy
2<img src=x onerror=alert('XSS')>Review nội dungTag bị strip/escape
3javascript:alert(1)URL paramKhông execute
4"><svg onload=alert(1)>Mọi inputSanitize đúng

TC-NFR-008: CSRF Protection

Thuộc tínhChi tiết
TC-NFR-008
Tiêu đềAPI chống tấn công CSRF
Mức ưu tiênP1 — Critical
LoạiSecurity — OWASP A01
Công cụManual, Burp Suite

Bước thực hiện:

#Hành độngKết quả mong đợi
1Tạo form HTML giả lập POST đến /api/orders
2Mở form từ domain khác khi user đã login TechVNRequest bị từ chối (403 hoặc CSRF token invalid)
3Kiểm tra cookie flagsSameSite=Strict hoặc Lax, HttpOnly, Secure

TC-NFR-009: Authentication & Session

Thuộc tínhChi tiết
TC-NFR-009
Tiêu đềJWT token security và session management
Mức ưu tiênP1 — Critical
LoạiSecurity — Authentication
Công cụManual, Burp Suite

Dữ liệu test:

#Kịch bảnKết quả mong đợi
1Gửi request với expired JWT401 Unauthorized
2Gửi request với tampered JWT401 Unauthorized
3Refresh token rotationToken cũ bị revoke sau khi refresh
4Concurrent loginSession cũ bị invalidate (hoặc theo policy)
5LogoutaccessToken và refreshToken bị revoke

TC-NFR-010: Rate Limiting

Thuộc tínhChi tiết
TC-NFR-010
Tiêu đềAPI rate limiting hoạt động đúng
Mức ưu tiênP1 — Critical
LoạiSecurity — DDoS mitigation
Công cụk6, curl

Dữ liệu test:

#EndpointLimitKịch bảnKết quả
1/api/auth/login5 req/phút/IPGửi 10 requests liên tụcRequest 6→10: 429 Too Many Requests
2/api/auth/otp3 req/phút/SĐTGửi 5 requestsRequest 4→5: 429
3/api/products60 req/phút/IPGửi 100 requestsRequest 61→100: 429
4/api/search30 req/phút/IPGửi 50 requestsRequest 31→50: 429

TC-NFR-011: Sensitive Data Exposure

Thuộc tínhChi tiết
TC-NFR-011
Tiêu đềKhông lộ dữ liệu nhạy cảm trong API response
Mức ưu tiênP1 — Critical
LoạiSecurity — Data Protection
Công cụManual API review

Dữ liệu test:

#APIKiểm traKết quả mong đợi
1GET /api/users/mePassword fieldKhông chứa password, password_hash
2GET /api/orders/:idThông tin KHChe SĐT: 090***4567, che email 1 phần
3Error response (500)Stack traceKhông lộ stack trace, file path, DB query
4API headersServer infoKhông lộ X-Powered-By, Server version

9.3 Compatibility Testing

TC-NFR-012: Cross-browser testing

Thuộc tínhChi tiết
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ênP2 — High
LoạiCompatibility — Browser
Công cụBrowserStack

Ma trận test:

BrowserVersionDesktopMobile
ChromeLatest, Latest-1✅ (Android)
SafariLatest, Latest-1✅ (macOS)✅ (iOS)
FirefoxLatest
EdgeLatest
Samsung InternetLatest

Checklist mỗi browser:

#Kiểm traPass/Fail
1Layout không bị vỡ
2Font hiển thị đúng
3Ảnh tải đúng (WebP fallback)
4Form submit hoạt động
5Thanh toán hoạt động
6Responsive breakpoints

TC-NFR-013: Responsive design

Thuộc tínhChi tiết
TC-NFR-013
Tiêu đềWebsite responsive trên các kích thước màn hình
Mức ưu tiênP2 — High
LoạiCompatibility — Responsive
Công cụChrome DevTools, BrowserStack

Breakpoints:

BreakpointWidthKiểm tra
Mobile S320pxLayout 1 cột, hamburger menu, ảnh full-width
Mobile L414pxLayout 1 cột, product card stack
Tablet768pxLayout 2 cột, sidebar collapse
Laptop1024pxLayout 3 cột, sidebar visible
Desktop1440pxLayout đầy đủ, max-width container

9.4 Accessibility Testing

TC-NFR-014: WCAG 2.1 AA Compliance

Thuộc tínhChi tiết
TC-NFR-014
Tiêu đềWebsite đạt chuẩn WCAG 2.1 Level AA
Mức ưu tiênP3 — Medium
LoạiAccessibility
Công cụaxe-core, Lighthouse

Checklist:

#Tiêu chíChi tiết
1Contrast ratioText ≥ 4.5:1, Large text ≥ 3:1
2Keyboard navigationTất cả chức năng accessible bằng Tab, Enter, Space
3Screen readerHeading hierarchy đúng, alt text cho ảnh, ARIA labels
4Focus indicatorVisible focus outline trên mọi interactive element
5Form labelsMọi input có associated label, error messages accessible
6Skip navigation"Skip to content" link ở đầu trang

9.5 SEO Testing

TC-NFR-015: SEO Technical

Thuộc tínhChi tiết
TC-NFR-015
Tiêu đềĐảm bảo các yếu tố SEO kỹ thuật
Mức ưu tiênP2 — High
LoạiSEO
Công cụLighthouse, Google Search Console

Checklist:

#Kiểm traKết quả mong đợi
1Meta title mỗi trangUnique, 30-60 ký tự
2Meta descriptionUnique, 120-160 ký tự
3Heading structureH1 unique/page, H2-H6 hierarchy đúng
4Structured data (JSON-LD)Product, BreadcrumbList, Organization valid
5Canonical URLMỗi trang có canonical URL đúng
6Sitemap.xmlTất cả trang public, cập nhật lastmod
7Robots.txtBlock /admin, /api, /tai-khoan
8Open Graph tagsog:title, og:description, og:image cho share social
9SSR/SSG renderingGooglebot 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ínhChi tiết
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ênP1 — Critical
LoạiData Integrity — Concurrency
Công cụk6 + DB query

Kịch bản:

#TestKết quả mong đợi
110 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ờiTồn kho = tồn kho ban đầu (zero-sum)
3Giá SP thay đổi giữa chừng checkoutĐơn hàng giữ giá tại thời điểm bắt đầu checkout
4Thanh toán double-submitChỉ tạo 1 đơn hàng (idempotent)

10. Ma trận truy vết Test Case

10.1 Use Case → Test Case

Use CaseTest CasesSố TCCoverage
UC-01: Đăng kýTC-ACC-001 → TC-ACC-0077Luồng chính + 4 ngoại lệ
UC-02: Xác thực OTPTC-ACC-005, TC-ACC-006, TC-NTF-0023Hết hạn + brute-force + SMS
UC-03: Đăng nhậpTC-ACC-008 → TC-ACC-010, TC-ACC-0134Luồng chính + 3 ngoại lệ
UC-04: OAuthTC-ACC-011, TC-ACC-0122Google + Facebook
UC-05: Khôi phục MKTC-ACC-014 → TC-ACC-0163Luồng chính + hết hạn + one-time
UC-06: Hồ sơ cá nhânTC-ACC-017 → TC-ACC-0193Profile + Địa chỉ + Đổi MK
UC-07: Duyệt danh mụcTC-CAT-001 → TC-CAT-0033Danh mục + Phân trang + Sắp xếp
UC-08: Chi tiết SPTC-CAT-004 → TC-CAT-0063Đầy đủ info + Biến thể + Hết hàng
UC-09: Tìm kiếmTC-CAT-007, TC-CAT-0082Từ khóa + Autocomplete
UC-10: Lọc SPTC-CAT-009, TC-CAT-0102Khoảng giá + Kết hợp
UC-11: So sánhTC-CAT-0111So sánh 2-4 SP
UC-12: Giỏ hàngTC-CRT-001 → TC-CRT-0044Thêm + Sửa SL + Xóa + Merge
UC-13: Mã giảm giáTC-CHK-004, TC-PRM-001, TC-PRM-0023Áp dụng + Decision table + Chồng mã
UC-14: CheckoutTC-CHK-001 → TC-CHK-0033COD E2E + Validation + Race condition
UC-15: Thanh toánTC-PAY-001 → TC-PAY-0044VNPAY + Hủy + MoMo + Timeout
UC-16: Vận chuyểnTC-CHK-0051Tính phí theo khu vực
UC-17: Trả gópTC-PAY-005, TC-PAY-0062Thành công + Không đủ ĐK
UC-18: Theo dõi ĐHTC-ORD-001, TC-ORD-0022Lịch sử + Chi tiết + Tracking
UC-19: Hủy ĐHTC-ORD-003, TC-ORD-0042Hủy + Hoàn tiền
UC-20: Đánh giáTC-REV-001, TC-REV-0022Đánh giá + Chưa mua
UC-21: Hoàn trảTC-ORD-005, TC-ORD-0062Hoàn trả + Quá hạn
UC-22: QL SP AdminTC-ADM-001 → TC-ADM-0033Thêm + Import + Sửa
UC-25: QL ĐH AdminTC-ADM-004 → TC-ADM-0063Xác nhận + Từ chối + Hoàn trả
UC-26: DashboardTC-ADM-0091KPI + Biểu đồ
UC-27: Phân quyềnTC-ADM-007, TC-ADM-0082Authorization matrix + Tạo admin

10.2 SRS → Test Case

SRS RefTest Cases
FR-ACC-01TC-ACC-001 → TC-ACC-007
FR-ACC-02TC-ACC-008 → TC-ACC-013
FR-ACC-03TC-ACC-014 → TC-ACC-016
FR-PRD-01TC-CAT-001 → TC-CAT-003
FR-PRD-02TC-CAT-004 → TC-CAT-006
FR-PRD-03TC-CAT-007, TC-CAT-008
FR-PRD-04TC-CAT-009, TC-CAT-010
FR-ORD-01TC-CRT-001 → TC-CRT-004
FR-ORD-02TC-CHK-001 → TC-CHK-005
FR-ORD-03TC-PAY-001 → TC-PAY-006
FR-ORD-05TC-ORD-001 → TC-ORD-006
FR-PRM-01TC-CHK-004, TC-PRM-001, TC-PRM-002
FR-REV-01TC-REV-001, TC-REV-002
FR-NTF-01TC-NTF-001, TC-NTF-002
FR-ADM-01TC-ADM-001 → TC-ADM-003
FR-ADM-03TC-ADM-004 → TC-ADM-006
FR-ADM-04TC-ADM-009
FR-ADM-05TC-ADM-007, TC-ADM-008
NFR-PERF-01TC-NFR-001 → TC-NFR-005
NFR-SEC-01TC-NFR-006 → TC-NFR-011

11. Thống kê tổng hợp

11.1 Phân bố Test Case theo Module

ModuleSố TCP1P2P3P4
Account (ACC)1910900
Catalog (CAT)113710
Cart (CRT)43100
Checkout (CHK)53200
Payment (PAY)63300
Order (ORD)63300
Review (REV)20200
Promotion (PRM)20200
Notification (NTF)21100
Admin (ADM)94500
Non-Functional (NFR)169520
Tổng82394030

11.2 Phân bố theo Loại Test

LoạiSố TC
Functional — Positive38
Functional — Negative20
Functional — Security6
Functional — Integration10
Functional — E2E3
Performance5
Security (OWASP)6
Compatibility2
Accessibility1
SEO1
Data Integrity1

11.3 Phân bố theo Release

ReleaseTest CasesPhải Pass
R1 — MVPTC-ACC-, TC-CAT-001→006, TC-CRT-, TC-CHK-001→003, TC-ORD-, TC-ADM-004→008, TC-NTF-52 TC
R2 — PaymentTC-PAY-*, TC-CHK-004→005, TC-PAY-005→00610 TC
R3 — GrowthTC-CAT-007→011, TC-PRM-*, TC-ADM-001→003, TC-ADM-00910 TC
Pre-Go-liveTC-NFR-* (toàn bộ phi chức năng)16 TC
Tổng82 TC

11.4 Tỷ lệ tự động hóa mục tiêu

Phương phápSố TCTỷ lệ
Playwright (E2E automated)4858.5%
API test (Supertest/k6)1417.1%
Semi-automated44.9%
Manual only1619.5%
Tổng8280.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ạiMô tảNguồn
1Tài khoản test10 accounts (guest, customer, 4 admin roles)Seed script
2Sản phẩm test50 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 test20 ĐH (mỗi trạng thái 2 đơn)Seed script
4Mã giảm giá10 mã (các loại, hết hạn, đã dùng, chưa dùng)Seed script
5Địa chỉ test5 địa chỉ (nội thành HCM, Hà Nội, miền Trung, miền Tây, hải đảo)Manual
6File import3 file Excel (valid, partial error, invalid format)Manual
7Ảnh test10 ảnh (JPG, PNG, WebP, > 5MB, corrupt)Manual
8Payment sandboxVNPAY sandbox + MoMo sandbox credentialsDevOps

C. Glossary

Thuật ngữĐịnh nghĩa
TCTest Case
TSTest Suite
VUVirtual User (k6)
P95/P99Percentile 95/99 — giá trị mà 95%/99% request nhanh hơn
LCPLargest Contentful Paint — thời gian render phần tử lớn nhất
CLSCumulative Layout Shift — mức độ xê dịch layout
TTFBTime to First Byte — thời gian nhận byte đầu tiên từ server
IdempotentGọi nhiều lần cùng kết quả (không tạo duplicate)
Race conditionLỗ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.

Last updated: