improve BA skill
This commit is contained in:
215
ba-output/e-commerce/03-specification/AC_US-002_v1.0.md
Normal file
215
ba-output/e-commerce/03-specification/AC_US-002_v1.0.md
Normal file
@@ -0,0 +1,215 @@
|
||||
# AC — Acceptance Criteria — US-002 Xem giỏ hàng nhóm theo seller
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Version** | 1.0 |
|
||||
| **Date** | 2026-09-08 |
|
||||
| **Author** | BA (qua skill ba-3-specification) |
|
||||
| **Status** | 🟡 Draft |
|
||||
| **Approved by** | QA: — *(chưa có QA thật tham gia lần chạy này)* |
|
||||
| **Source** | `SRS_US002-003_v1.0.md` · `RBAC_CartCheckout_v1.0.md` §2, §6 |
|
||||
| **Scope** | US-002 |
|
||||
|
||||
## Change Log
|
||||
|
||||
| Version | Date | Người sửa | Thay đổi | CR |
|
||||
|---|---|---|---|---|
|
||||
| 1.0 | 2026-09-08 | BA (qua skill ba-3-specification) | Bản đầu — 6 AC, 4 nhóm | — |
|
||||
|
||||
---
|
||||
|
||||
## 1. Bốn nhóm bắt buộc
|
||||
|
||||
| Nhóm | Nội dung | Tối thiểu | Số AC đã viết |
|
||||
|---|---|---|---|
|
||||
| 1. Luồng thành công | Xem giỏ hàng nhóm theo seller | 1/hành động | 2 |
|
||||
| 2. Validation | Không áp dụng — US-002 không có input do người dùng nhập, chỉ hiển thị (xem lý do dưới) | — | 0 (N/A có lý do) |
|
||||
| 3. Lỗi hệ thống | Timeout, 5xx, phân biệt "rỗng thật" vs "không tải được" | ≥1 | 2 |
|
||||
| 4. Phân quyền | Không đủ quyền, hết phiên | ≥1/vai trò bị chặn | 2 |
|
||||
|
||||
**Vì sao Nhóm 2 (Validation) ghi N/A:** US-002 là hành động **xem** thuần tuý (`SCR-04` khi mở màn hình) — không có trường nào do người dùng nhập trong phạm vi US-002 (nhập số lượng thuộc US-003, xem `AC_US-003_v1.0.md`). Đây không phải "chỉ có nhóm 1" (vi phạm nguyên tắc), vì Nhóm 3 và Nhóm 4 đã viết đủ.
|
||||
|
||||
---
|
||||
|
||||
## 2. Danh sách AC
|
||||
|
||||
### Nhóm 1 — Luồng thành công
|
||||
|
||||
#### AC-US002-01 — Xem giỏ hàng có nhiều seller
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04 · C01, C02, C03–C06, C08, C09, C11 |
|
||||
| **Vai trò** | ROLE-02 Customer (hành vi tương tự với ROLE-01 Guest, khác ở định danh `X-Guest-Session-Id` thay JWT) |
|
||||
|
||||
```
|
||||
Given tôi đăng nhập với ROLE-02 (Customer) và giỏ hàng của tôi (Cart.status=active) có 5 CartItem:
|
||||
3 CartItem thuộc seller "Shop A", 2 CartItem thuộc seller "Shop B"
|
||||
When tôi mở SCR-04 (Giỏ hàng)
|
||||
Then hệ thống hiển thị đúng 2 nhóm theo seller ("Shop A", "Shop B"), mỗi nhóm hiển thị đúng
|
||||
số CartItem thuộc nhóm đó
|
||||
And tạm tính mỗi nhóm (C08) bằng Σ (quantity × đơn giá hiển thị) của các CartItem trong
|
||||
nhóm đó
|
||||
And tổng cộng giỏ hàng (C09) bằng Σ tất cả C08
|
||||
And nút "Tiến hành Checkout" (C11) hiển thị và không bị disable
|
||||
```
|
||||
|
||||
**Dữ liệu mẫu để test:**
|
||||
|
||||
| Field | Giá trị |
|
||||
|---|---|
|
||||
| Shop A — CartItem 1 | quantity=2, đơn giá=100.000 ₫ |
|
||||
| Shop A — CartItem 2 | quantity=1, đơn giá=50.000 ₫ |
|
||||
| Shop A — CartItem 3 | quantity=1, đơn giá=75.000 ₫ |
|
||||
| Shop A — tạm tính (C08) kỳ vọng | 2×100.000 + 1×50.000 + 1×75.000 = 325.000 ₫ |
|
||||
| Shop B — CartItem 1 | quantity=1, đơn giá=200.000 ₫ |
|
||||
| Shop B — CartItem 2 | quantity=2, đơn giá=30.000 ₫ |
|
||||
| Shop B — tạm tính (C08) kỳ vọng | 1×200.000 + 2×30.000 = 260.000 ₫ |
|
||||
| Tổng cộng (C09) kỳ vọng | 325.000 + 260.000 = 585.000 ₫ |
|
||||
|
||||
#### AC-US002-02 — Xem giỏ hàng rỗng
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04 · C10, C11 |
|
||||
| **Vai trò** | ROLE-01, ROLE-02 |
|
||||
|
||||
```
|
||||
Given tôi đăng nhập với ROLE-02 và giỏ hàng của tôi không có CartItem nào (Cart.status=active,
|
||||
0 dòng)
|
||||
When tôi mở SCR-04
|
||||
Then hệ thống hiển thị trạng thái "Giỏ hàng trống" (khoá cart.empty.title) và nút
|
||||
"Tiếp tục mua sắm" (C10)
|
||||
And nút "Tiến hành Checkout" (C11) không hiển thị/bị disable — theo §2.A.3.6 của SRS
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Nhóm 2 — Validation
|
||||
|
||||
*N/A — xem lý do ở mục 1.*
|
||||
|
||||
---
|
||||
|
||||
### Nhóm 3 — Lỗi hệ thống
|
||||
|
||||
#### AC-US002-03 — Lỗi hệ thống khi tải giỏ hàng
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04 · C12, C13 |
|
||||
| **Vai trò** | ROLE-01, ROLE-02 |
|
||||
|
||||
```
|
||||
Given tôi đăng nhập với ROLE-02
|
||||
When tôi mở SCR-04 và GET /v1/cart trả về 500/503 hoặc timeout (ngưỡng — xem NFR §1, OQ-033)
|
||||
Then hệ thống hiển thị banner lỗi "Không tải được dữ liệu, thử lại." (E-CART-0004) tại vùng
|
||||
danh sách
|
||||
And nút "Thử lại" (C13) hiển thị; bấm vào gọi lại GET /v1/cart
|
||||
```
|
||||
|
||||
Ba tình huống tối thiểu của nhóm này:
|
||||
|
||||
| # | Tình huống | AC |
|
||||
|---|---|---|
|
||||
| 1 | Server trả 5xx | AC-US002-03 |
|
||||
| 2 | Timeout / mất mạng | AC-US002-03 |
|
||||
| 3 | Dữ liệu bị người khác sửa/xoá trong lúc mình đang mở | Không áp dụng ở US-002 (chỉ xem, không sửa) — xem `AC_US-003_v1.0.md` §3 Nhóm 3 (`AC-US003-11`) cho trường hợp này khi có thao tác sửa/xoá |
|
||||
|
||||
#### AC-US002-04 — Phân biệt "giỏ hàng chưa từng có dữ liệu" và "không tải được"
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04 · C10, C12 |
|
||||
| **Vai trò** | ROLE-02 |
|
||||
|
||||
```
|
||||
Given tôi đăng nhập với ROLE-02 lần đầu, chưa từng thêm sản phẩm nào vào giỏ (Cart mới tạo,
|
||||
0 CartItem); GET /v1/cart trả 200 với danh sách rỗng
|
||||
When tôi mở SCR-04
|
||||
Then hệ thống hiển thị trạng thái "Giỏ hàng trống" (không phải banner lỗi C12)
|
||||
And hai trạng thái "giỏ hàng trống thật" (AC-US002-02/04) và "không tải được" (AC-US002-03)
|
||||
dùng hai khối hiển thị khác nhau (data-state khác nhau trong WF), không dùng chung một
|
||||
thông điệp — kiểm chứng bằng cách tắt mạng khi mở màn hình lần đầu (kỳ vọng thấy banner
|
||||
lỗi, KHÔNG phải "Giỏ hàng trống")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Nhóm 4 — Phân quyền
|
||||
|
||||
#### AC-US002-05 — Guest chỉ thấy giỏ hàng của session mình
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04 |
|
||||
| **Vai trò** | ROLE-01 |
|
||||
|
||||
```
|
||||
Given tôi là Guest với X-Guest-Session-Id = S1; một Guest khác có giỏ hàng thuộc session S2
|
||||
(không phải của tôi)
|
||||
When tôi gọi GET /v1/cart với header X-Guest-Session-Id: S1
|
||||
Then hệ thống chỉ trả về giỏ hàng gắn với S1 (dữ liệu của chính tôi), không có cách nào lộ
|
||||
dữ liệu của S2 qua endpoint này (endpoint không nhận cartId của người khác qua tham số)
|
||||
```
|
||||
|
||||
#### AC-US002-06 — Customer hết phiên đăng nhập cố xem giỏ hàng
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Liên quan** | SCR-04, SCR-08 (đăng nhập) |
|
||||
| **Vai trò** | ROLE-02 |
|
||||
|
||||
```
|
||||
Given tôi trước đó đã đăng nhập và có giỏ hàng theo customer_id; nay access token đã hết hạn
|
||||
(401 ERR_AUTH_INVALID_TOKEN)
|
||||
When tôi mở SCR-04
|
||||
Then hệ thống chuyển hướng về màn đăng nhập (SCR-08)
|
||||
And giữ đường dẫn quay lại SCR-04 sau khi đăng nhập thành công (theo UICONV §2)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Bảng dữ liệu biên
|
||||
|
||||
*N/A — US-002 không có field nhập liệu (chỉ xem). Xem `AC_US-003_v1.0.md` §4 cho F01 (số lượng).*
|
||||
|
||||
---
|
||||
|
||||
## 4. Kịch bản kết hợp
|
||||
|
||||
| # | Kịch bản | Các bước | AC liên quan |
|
||||
|---|---|---|---|
|
||||
| S1 | Mở giỏ hàng nhiều seller rồi tiến hành checkout | SCR-04 (mở, kiểm tra tổng đúng) → bấm "Tiến hành Checkout" (C11) → điều hướng SCR-05 (chỉ kiểm tra điều hướng, ngoài phạm vi hành vi SCR-05) | AC-US002-01 |
|
||||
|
||||
---
|
||||
|
||||
## 5. Truy vết
|
||||
|
||||
| AC | US | BR | Field/Thành phần | Mã lỗi | Test case (QA điền) | Kết quả (QA điền) |
|
||||
|---|---|---|---|---|---|---|
|
||||
| AC-US002-01 | US-002 | — | C01, C02, C03–C06, C08, C09, C11 | — | | |
|
||||
| AC-US002-02 | US-002 | BR §3 CART | C10, C11 | — | | |
|
||||
| AC-US002-03 | US-002 | — | C12, C13 | E-CART-0004 | | |
|
||||
| AC-US002-04 | US-002 | — | C10, C12 | E-CART-0004 | | |
|
||||
| AC-US002-05 | US-002 | RBAC §2 | — | — | | |
|
||||
| AC-US002-06 | US-002 | — | — | — | | |
|
||||
|
||||
---
|
||||
|
||||
## 6. Xác nhận của QA
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Người xác nhận** | *(chưa có — chưa có QA thật tham gia lần chạy này)* |
|
||||
| **Ngày** | — |
|
||||
| ☐ Mọi AC đều test được (không có AC mô tả cảm tính) | |
|
||||
| ☐ Đủ 4 nhóm (Nhóm 2 N/A có lý do) | |
|
||||
| ☐ Bảng dữ liệu biên đủ dùng để viết test case (N/A — không có field ở US-002) | |
|
||||
| ☐ Không có AC nào mâu thuẫn với AC khác | |
|
||||
|
||||
**AC bị QA từ chối:**
|
||||
|
||||
| AC | Lý do từ chối | BA sửa thế nào |
|
||||
|---|---|---|
|
||||
| | | |
|
||||
Reference in New Issue
Block a user