@educa-corp/sdd-framework 0.9.6 → 0.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lint-trace.js +4 -4
- package/bin/qc-base-map.json +13 -11
- package/bin/self-check.js +497 -16
- package/bin/trace-schema.json +3226 -2656
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/amend-prd.md +7 -1
- package/core/commands/debug.md +8 -2
- package/core/commands/define-product.md +38 -1
- package/core/commands/dev-gen-test.md +9 -3
- package/core/commands/dev-run-test.md +8 -2
- package/core/commands/dev-smoke-test.md +7 -1
- package/core/commands/extend-prd.md +7 -1
- package/core/commands/fix-bug.md +11 -5
- package/core/commands/generate-architecture.md +9 -1
- package/core/commands/generate-bdd.md +45 -5
- package/core/commands/generate-code.md +43 -4
- package/core/commands/generate-design-spec.md +7 -1
- package/core/commands/generate-prd.md +9 -1
- package/core/commands/generate-spec-manifest.md +7 -1
- package/core/commands/generate-tech-docs.md +41 -1
- package/core/commands/learn.md +7 -1
- package/core/commands/map-testids.md +11 -5
- package/core/commands/propose-scenario.md +7 -1
- package/core/commands/qc-analyze.md +12 -6
- package/core/commands/qc-automation-assess.md +356 -0
- package/core/commands/qc-design-script.md +430 -0
- package/core/commands/qc-design-test.md +98 -20
- package/core/commands/qc-plan.md +9 -3
- package/core/commands/qc-report.md +92 -77
- package/core/commands/qc-review-script.md +342 -0
- package/core/commands/{qc-review.md → qc-review-testcase.md} +86 -54
- package/core/commands/qc-run-manualtest.md +401 -0
- package/core/commands/qc-run-script.md +421 -0
- package/core/commands/refine-prd.md +7 -1
- package/core/commands/report-bug.md +9 -3
- package/core/commands/review-code.md +9 -3
- package/core/commands/review-context.md +11 -3
- package/core/commands/review-tech-docs.md +11 -3
- package/core/commands/setup-ai-first.md +7 -1
- package/core/commands/validate-traces.md +10 -4
- package/core/modules/qc-playwright-ts/module.yaml +13 -0
- package/core/modules/qc-playwright-ts/stack-profile.yaml +99 -0
- package/core/modules/qc-wdio-appium/module.yaml +20 -0
- package/core/modules/qc-wdio-appium/stack-profile.yaml +107 -0
- package/core/rules/workflow.md +2 -2
- package/core/skills/qc/_shared/self-review-principles.md +2 -2
- package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
- package/core/skills/qc/qa-analyst/data-flow.md +1 -1
- package/core/skills/qc/qa-analyst/spec-issue-reporter.md +1 -1
- package/core/skills/qc/qa-automation-assess/matrix.md +123 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +1 -1
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +1 -1
- package/core/skills/qc/{qa-runner → qa-designer}/exploratory/session.md +8 -2
- package/core/skills/qc/qa-designer/functional/api.md +2 -2
- package/core/skills/qc/qa-designer/functional/gui-feature.md +1 -1
- package/core/skills/qc/qa-designer/functional/gui-screen.md +1 -1
- package/core/skills/qc/qa-designer/functional/job.md +128 -0
- package/core/skills/qc/qa-designer/integration/api.md +2 -2
- package/core/skills/qc/qa-designer/integration/db.md +2 -2
- package/core/skills/qc/qa-designer/integration/gui.md +1 -1
- package/core/skills/qc/qa-designer/integration/{kafka.md → queue.md} +21 -5
- package/core/skills/qc/qa-designer/non-functional.md +1 -1
- package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +17 -0
- package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +28 -6
- package/core/skills/qc/qa-reviewer/script/_shared/review-rules.md +121 -0
- package/core/skills/qc/qa-reviewer/script/api/auth.md +49 -0
- package/core/skills/qc/qa-reviewer/script/api/endpoint.md +89 -0
- package/core/skills/qc/qa-reviewer/script/api/security.md +46 -0
- package/core/skills/qc/qa-reviewer/script/exploratory.md +3 -3
- package/core/skills/qc/qa-reviewer/script/mobile/e2e.md +41 -0
- package/core/skills/qc/qa-reviewer/script/mobile/functional.md +90 -0
- package/core/skills/qc/qa-reviewer/script/mobile/integration.md +41 -0
- package/core/skills/qc/qa-reviewer/script/mobile/non-functional.md +43 -0
- package/core/skills/qc/qa-reviewer/script/web/e2e.md +46 -0
- package/core/skills/qc/qa-reviewer/script/web/functional.md +111 -0
- package/core/skills/qc/qa-reviewer/script/web/integration.md +46 -0
- package/core/skills/qc/qa-reviewer/script/web/non-functional.md +49 -0
- package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +1 -1
- package/core/skills/qc/qa-reviewer/shared/review-file-template.md +29 -10
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +2 -2
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +1 -1
- package/core/skills/qc/qa-reviewer/test-case/functional.md +2 -2
- package/core/skills/qc/qa-reviewer/test-case/integration.md +2 -2
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +2 -2
- package/core/skills/qc/qa-script-designer/_shared/api-conventions.md +94 -0
- package/core/skills/qc/qa-script-designer/_shared/file-naming-and-folders.md +109 -0
- package/core/skills/qc/qa-script-designer/_shared/mobile-conventions.md +196 -0
- package/core/skills/qc/qa-script-designer/_shared/web-conventions.md +257 -0
- package/core/skills/qc/qa-script-designer/api/auth.md +43 -0
- package/core/skills/qc/qa-script-designer/api/endpoint.md +61 -0
- package/core/skills/qc/qa-script-designer/api/security.md +41 -0
- package/core/skills/qc/qa-script-designer/mobile/e2e.md +35 -0
- package/core/skills/qc/qa-script-designer/mobile/functional/feature.md +32 -0
- package/core/skills/qc/qa-script-designer/mobile/functional/screen.md +42 -0
- package/core/skills/qc/qa-script-designer/mobile/integration.md +39 -0
- package/core/skills/qc/qa-script-designer/mobile/non-functional.md +39 -0
- package/core/skills/qc/qa-script-designer/web/e2e.md +36 -0
- package/core/skills/qc/qa-script-designer/web/functional/api.md +39 -0
- package/core/skills/qc/qa-script-designer/web/functional/gui-feature.md +34 -0
- package/core/skills/qc/qa-script-designer/web/functional/gui-screen.md +42 -0
- package/core/skills/qc/qa-script-designer/web/integration.md +43 -0
- package/core/skills/qc/qa-script-designer/web/non-functional.md +42 -0
- package/core/skills/qc/qa-script-runner/mobile/run.md +38 -0
- package/core/skills/qc/qa-script-runner/report.md +41 -0
- package/core/skills/qc/qa-script-runner/web/run.md +48 -0
- package/core/steps/context-loader.md +1 -1
- package/core/steps/gate.md +7 -1
- package/core/steps/qc-scope.md +45 -2
- package/core/steps/qc-stamp.md +4 -4
- package/core/steps/report-footer.md +10 -9
- package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +1 -1
- package/docs/02-concepts/pipeline-steps/08-qc-automation.md +13 -12
- package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +3 -3
- package/docs/02-concepts/traceability.md +1 -1
- package/docs/03-guides/developer.md +1 -1
- package/docs/03-guides/tester-qa.md +40 -11
- package/docs/04-reference/commands.md +4 -2
- package/docs/04-reference/modules.md +2 -1
- package/docs/04-reference/trace-schema.md +4 -4
- package/docs/explain/17-qc-design-test.md +5 -5
- package/docs/explain/18-qc-review.md +42 -20
- package/docs/explain/19-qc-run-test.md +13 -10
- package/docs/explain/20-qc-report.md +3 -3
- package/docs/explain/23-fix-bug.md +2 -2
- package/docs/explain/README.md +2 -2
- package/docs/plans/qc-surgery/01-checklist.md +86 -21
- package/docs/plans/qc-surgery/PLAN_v2.md +295 -0
- package/docs/plans/qc-surgery/exec-S-ap-stack-typescript.md +420 -0
- package/docs/plans/qc-surgery/exec-S0-guard-cam-stack-cu.md +400 -0
- package/docs/plans/qc-surgery/exec-S1-hai-module-thay-qc-playwright.md +267 -0
- package/docs/plans/qc-surgery/exec-S2-qa-runner-thanh-script-designer-runner.md +340 -0
- package/docs/plans/qc-surgery/exec-S3-viet-lai-tieu-chi-review-script.md +322 -0
- package/docs/plans/qc-surgery/exec-S5-an-theo-don-dau-vet-stack-cu.md +292 -0
- package/package.json +1 -1
- package/core/commands/qc-run-test.md +0 -561
- package/core/modules/qc-playwright/stack-profile.yaml +0 -66
- package/core/skills/qc/qa-reviewer/script/e2e.md +0 -95
- package/core/skills/qc/qa-reviewer/script/functional.md +0 -109
- package/core/skills/qc/qa-reviewer/script/integration.md +0 -99
- package/core/skills/qc/qa-reviewer/script/non-functional.md +0 -134
- package/core/skills/qc/qa-runner/e2e.md +0 -49
- package/core/skills/qc/qa-runner/functional/api.md +0 -35
- package/core/skills/qc/qa-runner/functional/gui-feature.md +0 -57
- package/core/skills/qc/qa-runner/functional/gui-screen.md +0 -61
- package/core/skills/qc/qa-runner/integration.md +0 -47
- package/core/skills/qc/qa-runner/non-functional.md +0 -49
- package/core/skills/qc/qa-runner/report/report.md +0 -37
|
@@ -13,7 +13,7 @@ Review session note sau khi test, coaching QC cải thiện kỹ năng.
|
|
|
13
13
|
- Khi lead/senior muốn đánh giá chất lượng session của junior
|
|
14
14
|
|
|
15
15
|
## Khi KHÔNG trigger
|
|
16
|
-
-
|
|
16
|
+
- Soát script tự động → dùng `web/functional.md` · `mobile/functional.md` · `api/endpoint.md` theo nền
|
|
17
17
|
- Review charter → dùng qa-reviewer/test-case/exploratory
|
|
18
18
|
|
|
19
19
|
---
|
|
@@ -41,13 +41,13 @@ Review session note sau khi test, coaching QC cải thiện kỹ năng.
|
|
|
41
41
|
|
|
42
42
|
**Điểm `XX/100`** — ánh xạ mức độ sang điểm trừ: 🔴 = `FAIL` (−5đ) · 🟠 = `WARN` (−2đ) ·
|
|
43
43
|
🟡 = ghi nhận, không trừ. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
|
|
44
|
-
**Verdict:** `≥
|
|
44
|
+
**Verdict:** suy từ **số đếm lỗi** theo `../shared/review-file-template.md` §Verdict — `≥1 BLOCKER` → `REJECTED` · `≥1 MAJOR` → `REVISION_REQUIRED` · chỉ MINOR/SUGGESTION → `APPROVED_WITH_SUGGESTIONS` · sạch → `APPROVED`.
|
|
45
45
|
|
|
46
46
|
**Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — thêm một hàng vào bảng Tổng quan
|
|
47
47
|
(cột `Tầng` phân biệt vai soát-code với vai soát-kịch-bản; **không ghi đè** hàng của vai kia).
|
|
48
48
|
Khuôn + quy tắc ghi: `../shared/review-file-template.md`.
|
|
49
49
|
|
|
50
|
-
**KHÔNG tự sửa code** — chỉ nêu `file:line` + cách sửa. Người sửa là `/qc-
|
|
50
|
+
**KHÔNG tự sửa code** — chỉ nêu `file:line` + cách sửa. Người sửa là `/qc-design-script`.
|
|
51
51
|
Mỗi tiêu chí: ✅/⚠️/❌ + feedback cụ thể
|
|
52
52
|
Top 3 improvement suggestions (coaching tone)
|
|
53
53
|
Đề xuất charter tiếp theo nếu chưa đủ coverage
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Mobile-Automation-Standards.md §5 §9 §11 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Mobile E2E *(hành trình xuyên nhiều màn app)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` rồi `functional.md` cùng nền.**
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Soát script đi trọn một hành trình trong app, qua nhiều màn.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Thêm gì so với functional
|
|
17
|
+
|
|
18
|
+
### A · Một hành trình = một test
|
|
19
|
+
|
|
20
|
+
- Chia thành nhiều `it()` phụ thuộc nhau ⇒ **BLOCKER** — chạy riêng lẻ là fail
|
|
21
|
+
- Chia chặng bằng `describe`/step để report Allure đọc được; >5 thao tác mà không chia ⇒ **MINOR**
|
|
22
|
+
|
|
23
|
+
### B · Điều hướng và trạng thái app
|
|
24
|
+
|
|
25
|
+
- Quay lại bằng `driver.back()` mà không assert đã về đúng màn ⇒ **MAJOR**
|
|
26
|
+
- Không reset app giữa các hành trình *(`driver.reset()` hoặc fixture)* ⇒ **MAJOR** — trạng thái rò
|
|
27
|
+
|
|
28
|
+
### C · Gesture trong hành trình dài
|
|
29
|
+
|
|
30
|
+
- Cuộn tìm phần tử phải có **giới hạn số lần**; cuộn vô hạn ⇒ **MAJOR** *(treo cho tới timeout)*
|
|
31
|
+
|
|
32
|
+
### D · Flaky *(§11)*
|
|
33
|
+
|
|
34
|
+
- E2E mobile là nơi flaky sống nhất *(mạng + emulator + animation)*. Test đỏ-xanh thất thường mà
|
|
35
|
+
không tag `@flaky` ⇒ **MAJOR**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Kiểm cơ học + Output
|
|
40
|
+
|
|
41
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Mobile-Automation-Standards.md §4 §6 §7 §8 §9 §10 §11 §12 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Mobile Functional *(WebdriverIO + Appium + TypeScript)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` trước.** File này chỉ có phần riêng của nền app.
|
|
10
|
+
|
|
11
|
+
> ⚠️ **Đây KHÔNG phải bản web đổi tên.** Chuẩn mobile khác web ở bốn chỗ có thật: thứ tự locator,
|
|
12
|
+
> gesture, đối chiếu dữ liệu server, và kiểm môi trường. Soát mobile bằng checklist web là bỏ sót cả bốn.
|
|
13
|
+
|
|
14
|
+
## Khi nào trigger
|
|
15
|
+
- Soát script functional cho nền `app` (`app-ios` · `app-android`), sau `/qc-design-script`.
|
|
16
|
+
|
|
17
|
+
## Khi KHÔNG trigger
|
|
18
|
+
- Nền `web` → `../web/functional.md` · nền `system` → `../api/endpoint.md`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1 — Đọc đủ *(R01)*
|
|
23
|
+
|
|
24
|
+
1. `mobile-automation/tests/{TICKET-ID}/<feature>-*.spec.ts`
|
|
25
|
+
2. `mobile-automation/screens/<feature>.screen.ts` + `base.screen.ts`
|
|
26
|
+
3. `helpers/{api,device,gesture}.helper.ts` nếu spec dùng
|
|
27
|
+
4. `wdio.config.ts` · `.env.example` — biết thiết bị và endpoint
|
|
28
|
+
5. `.Test.md` + `AUTOMATION_ASSESSMENT.md`
|
|
29
|
+
|
|
30
|
+
**R07 chặn cửa** như mọi lane.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Phase 2 — Sáu nhóm soát của nền app
|
|
35
|
+
|
|
36
|
+
### A · Screen Object *(§4)* — KHÔNG gọi là Page
|
|
37
|
+
|
|
38
|
+
- `extends BaseScreen`; class `<Feature>Screen`; file `<feature>.screen.ts`
|
|
39
|
+
- Đặt tên `Page`/`page.ts` ở nền app ⇒ **MINOR** nhưng phải sửa — làm người sau tra nhầm chuẩn
|
|
40
|
+
- Không `expect()` trong Screen Object ⇒ **MAJOR**
|
|
41
|
+
|
|
42
|
+
### B · Locator *(§7.1)* — thứ tự KHÁC HẲN web
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
~accessibilityId → id (resource-id) → xpath (cuối cùng, phải ghi lý do)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- Dùng `getByRole` / `getByLabel` *(của web)* ⇒ **BLOCKER** — không tồn tại ở Appium
|
|
49
|
+
- `xpath` không kèm comment lý do ⇒ **MAJOR**
|
|
50
|
+
- `~accessibilityId` yêu cầu dev gán `content-desc`; locator trỏ id chưa có trong bảng §4.5.6
|
|
51
|
+
⇒ **MAJOR** kèm đề nghị bổ sung vào tech-doc
|
|
52
|
+
|
|
53
|
+
### C · Gesture *(§9)*
|
|
54
|
+
|
|
55
|
+
- Vuốt/cuộn viết tay bằng toạ độ **rải trong spec** ⇒ **MAJOR** — phải qua `helpers/gesture.helper.ts`
|
|
56
|
+
- Toạ độ hard-code không kèm ghi chú độ phân giải ⇒ **MINOR**: đúng trên một máy, sai trên máy khác
|
|
57
|
+
|
|
58
|
+
### D · Đối chiếu dữ liệu server *(§6)*
|
|
59
|
+
|
|
60
|
+
- Spec `*-api-sync.spec.ts` phải dùng `helpers/api.helper.ts` *(Playwright `request`)*
|
|
61
|
+
- Chỉ assert trên màn hình, không đối chiếu server ⇒ **MAJOR**: một màn hiển thị đúng **dữ liệu cũ**
|
|
62
|
+
vẫn là bug, và UI assertion không bắt được
|
|
63
|
+
|
|
64
|
+
### E · Wait *(§8)* và độ ổn định
|
|
65
|
+
|
|
66
|
+
- `browser.pause(...)` cứng ⇒ **MAJOR**; dùng `waitForDisplayed({ timeout })`
|
|
67
|
+
- Luồng có dialog quyền mà spec không xử lý ⇒ **MAJOR** — nó nuốt thao tác đầu tiên
|
|
68
|
+
|
|
69
|
+
### F · Môi trường *(§12 — Gate 6B)*
|
|
70
|
+
|
|
71
|
+
- Đọc `API_BASE_URL` từ `.env`, hard-code ⇒ **MAJOR**
|
|
72
|
+
- Spec giả định emulator/APK sẵn sàng: **không** phải lỗi của spec, nhưng biên bản phải nhắc
|
|
73
|
+
checklist §12 chạy **trước** lượt execute
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Phase 3 — Kiểm cơ học
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
npx tsc --noEmit
|
|
81
|
+
npx wdio ./wdio.config.ts --dry-run
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Số test phải bằng số TC `Automatable: Y`. Lệch ⇒ **BLOCKER**.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Output
|
|
89
|
+
|
|
90
|
+
Theo `_shared/review-rules.md` §3, kèm ≥2–3 điểm tốt *(R05)*.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Mobile-Automation-Standards.md §5.3 §6 §8 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Mobile Integration *(app ↔ backend)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` rồi `functional.md` cùng nền.** Đây là phần thêm.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Soát script kiểm app **giao tiếp với server thật**: gửi lên, nhận về, đồng bộ sau thao tác.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Thêm gì so với functional
|
|
17
|
+
|
|
18
|
+
### A · `*-api-sync.spec.ts` là tầng này, không phải functional
|
|
19
|
+
|
|
20
|
+
- Chuẩn tách hẳn một loại spec cho việc này *(§5.3)*. Trộn kiểm đồng bộ vào spec functional
|
|
21
|
+
⇒ **MINOR** — nhưng phải tách, vì hai loại có điều kiện môi trường khác nhau
|
|
22
|
+
|
|
23
|
+
### B · Hai phía phải cùng được assert
|
|
24
|
+
|
|
25
|
+
- Thao tác trên app → assert UI **và** gọi `api.helper.ts` kiểm bản ghi trên server
|
|
26
|
+
- Chỉ một phía ⇒ **MAJOR**
|
|
27
|
+
|
|
28
|
+
### C · Trạng thái mạng
|
|
29
|
+
|
|
30
|
+
- Không kiểm nhánh mất mạng / timeout khi `.Test.md` có ⇒ **MAJOR**
|
|
31
|
+
- Dùng `browser.setNetworkConditions` hoặc cơ chế tương đương, không mock ở tầng UI
|
|
32
|
+
|
|
33
|
+
### D · Dọn dữ liệu
|
|
34
|
+
|
|
35
|
+
- Bản ghi tạo qua app phải được xoá qua API trong `after`, kể cả khi test fail ⇒ thiếu là **MAJOR**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Kiểm cơ học + Output
|
|
40
|
+
|
|
41
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Mobile-Automation-Standards.md §8 §11 §12 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Mobile Non-Functional
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` rồi `functional.md` cùng nền.**
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Soát script kiểm thuộc tính phi chức năng của app: thời gian mở màn, bộ nhớ, quyền, đa thiết bị.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Thêm gì so với functional
|
|
17
|
+
|
|
18
|
+
### A · Ngưỡng là con số
|
|
19
|
+
|
|
20
|
+
- Assert hiệu năng không có ngưỡng cụ thể ⇒ **BLOCKER**
|
|
21
|
+
- Đo thời gian mở màn bằng mốc **sự kiện** *(`waitForDisplayed` trả về)*, không bằng `pause` rồi trừ
|
|
22
|
+
|
|
23
|
+
### B · Quyền và bảo mật
|
|
24
|
+
|
|
25
|
+
- Kiểm từ chối quyền: phải assert app **xử lý được**, không crash ⇒ assert yếu ⇒ **MAJOR**
|
|
26
|
+
- Credential/token thật trong code ⇒ **BLOCKER**; đọc từ `.env`
|
|
27
|
+
|
|
28
|
+
### C · Đa thiết bị
|
|
29
|
+
|
|
30
|
+
- Chạy đa cấu hình bằng **capabilities trong `wdio.config.ts`**, không lặp tay trong spec
|
|
31
|
+
⇒ lặp tay ⇒ **MAJOR**
|
|
32
|
+
- Chỉ một emulator rồi gọi là kiểm tương thích ⇒ **MAJOR**
|
|
33
|
+
|
|
34
|
+
### D · Môi trường *(§12)*
|
|
35
|
+
|
|
36
|
+
- Kết quả phi chức năng **không có nghĩa** nếu checklist Gate 6B chưa chạy. Biên bản phải nêu
|
|
37
|
+
đã chạy hay chưa; không nêu ⇒ **MINOR**
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Kiểm cơ học + Output
|
|
42
|
+
|
|
43
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Automation-Standards.md §5 §11 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Web E2E *(hành trình xuyên nhiều màn)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` trước**, rồi `functional.md` cùng nền.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Soát script đi **trọn một hành trình người dùng** qua nhiều màn, nhiều vai.
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Một màn → `functional.md` · hai thành phần → `integration.md`
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Thêm gì so với functional
|
|
20
|
+
|
|
21
|
+
### A · Hành trình phải là một test
|
|
22
|
+
|
|
23
|
+
- Chia hành trình thành nhiều `test()` phụ thuộc nhau ⇒ **BLOCKER** — chạy riêng lẻ là fail,
|
|
24
|
+
và Playwright **không bảo đảm thứ tự** khi chạy song song
|
|
25
|
+
- Một hành trình = một `test()`, các chặng chia bằng `test.step()` để report đọc được
|
|
26
|
+
- Thiếu `test.step()` cho hành trình >5 thao tác ⇒ **MINOR** — fail ở đâu không ai biết
|
|
27
|
+
|
|
28
|
+
### B · Vai và phiên
|
|
29
|
+
|
|
30
|
+
- Đổi vai giữa chừng phải qua `storageState` riêng hoặc `browser.newContext()`, **không**
|
|
31
|
+
logout/login trong cùng context ⇒ làm sai ⇒ **MAJOR** *(rò trạng thái giữa hai vai)*
|
|
32
|
+
|
|
33
|
+
### C · Độ dài và chi phí
|
|
34
|
+
|
|
35
|
+
- Hành trình >15 chặng mà không tách được ⇒ **MINOR** kèm đề nghị tách; E2E dài là E2E flaky
|
|
36
|
+
- E2E **không** kiểm lại thứ functional đã kiểm — trùng lặp ⇒ **SUGGESTION**
|
|
37
|
+
|
|
38
|
+
### D · Flaky
|
|
39
|
+
|
|
40
|
+
- E2E là nơi flaky sống *(§11)*. Không có tag `@flaky` cho test đã đỏ-xanh thất thường ⇒ **MAJOR**
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Kiểm cơ học + Output
|
|
45
|
+
|
|
46
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Automation-Standards.md §4 §6 §7 §8 §9 §10 §11 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Web Functional *(Playwright Test + TypeScript)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` trước.** File này chỉ có phần riêng của nền web, tầng
|
|
10
|
+
functional.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Soát script cho TC functional (1 màn hoặc đa màn) của một PRD, nền `web`, sau `/qc-design-script`.
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Nền `app` → `../mobile/functional.md` · nền `system` → `../api/endpoint.md`
|
|
17
|
+
- Soát **test case** *(không phải code)* → `/qc-review-testcase`
|
|
18
|
+
- Soát biên bản exploratory → `../exploratory.md`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1 — Đọc đủ trước khi soát *(R01)*
|
|
23
|
+
|
|
24
|
+
1. `automation/tests/{TICKET-ID}/<feature>-*.spec.ts` — **mọi** spec của feature
|
|
25
|
+
2. `automation/pages/<feature>.page.ts` + `base.page.ts`
|
|
26
|
+
3. `automation/data/<feature>.data.ts` · `fixtures/*.fixture.ts` nếu spec có dùng
|
|
27
|
+
4. `.Test.md` gốc + `AUTOMATION_ASSESSMENT.md` — để đếm TC `Automatable: Y`
|
|
28
|
+
|
|
29
|
+
**R07 chặn cửa:** spec thiếu header artifact ID / `@trace.verifies` ⇒ **BLOCKER, dừng soát.**
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Phase 2 — Bảy nhóm soát của nền web
|
|
34
|
+
|
|
35
|
+
### A · Page Object *(§4)*
|
|
36
|
+
|
|
37
|
+
- Có `extends BasePage`? Không kế thừa là chép lại method dùng chung → **MAJOR**
|
|
38
|
+
- **Không `expect()` trong Page Object** — assertion thuộc spec. Có ⇒ **MAJOR**
|
|
39
|
+
- Method 1 việc, đặt tên **camelCase động từ trước**: `login()` · `fillEmail()` ⇒ sai tên là MINOR
|
|
40
|
+
- Class `PascalCase` + hậu tố `Page`: `LoginPage` · file `kebab-case`: `login.page.ts`
|
|
41
|
+
- Locator khai **trong** Page Object, **không** hard-code trong spec ⇒ trong spec là **BLOCKER**
|
|
42
|
+
|
|
43
|
+
### B · Locator *(§6.1 · §6.2)*
|
|
44
|
+
|
|
45
|
+
Thứ tự ưu tiên bắt buộc:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
getByRole → getByLabel → getByPlaceholder → getByTestId → getByText → locator('[css]')
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- `locator('[css]')` mà **không có comment nêu lý do** ⇒ **MAJOR**
|
|
52
|
+
- Locator bám **class CSS tự sinh** (`.css-1x2y3z`, `.MuiBox-root-42`) ⇒ **MAJOR**
|
|
53
|
+
- XPath ⇒ **MAJOR** *(web có đủ 5 cách tốt hơn)*
|
|
54
|
+
- `.first()` / `.nth(n)` không kèm lý do ⇒ **MINOR** — vị trí đổi là test đổi
|
|
55
|
+
- **test-id lấy từ bảng §4.5.6 của tech-doc**, không dò DOM lúc chạy. Dò DOM ⇒ **MAJOR**
|
|
56
|
+
- Thuộc tính test-id ≠ `data-testid` mà **thiếu** `use: { testIdAttribute: '…' }` trong
|
|
57
|
+
`playwright.config.ts` ⇒ **BLOCKER** — `getByTestId()` sẽ trượt **100 %**, và nó trượt trông
|
|
58
|
+
**y hệt một bug sản phẩm**
|
|
59
|
+
|
|
60
|
+
### C · Assertion *(§7)*
|
|
61
|
+
|
|
62
|
+
- Dùng **web-first assertion** `await expect(locator).toBeVisible()` — tự retry
|
|
63
|
+
- `expect(await locator.isVisible()).toBe(true)` ⇒ **MAJOR**: chụp giá trị một lần, mất auto-retry
|
|
64
|
+
- Chỉ assert URL mà không assert nội dung ⇒ **MINOR** — điều hướng đúng không có nghĩa hiển thị đúng
|
|
65
|
+
- `expect(true).toBe(true)` hoặc assert không thể sai ⇒ **BLOCKER** *(test xanh giả)*
|
|
66
|
+
- Thiếu assertion âm cho nhánh lỗi mà `.Test.md` có ⇒ **MAJOR**
|
|
67
|
+
|
|
68
|
+
### D · Wait *(§8)*
|
|
69
|
+
|
|
70
|
+
- `waitForTimeout(…)` ⇒ **MAJOR** — chờ cứng, hỏng theo tốc độ máy
|
|
71
|
+
- Chờ theo **điều kiện**: `expect(...).toBeVisible()` · `waitForResponse` · `waitForURL`
|
|
72
|
+
- Timeout tự đặt < 3 s hoặc > 30 s mà không nêu lý do ⇒ **MINOR**
|
|
73
|
+
|
|
74
|
+
### E · Test structure *(§5)*
|
|
75
|
+
|
|
76
|
+
- Mỗi test **độc lập**: chạy riêng lẻ vẫn pass. Phụ thuộc thứ tự ⇒ **BLOCKER**
|
|
77
|
+
- `test.describe` gom theo màn/nhóm chức năng; tên test mang **TC-ID**
|
|
78
|
+
- Auth dùng `storageState` / fixture, **không** đăng nhập lại trong từng test ⇒ lặp login là **MINOR**
|
|
79
|
+
- Data từ `data/<feature>.data.ts`, **không** hard-code trong spec ⇒ hard-code là **MAJOR**
|
|
80
|
+
- Tạo data thì phải dọn *(teardown)*; trừ khi chỉ mock/intercept ⇒ thiếu dọn là **MAJOR**
|
|
81
|
+
|
|
82
|
+
### F · Code quality *(§9)*
|
|
83
|
+
|
|
84
|
+
- TypeScript **strict**: không `any`, không `as any` ⇒ có là **MINOR**
|
|
85
|
+
- Kiểu trả về khai tường minh cho method public
|
|
86
|
+
- Thứ tự import: Playwright → Page Object → data → helper
|
|
87
|
+
- Logic lặp ≥3 lần chưa tách ⇒ **MINOR**
|
|
88
|
+
|
|
89
|
+
### G · Anti-pattern *(§10)* và flaky *(§11)*
|
|
90
|
+
|
|
91
|
+
- Test flaky **không mang tag `@flaky`** mà vẫn nằm trong suite chính ⇒ **MAJOR**
|
|
92
|
+
- Tag `@flaky` có, nhưng **không có ghi chú điều tra** ⇒ **MINOR**
|
|
93
|
+
- `test.skip` không nêu lý do ⇒ **MINOR**; `test.only` sót lại ⇒ **BLOCKER** *(CI chạy 1 test rồi báo xanh)*
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Phase 3 — Kiểm cơ học *(bắt buộc — `_shared` §5)*
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
npx tsc --noEmit
|
|
101
|
+
npx playwright test automation/tests/{TICKET-ID}/<feature>-*.spec.ts --list
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Số test collect được **phải bằng** số TC `Automatable: Y` của feature này. Lệch ⇒ **BLOCKER**.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Output
|
|
109
|
+
|
|
110
|
+
Theo `_shared/review-rules.md` §3 — verdict suy từ số đếm, kèm **≥2–3 điểm tốt** *(R05)*.
|
|
111
|
+
Ghi vào `{qc_artifact_dir}test-cases/REVIEW_SCRIPT_<FEATURE>.md`.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Automation-Standards.md §5 §7 §8 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Web Integration *(GUI ↔ Backend · API · DB)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` trước**, rồi `functional.md` cùng nền — file này chỉ thêm
|
|
10
|
+
phần riêng của tầng tích hợp.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Soát script kiểm **giao tiếp giữa hai thành phần**: UI gọi API, API ghi DB, sự kiện qua queue.
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Chỉ kiểm UI một màn → `functional.md` · chỉ kiểm endpoint → `../api/endpoint.md`
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Thêm gì so với functional
|
|
21
|
+
|
|
22
|
+
### A · Ranh giới thật, không mock
|
|
23
|
+
|
|
24
|
+
- Tầng này tồn tại để kiểm **đường dây thật**. Mock hết hai đầu ⇒ **BLOCKER** — test không kiểm gì
|
|
25
|
+
- Mock **một** đầu để cô lập lỗi thì được, nhưng phải ghi rõ đầu nào thật
|
|
26
|
+
|
|
27
|
+
### B · Đối chiếu hai phía
|
|
28
|
+
|
|
29
|
+
- Assert trên UI **và** đối chiếu dữ liệu phía server *(qua `request` của Playwright)*
|
|
30
|
+
- Chỉ assert UI ⇒ **MAJOR**: màn hình hiển thị đúng **dữ liệu cũ** vẫn là bug, UI assertion không bắt được
|
|
31
|
+
|
|
32
|
+
### C · Trạng thái và thứ tự
|
|
33
|
+
|
|
34
|
+
- Data tạo ở bước trước phải được **dọn** kể cả khi test fail giữa chừng *(dùng `finally`/fixture)*
|
|
35
|
+
- Chờ theo **điều kiện của hệ**: `waitForResponse(...)` thay vì chờ cứng ⇒ chờ cứng là **MAJOR**
|
|
36
|
+
- Test phụ thuộc bản ghi có sẵn trên môi trường ⇒ **MAJOR** — môi trường sạch là fail oan
|
|
37
|
+
|
|
38
|
+
### D · Mã lỗi
|
|
39
|
+
|
|
40
|
+
- Nhánh lỗi tích hợp *(timeout, 5xx, kết nối đứt)* có được kiểm không? Thiếu hẳn ⇒ **MAJOR**
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Kiểm cơ học + Output
|
|
45
|
+
|
|
46
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-17
|
|
4
|
+
source: upstream/qc-base-new/Automation-Standards.md §7 §8 §10 (Approved)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Soát script — Web Non-Functional *(hiệu năng · bảo mật · a11y · tương thích)*
|
|
8
|
+
|
|
9
|
+
**Nạp `../_shared/review-rules.md` trước**, rồi `functional.md` cùng nền.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- Soát script kiểm thuộc tính **phi chức năng**: thời gian đáp ứng, kiểm soát truy cập, khả năng
|
|
13
|
+
tiếp cận, chạy đa trình duyệt.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Thêm gì so với functional
|
|
18
|
+
|
|
19
|
+
### A · Ngưỡng phải là con số, không phải cảm tưởng
|
|
20
|
+
|
|
21
|
+
- Assert hiệu năng **không có ngưỡng cụ thể** ⇒ **BLOCKER** — không có ngưỡng thì không có kết quả
|
|
22
|
+
- Ngưỡng hard-code trong spec thay vì đọc từ config/data ⇒ **MINOR**
|
|
23
|
+
- Đo bằng `Date.now()` quanh một `await` ⇒ **MINOR**; ưu tiên `page.evaluate(performance…)` hoặc
|
|
24
|
+
`waitForResponse` + timing của response
|
|
25
|
+
|
|
26
|
+
### B · Bảo mật
|
|
27
|
+
|
|
28
|
+
- Payload thử injection **hard-code trong spec** ⇒ **MAJOR** — để ở `data/`
|
|
29
|
+
- Kiểm quyền: phải assert **bị chặn** *(403/redirect/không thấy phần tử)*, không chỉ assert
|
|
30
|
+
"không lỗi" ⇒ assert yếu ⇒ **MAJOR**
|
|
31
|
+
- Credential thật trong code ⇒ **BLOCKER**
|
|
32
|
+
|
|
33
|
+
### C · Khả năng tiếp cận
|
|
34
|
+
|
|
35
|
+
- Dùng thư viện a11y qua Playwright *(vd `@axe-core/playwright`)*, assert trên **số vi phạm theo
|
|
36
|
+
mức**, không assert "có chạy"
|
|
37
|
+
- Không nêu tiêu chuẩn áp dụng (WCAG mức nào) ⇒ **MINOR**
|
|
38
|
+
|
|
39
|
+
### D · Tương thích
|
|
40
|
+
|
|
41
|
+
- Chạy đa trình duyệt bằng **`projects` trong `playwright.config.ts`**, không tự lặp trong spec
|
|
42
|
+
⇒ tự lặp ⇒ **MAJOR** *(mất song song, mất report tách theo project)*
|
|
43
|
+
- Chỉ khai một browser rồi gọi là "kiểm tương thích" ⇒ **MAJOR**
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Kiểm cơ học + Output
|
|
48
|
+
|
|
49
|
+
Như `functional.md` Phase 3 và §Output.
|
|
@@ -16,7 +16,7 @@ upstream_sha: 3caa1562399ef1167ac2dc620add2c6c729e55df
|
|
|
16
16
|
2. **`Read` toàn bộ DOC_GAP.** Định vị mục **`## Tài liệu đầu vào đã đọc để phân tích`** — bảng liệt kê **đầy đủ** file nguồn (cột "Đường dẫn", tính từ `{paths.specs_dir}/`), kèm vai trò & phiên bản.
|
|
17
17
|
3. **`Read` TỪNG file trong bảng đó** — ghép prefix `{paths.specs_dir}/` vào đường dẫn ở cột. Đọc HẾT, không bỏ sót dòng nào (spec chính + ref bắt buộc + transitive 1-hop). Nếu bảng liệt kê phiên bản, kiểm tra file hiện tại khớp; lệch phiên bản → ghi chú vào REVIEW.
|
|
18
18
|
4. **Đối chiếu chéo:** file nào có mặt ở header DOC_GAP ("Tài liệu nguồn (spec chính)"/"Coverage Attestation") mà thiếu trong bảng → vẫn đọc.
|
|
19
|
-
5. Chỉ sau khi đã nạp xong toàn bộ input + file domain (`business-dictionary.md`, `product-definition/`) mới bắt đầu review — dùng chúng làm chuẩn đối chiếu để phán quyết `APPROVED` / `
|
|
19
|
+
5. Chỉ sau khi đã nạp xong toàn bộ input + file domain (`business-dictionary.md`, `product-definition/`) mới bắt đầu review — dùng chúng làm chuẩn đối chiếu để phán quyết `APPROVED` / `REVISION_REQUIRED` / `REJECTED`.
|
|
20
20
|
|
|
21
21
|
## Nguyên tắc
|
|
22
22
|
|
|
@@ -12,7 +12,7 @@ upstream_sha: bd596393ecc016cbea106835681a4979c0a9ca0e
|
|
|
12
12
|
>
|
|
13
13
|
> | | Upstream | Ở đây | Vì sao |
|
|
14
14
|
> |---|---|---|---|
|
|
15
|
-
> | Verdict | `APPROVE` / `REJECT` |
|
|
15
|
+
> | Verdict | `APPROVE` / `REJECT` | **4 mức của `AGT-006`** *(xem §Verdict)* | **Đổi 2026-09-17, Bước S · S3.** Trước đó là `APPROVED`/`NEEDS_FIX` cho khớp `/review-code`. Nay lane QC có `AGT-006` §3.2 định nghĩa **severity thành bốn ô đếm được**, nên bốn verdict chỉ là **tên của bốn ô đó** — không thêm phán quyết nào, và ngưỡng qua cửa đã khai sẵn ở `AGT-005:132`. Lane DEV *(`/review-code` · `/review-context` · `/review-tech-docs`)* **giữ 2 mức** vì chưa có bảng severity tương ứng; ở đó 4 tên sẽ là bốn nhãn phải tự đoán. **Bất đối xứng có lý do, không phải chỗ quên đồng bộ** |
|
|
16
16
|
> | Bảng Tổng quan | mỗi vòng **ghi đè** hàng của tầng đó | mỗi vòng **thêm một hàng** | Ghi đè thì mất điểm vòng trước, và **không ai thấy được điểm có tăng không**. Các bảng chi tiết vẫn ghi đè (chúng là trạng thái hiện tại, tích luỹ chỉ thành nhiễu) |
|
|
17
17
|
|
|
18
18
|
# Khuôn file Review (dùng chung)
|
|
@@ -31,7 +31,7 @@ upstream_sha: bd596393ecc016cbea106835681a4979c0a9ca0e
|
|
|
31
31
|
giữa tài-liệu-nền-cũ và PRD đã duyệt là **lệch đồng bộ, KHÔNG chặn** — không phải mâu thuẫn
|
|
32
32
|
chặn. *(Khung "gap thật = QA KHÔNG tự quyết được" — xem `steps/gap-verify.md`.)*
|
|
33
33
|
- **KHÔNG tự sửa** kịch bản hay code. Chỉ nhận xét, chấm điểm, và nêu cụ thể sửa gì. Người sửa là
|
|
34
|
-
trạm 3 (`/qc-design-test`) hoặc trạm 5 (`/qc-run-
|
|
34
|
+
trạm 3 (`/qc-design-test`) hoặc trạm 5 (`/qc-run-script`).
|
|
35
35
|
|
|
36
36
|
## Kiểm tra cấu trúc TC (bắt buộc mỗi vòng)
|
|
37
37
|
|
|
@@ -41,7 +41,7 @@ upstream_sha: bd596393ecc016cbea106835681a4979c0a9ca0e
|
|
|
41
41
|
- **1 bullet Expected / TC (ATOMIC — đội QC chốt 2026-07-09):** mỗi TC có đúng **1**
|
|
42
42
|
`#### Expected Result` với **ĐÚNG 1 bullet**; Test Steps chỉ `[Action]`/`[Verify]`, **không**
|
|
43
43
|
còn `→ [Expected]` ở bước. Đếm nhanh: số header `### TC_` = số `#### Expected Result` = số
|
|
44
|
-
bullet Expected. **TC có ≥2 bullet → `
|
|
44
|
+
bullet Expected. **TC có ≥2 bullet → `MAJOR` `[MULTI_BULLET_EXPECTED]`**, yêu cầu tách
|
|
45
45
|
thành nhiều TC độc lập (mỗi TC 1 bullet, giữ full steps, đánh số lại tuần tự).
|
|
46
46
|
- **Soi bullet 2-kết-cục ẩn (ATOMIC = 1 KẾT CỤC, không chỉ đếm bullet):** bullet nối bằng `;`
|
|
47
47
|
kiểu "khẳng-định + phủ-định" (grep bullet chứa `;` **và** `không/KHÔNG`, vd
|
|
@@ -87,26 +87,45 @@ upstream_sha: bd596393ecc016cbea106835681a4979c0a9ca0e
|
|
|
87
87
|
- **Oracle tự chứa và đúng nguồn:** chuỗi sao-nguyên-văn (tiêu đề · nhãn · chữ trên nút · thông
|
|
88
88
|
báo lỗi) mà TC assert phải ghi nguyên văn trong Expected Result **và** khớp design-spec/PRD của
|
|
89
89
|
**chính feature này**. Soi kỹ chuỗi **mượn nhầm từ feature anh em** (vd *"tạo tài khoản"* vs
|
|
90
|
-
*"tạo câu hỏi"*). Chuỗi chưa có nguồn chốt mà bị bịa oracle → `
|
|
90
|
+
*"tạo câu hỏi"*). Chuỗi chưa có nguồn chốt mà bị bịa oracle → `MAJOR`; đúng ra phải để
|
|
91
91
|
`Status: PENDING` hoặc gắn `🚫 Block: [GAP-UC{N}-{nnn}]`.
|
|
92
92
|
|
|
93
93
|
## Thang điểm
|
|
94
94
|
|
|
95
95
|
**Điểm chất lượng `XX/100`:** trừ **5đ** mỗi lỗi `FAIL`, trừ **2đ** mỗi `WARN`.
|
|
96
96
|
|
|
97
|
+
> **Hai bộ nhãn, một phép ánh xạ.** Nhãn cũ `FAIL`/`WARN` dùng để **trừ điểm**; nhãn
|
|
98
|
+
> `BLOCKER`/`MAJOR`/`MINOR`/`SUGGESTION` *(`AGT-006` §3.2)* dùng để **suy verdict**. Ánh xạ:
|
|
99
|
+
> `FAIL` ≡ `BLOCKER` ∪ `MAJOR` · `WARN` ≡ `MINOR` ∪ `SUGGESTION`. Ghi finding thì dùng nhãn
|
|
100
|
+
> **bốn mức** — nó phân biệt được *"không chạy được"* với *"chạy được nhưng khó bảo trì"*,
|
|
101
|
+
> thứ mà `FAIL` gộp làm một.
|
|
102
|
+
|
|
97
103
|
| Điểm | Nghĩa |
|
|
98
104
|
|---|---|
|
|
99
105
|
| **≥ 80** | đạt |
|
|
100
106
|
| 60–79 | cần cải thiện |
|
|
101
107
|
| < 60 | không đạt |
|
|
102
108
|
|
|
103
|
-
**Verdict suy ra được, không chấm cảm tính:**
|
|
109
|
+
**Verdict suy ra được, không chấm cảm tính — và suy từ SỐ ĐẾM LỖI, không từ điểm:**
|
|
104
110
|
|
|
105
111
|
```
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
≥1 BLOCKER → REJECTED
|
|
113
|
+
0 BLOCKER, ≥1 MAJOR → REVISION_REQUIRED
|
|
114
|
+
0 BLOCKER, 0 MAJOR, ≥1 MINOR/SUGGESTION → APPROVED_WITH_SUGGESTIONS
|
|
115
|
+
0 BLOCKER, 0 MAJOR, 0 MINOR/SUGGESTION → APPROVED
|
|
116
|
+
|
|
117
|
+
đi tiếp được: APPROVED · APPROVED_WITH_SUGGESTIONS (ngưỡng ≥ APPROVED_WITH_SUGGESTIONS)
|
|
118
|
+
phải sửa lại: REVISION_REQUIRED · REJECTED
|
|
108
119
|
```
|
|
109
120
|
|
|
121
|
+
> **Điểm `XX/100` vẫn giữ, nhưng nó KHÔNG quyết verdict.** Điểm là con số để **so hai vòng soát
|
|
122
|
+
> với nhau**; verdict là kết luận **đi tiếp hay không**. Khi hai thứ mâu thuẫn — điểm 75 mà
|
|
123
|
+
> 0 BLOCKER + 0 MAJOR — thì **số đếm thắng** *(`AGT-006` R06: verdict phải phản ánh đúng finding
|
|
124
|
+
> counts, không được override)*, và chỗ phải sửa là **trọng số trừ điểm**, không phải verdict.
|
|
125
|
+
>
|
|
126
|
+
> **Vì sao không để điểm quyết:** một lỗi BLOCKER duy nhất vẫn có thể ra 85 điểm nếu mọi mục khác
|
|
127
|
+
> tốt — và 85 điểm mà script không dịch được là một con số nói dối.
|
|
128
|
+
|
|
110
129
|
> **Vì sao là số, không phải chữ cái.** Framework trước đây ghi `Score: A / B / C / D` mà **không
|
|
111
130
|
> có luật chấm** — nên hai người soát ra hai kết quả, và vòng 2 không so được với vòng 1. Một con
|
|
112
131
|
> số có luật trừ điểm làm được cả ba: **so được các vòng** · **verdict suy ra được** · **hai
|
|
@@ -126,7 +145,7 @@ soát:
|
|
|
126
145
|
```
|
|
127
146
|
|
|
128
147
|
⚠️ **Tên file review KHÔNG có đuôi `.Test.md`.** Đuôi đó là của file test case; gắn vào file
|
|
129
|
-
review sẽ làm `/qc-
|
|
148
|
+
review sẽ làm `/qc-design-script` nhặt nó lên như một file test case rồi cố sinh script từ một bảng
|
|
130
149
|
điểm.
|
|
131
150
|
|
|
132
151
|
- **Chưa tồn tại** → `Write` toàn bộ khuôn bên dưới, điền hàng của tầng vừa soát, các tầng khác
|
|
@@ -147,7 +166,7 @@ review sẽ làm `/qc-run-test` nhặt nó lên như một file test case rồi
|
|
|
147
166
|
```markdown
|
|
148
167
|
# Review Report — <FEATURE>
|
|
149
168
|
|
|
150
|
-
> Sinh bởi /qc-review. Cập nhật sau mỗi vòng soát. Bảng Tổng quan tích luỹ theo vòng.
|
|
169
|
+
> Sinh bởi /qc-review-testcase hoặc /qc-review-script (mỗi vai một file). Cập nhật sau mỗi vòng soát. Bảng Tổng quan tích luỹ theo vòng.
|
|
151
170
|
|
|
152
171
|
## Tổng quan
|
|
153
172
|
|
|
@@ -177,7 +196,7 @@ review sẽ làm `/qc-run-test` nhặt nó lên như một file test case rồi
|
|
|
177
196
|
| Tầng | Kịch bản còn thiếu |
|
|
178
197
|
|---|---|
|
|
179
198
|
|
|
180
|
-
## Điều kiện để APPROVED (khi đang
|
|
199
|
+
## Điều kiện để lên `APPROVED` (khi đang `REVISION_REQUIRED` / `REJECTED`)
|
|
181
200
|
|
|
182
201
|
| Tầng | Điều kiện cần sửa |
|
|
183
202
|
|---|---|
|
|
@@ -12,7 +12,7 @@ Review bộ TC end-to-end và đánh giá chất lượng.
|
|
|
12
12
|
|
|
13
13
|
## Khi nào trigger
|
|
14
14
|
- "review TC E2E cho [Feature]" / "check coverage E2E"
|
|
15
|
-
- Sau khi qa-designer/e2e/journey xong, trước khi /qc-
|
|
15
|
+
- Sau khi qa-designer/e2e/journey xong, trước khi /qc-design-script
|
|
16
16
|
|
|
17
17
|
## Khi KHÔNG trigger
|
|
18
18
|
- Review TC functional 1 màn → `test-case/functional`
|
|
@@ -123,7 +123,7 @@ hàng của tầng mình, KHÔNG ghi đè tầng khác).
|
|
|
123
123
|
Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (TC ID / journey)
|
|
124
124
|
|
|
125
125
|
**Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
|
|
126
|
-
**Verdict:**
|
|
126
|
+
**Verdict:** suy từ **số đếm lỗi** theo `shared/review-file-template.md` §Verdict — `≥1 BLOCKER` → `REJECTED` · `≥1 MAJOR` → `REVISION_REQUIRED` · chỉ MINOR/SUGGESTION → `APPROVED_WITH_SUGGESTIONS` · sạch → `APPROVED`. Điểm `XX/100` vẫn ghi, nhưng **không quyết verdict**.
|
|
127
127
|
|
|
128
128
|
Danh sách journey thiếu TC; TC cần sửa Expected; TC vi phạm isolation.
|
|
129
129
|
Điền thêm bảng **Coverage journey/path (E2E)** ở cuối file review.
|
|
@@ -84,7 +84,7 @@ hàng của tầng mình, KHÔNG ghi đè tầng khác).
|
|
|
84
84
|
Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (charter ID)
|
|
85
85
|
|
|
86
86
|
**Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
|
|
87
|
-
**Verdict:**
|
|
87
|
+
**Verdict:** suy từ **số đếm lỗi** theo `shared/review-file-template.md` §Verdict — `≥1 BLOCKER` → `REJECTED` · `≥1 MAJOR` → `REVISION_REQUIRED` · chỉ MINOR/SUGGESTION → `APPROVED_WITH_SUGGESTIONS` · sạch → `APPROVED`. Điểm `XX/100` vẫn ghi, nhưng **không quyết verdict**.
|
|
88
88
|
|
|
89
89
|
Mỗi charter: ✅ PASS | 🔧 REWORK | ✂️ SPLIT | 🔗 MERGE + feedback cụ thể.
|
|
90
90
|
Charter bổ sung nếu còn gap.
|