Skip to content

v1.2 — 21/04/2026

Thay đổiSectionẢnh hưởng
Khóa test coverage cho confidence rubric, hybrid refresh và role seed mặc địnhD2, D3, TC-FR-004, TC-FR-008QA, BE, FE
Bổ sung test cho lifecycle mapping/backfill và cập nhật trace theo PRD v1.1D2, TC-FR-003, TC-FR-004QA, BE, FE
Khởi tạo QA test plan cho LTV Phase 1Toàn fileQA, BE, FE

QA Test Plan — LTV Phase 1

Ref: PRD v1.2 | Date: 21/04/2026

QA plan này dùng để khóa regression ở các phần dễ vỡ nhất của LTV Phase 1: formula canonical, snapshot source, lifecycle mapping version và backfill job.

Nên đọc D2 Requirements Matrix trước, sau đó chạy lần lượt TC-FR-003, TC-FR-004, rồi mới mở rộng sang các test report / UI semantics.


D1) Coverage Scope

FRMô tảPriority
FR-001Tính đúng LTV chuẩn ở cấp customerMust
FR-002Snapshot Nguồn gốc LTV chuẩn đúng 1 customerMust
FR-003Mapping version hoạt động đúngMust
FR-004Backfill tối đa + confidence đúngMust
FR-005Bảng khách hàng LTVMust
FR-006Bảng tổng hợp quản trịMust
FR-007Bảng kiểm soát chất lượng dữ liệuMust
FR-008Chỉnh tay nguồn gốc LTV có auditShould
FR-009Semantics time/branch/service đúng wording + logicMust
FR-010Scope guard phase 1Must

D2) Requirements Matrix

AreaWhat to verifyRisk
Revenue correctnessPayment/reverse events vào đúng formulaSai CAC/LTV
Source correctnessKhông rewrite lịch sử theo raw source độngSai attribution
VersioningMapping version mới không tự remap snapshot cũMéo lịch sử
Lifecycle safetydraft/published/archivedqueued/running/done/failed đi đúng ruleUser publish/rerun sai thời điểm
Confidence rubrichigh / medium / unknown đúng với từng loại evidenceBusiness hiểu sai độ tin cậy
Hybrid refreshEvent-driven + cron reconcile không đè sai snapshot lịch sửDrift dữ liệu hoặc missed update
UI semanticsLabel/filter không gây hiểu saiBusiness đọc sai số
Admin actionsChỉ Admin/IT làm được config/backfill/overrideSai RBAC

D3) Seed Data

Dataset DS-001 — Customer revenue canonical

sql
-- Khách A:
-- 05/03/2025 thanh toán 5.000.000
-- 19/03/2025 thanh toán 3.000.000
-- 04/04/2025 thanh toán 10.000.000
-- 08/04/2025 refund 2.000.000
-- Expected LTV = 16.000.000

Dataset DS-002 — Wallet / prepaid edge cases

sql
-- Khách B:
-- top-up ví chính 5.000.000 (không tính tại thời điểm nạp)
-- dùng 2.000.000 ví chính thanh toán invoice hợp lệ (được tính)
-- dùng 500.000 ví khuyến mãi (không tính)
-- Expected LTV = 2.000.000

Dataset DS-003 — Source attribution / unknown

sql
-- Khách C:
-- customer_source hiện tại = ['facebook']
-- first_paid có evidence rõ -> map Quảng cáo trả phí / Facebook Ads
--
-- Khách D:
-- raw source hiện tại trống, không có evidence lịch sử
-- Expected source_group = 'Chưa xác định'

Dataset DS-004 — Mapping version

sql
-- Version v1: raw_source 'facebook' -> Quảng cáo trả phí / Facebook Ads
-- Version v2: raw_source 'facebook' -> Quảng cáo trả phí / Meta Ads
-- Snapshot cũ trên khách dùng v1 phải giữ nguyên sau khi publish v2

Dataset DS-005 — Manual override

sql
-- Khách E auto-map = Quảng cáo trả phí / Facebook Ads
-- Admin override -> Khách giới thiệu / CTV / Đối tác
-- reason = 'Đã xác minh lại từ case gốc'

Dataset DS-006 — Confidence medium / conflicting signals

sql
-- Khách F:
-- customer_source hiện tại = ['tiktok']
-- không có historical evidence gần first_paid, không có manual override
-- Expected confidence = 'medium'
--
-- Khách G:
-- customer_source hiện tại = ['facebook', 'referral']
-- evidence mâu thuẫn / nhiều raw source
-- Expected confidence = 'unknown'

D4) Test Cases

TC-FR-001: Base LTV

TCMô tảInputExpectedPriority
TC-001-01Tính nhiều lần thanh toánDS-001LTV = tổng payment hợp lệP0
TC-001-02Trừ refund toàn phần / một phầnDS-001LTV giảm đúng số refundP0
TC-001-03Không tính top-up lúc nạpDS-002top-up không làm tăng LTVP0
TC-001-04Ví chính được tính khi dùng thanh toánDS-002chỉ phần tiêu vào invoice hợp lệ được cộngP0
TC-001-05Ví khuyến mãi không được tínhDS-002phần promo wallet = 0 impactP0
TC-001-06Timezone first paidpayment gần nửa đêm UTCfirst_paid_at đúng theo Asia/Ho_Chi_MinhP1

TC-FR-002: Source snapshot

TCMô tảInputExpectedPriority
TC-002-01Mỗi khách chỉ có 1 source snapshotcustomer bất kỳ1 row duy nhất trong snapshotP0
TC-002-02Raw source thay đổi sau này không rewrite snapshotđổi customer_source của khách Csnapshot cũ giữ nguyênP0
TC-002-03Unknown là output hợp lệkhách Dsource_group = Chưa xác địnhP0

TC-FR-003: Mapping version

TCMô tảInputExpectedPriority
TC-003-01Publish version mớiv1 -> v2v2 active, v1 không bị overwriteP0
TC-003-02Snapshot lưu đúng versionkhách Cmapping_version_id = v1P0
TC-003-03Version mới không tự remap snapshot cũpublish v2khách C vẫn giữ mapping v1P0
TC-003-04Version published là read-onlymở version đã publishkhông cho edit inline, chỉ cho clone/archiveP0
TC-003-05Clone version published tạo draft mớiclick Clone thành draftcó draft mới, version nguồn vẫn publishedP1
TC-003-06Publish bị chặn khi draft chưa đủ điều kiệnthiếu effective_from hoặc còn raw source chưa mapvalidation fail, giữ drawer mở và focus lỗi đầu tiênP0

TC-FR-004: Backfill

TCMô tảInputExpectedPriority
TC-004-01Full backfill tạo đủ snapshotDS-001..003customer trong scope có snapshotP0
TC-004-02Confidence high khi có evidence rõkhách Cconfidence = highP1
TC-004-03Confidence unknown khi thiếu evidencekhách Dconfidence = unknownP0
TC-004-04Job summary ghi unknown countchạy backfillsummary_payload.unknown_count đúngP1
TC-004-05Publish version mới không auto chạy backfillpublish v2không tự tạo ltv_backfill_job mớiP0
TC-004-06Job đi đúng state queued -> running -> donechạy backfill thành côngbadge/status và timestamps đúngP0
TC-004-07Rerun sau fail tạo job mới1 job failed rồi click Chạy lạicó row job mới queued, job failed cũ giữ nguyên auditP1
TC-004-08Incremental refresh chạy khi có payment/refund mớiphát sinh payment hoặc refund mớicustomer bị ảnh hưởng được refresh mà không cần full backfillP0
TC-004-09Scheduled reconcile không rewrite snapshot lịch sử sang version mớipublish v2 rồi chạy reconcile định kỳsnapshot cũ giữ mapping version trước, chỉ case active drift hợp lệ được sửaP1

TC-FR-005: Customer table

TCMô tảInputExpectedPriority
TC-005-01Hiển thị đủ cột chínhmở SCR-01có LTV, first paid, source, statusP0
TC-005-02Filter cohort first paidchọn kỳ 03/2025chỉ khách có first_paid_at trong kỳP0
TC-005-03Filter chi nhánh first paidchọn branch Achỉ khách first_paid_branch_id = AP0
TC-005-04Filter nhóm dịch vụ khởi đầuchọn Phun xămchỉ khách initial service group = Phun xămP0
TC-005-05Export đúng dataset hiện tạiapply filter rồi exportfile export khớp tableP1

TC-FR-006: Aggregate summary

TCMô tảInputExpectedPriority
TC-006-01Bảng theo nguồndefaultnhóm nguồn + avg LTV đúngP0
TC-006-02Bảng theo chi nhánh dùng semantics first paiddefaultlabel và dữ liệu theo first_paid_branchP0
TC-006-03Bảng theo nhóm dịch vụ dùng semantics khởi đầudefaultkhông phân bổ đa nhómP0
TC-006-04Cohort filter không cắt revenue all-timefilter 03/2025khách A vẫn hiển thị full LTV all-timeP0

TC-FR-007: Data quality

TCMô tảInputExpectedPriority
TC-007-01Hiển thị tỷ lệ unknowncó khách Dratio đúngP0
TC-007-02Hiển thị case chỉnh taycó khách E overridemanual count tăng 1P1
TC-007-03Hiển thị top raw source chưa maptạo raw source lạpanel hiển thị source chưa mapP1

TC-FR-008: Manual override

TCMô tảInputExpectedPriority
TC-008-01Chỉ Admin/IT mới thấy action overridelogin user thườngkhông thấy actionP0
TC-008-02Override bắt buộc lý dosubmit rỗng reasonvalidation failP0
TC-008-03Override thành công tạo auditkhách Ecó row trong audit tableP0
TC-008-04Sau override row hiển thị badge Chỉnh taykhách Estatus đúngP1
TC-008-05Override hợp lệ đẩy confidence lên highkhách E sau khi save overrideconfidence_level = highP1

TC-FR-009: Semantics lock

TCMô tảInputExpectedPriority
TC-009-01Filter label Cohort first paidmở SCR-01wording đúngP0
TC-009-02Aggregate label Chi nhánh first paidtab theo chi nhánhwording đúngP0
TC-009-03Aggregate label Nhóm dịch vụ khởi đầutab theo dịch vụwording đúngP0
TC-009-04Tooltip LTV rõ nghĩa all-timehover iconkhông hiểu sai thành LTV trong kỳP1

TC-FR-010: Scope guard

TCMô tảInputExpectedPriority
TC-010-01Không có multi-touch fieldsinspect UI/APIkhông có field multi-touchP1
TC-010-02Không có forecast scoreinspect UI/APIkhông có predictive fieldsP1

D5) Entry / Exit Criteria

Entry

  • PRD, UI Spec, Dev Spec đã lock.
  • Mapping taxonomy nhóm nguồn chuẩn đã seed trên staging.
  • Có seed data tối thiểu cho revenue / source / unknown / override.

Exit

  • Tất cả test P0 pass.
  • Không còn bug P0/P1 mở liên quan formula, source snapshot, versioning, semantics.
  • Business sanity check pass:
    • top 10 khách LTV cao nhìn hợp lý
    • unknown ratio được giải thích được
    • source group đọc đúng theo business expectation phase 1

D6) Traceability

FRTC-IDStatus
FR-001TC-001-*
FR-002TC-002-*
FR-003TC-003-*
FR-004TC-004-*
FR-005TC-005-*
FR-006TC-006-*
FR-007TC-007-*
FR-008TC-008-*
FR-009TC-009-*
FR-010TC-010-*