CYBERSOFT
Đăng nhập

Thực chiến: kiểm thử tự động chuyển khoản liên ngân hàng & đối soát (Core Banking E2E)

Thực chiến doanh nghiệpNgân hàngFintechTích hợpPlaywrightAPICI/CDAI AgentPhỏng vấnThực tế
🗓 1 tháng trước22 phút đọc·👁 1,480 lượt xem👤 385 người đọc

Bài mẫu sâu (chuẩn mới, có mục lục 14 chương): giải bài toán thật của ngân hàng số — kiến trúc, bất biến sổ cái, test plan, ma trận ca, code happy + ca lỗi tài chính (idempotency/hoàn tiền/timeout), đối soát cuối ngày, CI/CD, AI Agent và phỏng vấn. Tích hợp Playwright + API + CI + AI.

1. Bối cảnh doanh nghiệp & phạm vi

Bạn là QA Automation Lead tại NeoBank — một ngân hàng số phục vụ khoảng 3 triệu khách hàng, xử lý trung bình 1,2 triệu giao dịch mỗi ngày, cao điểm cuối tháng lên tới 2.500 giao dịch mỗi phút. Sản phẩm trọng yếu nhất là chuyển khoản: nội bộ (cùng NeoBank) và liên ngân hàng qua NAPAS. Quý này, đội Core Banking tái kiến trúc luồng chuyển khoản liên ngân hàng để giảm độ trễ và tăng tỉ lệ thành công. Mọi thay đổi trên luồng này đều là thay đổi 'chạm tiền thật': một lỗi nhỏ có thể trừ tiền khách hai lần, tạo 'tiền ảo', hoặc để giao dịch treo lơ lửng không rõ trạng thái.

Yêu cầu đặt ra cho đội QA không chỉ là 'test cho chạy được'. Ban lãnh đạo và bộ phận tuân thủ (compliance) đặt ra ràng buộc: hệ thống phải đạt SLA khả dụng 99,95%, thời gian phản hồi p95 dưới 3 giây cho bước xác nhận, và tuyệt đối không được có sai lệch tài chính lọt ra production. Ngân hàng Nhà nước yêu cầu mọi giao dịch phải truy vết được và đối soát khớp với NAPAS mỗi ngày. Vì thế, chiến lược kiểm thử phải phủ được không chỉ 'happy path' mà cả những ca lỗi tài chính hiếm gặp nhưng hậu quả nghiêm trọng.

Phạm vi tự động hoá của tài liệu này

  • Luồng chuyển khoản liên ngân hàng đầu-cuối: từ thao tác trên app → xác nhận OTP → trừ tiền/treo → định tuyến NAPAS → ghi có/hoàn tiền.
  • Các ca lỗi tài chính: idempotency (chống trừ tiền hai lần), hoàn tiền khi bị từ chối, xử lý timeout, vượt hạn mức.
  • Đối soát cuối ngày (reconciliation) giữa sổ Core và file settlement của NAPAS.
  • Đưa toàn bộ vào CI/CD chạy mỗi PR, kèm giám sát và chỉ số chất lượng.
  • Tích hợp AI Agent để tăng tốc soạn ca kiểm thử và điều tra lỗi — với ranh giới trách nhiệm rõ ràng.
Bài viết này là bài mẫu 'thực chiến doanh nghiệp' — một trong các LOẠI bài của hệ thống (bên cạnh: chuyên công nghệ, chuyên nâng cao, chuyên phỏng vấn, tích hợp). Nó cố tình đi sâu và dài để bạn thấy chuẩn nội dung; các bài khác sẽ theo cùng độ sâu và cấu trúc mục lục này.

2. Kiến trúc hệ thống & luồng nghiệp vụ

Trước khi viết dòng test đầu tiên, một QA giỏi phải hiểu hệ thống như một kỹ sư. Luồng chuyển khoản liên ngân hàng đi qua nhiều thành phần và trộn lẫn cả xử lý đồng bộ lẫn bất đồng bộ — đây chính là gốc rễ của phần lớn độ khó khi kiểm thử.

Kiến trúc hệ thống chuyển khoản · Transfer system architecture Mobile Appnhập lệnh + OTP API Gatewayxác thực · rate limit Transfer Serviceorchestrate · idempotency Core / Ledger NAPAS Adapter NAPAS Bank B Đồng bộ (sync): App → Gateway → Transfer → Core (trừ tiền + hold). Bất đồng bộ (async): NAPAS → Bank B → callback → ghi có / hoàn. Sync: debit + hold immediately. Async: NAPAS routing + Bank B callback → credit / refund. Notification & Reconstruction batch chạy nền. Điểm khó kiểm thử · Hard-to-test • Bất đồng bộ: callback đến muộn / không đến• Trạng thái trung gian (PENDING/HOLD)• Phụ thuộc NAPAS (bên thứ ba)• Đối soát lệch cuối ngày Chiến lược · Strategy • Seed số dư & mock NAPAS qua API• Chờ theo callback/điều kiện, không sleep• Assert số dư + trạng thái + bút toán• Test đối soát như một luồng riêng
Kiến trúc và các điểm khó kiểm thử của luồng chuyển khoản liên ngân hàng.

Phần đồng bộ diễn ra ngay khi khách bấm xác nhận: App gọi API Gateway (xác thực phiên, chống lạm dụng), Gateway chuyển tới Transfer Service. Service này kiểm tra hạn mức, sinh một requestId duy nhất (khoá idempotency), gọi Core để TRỪ tiền người gửi và TREO (hold) khoản tiền vào một tài khoản trung gian, rồi trả về màn hình 'đang xử lý'. Đến đây khách đã thấy tiền bị trừ, nhưng người nhận CHƯA nhận được — trạng thái giao dịch là PENDING.

Phần bất đồng bộ mới là nơi rủi ro cao nhất. NAPAS Adapter đẩy lệnh sang NAPAS để định tuyến tới Bank B. Kết quả trở về dưới dạng callback (webhook) — có thể sau vài giây, có thể vài phút, và đôi khi KHÔNG bao giờ tới (timeout). Nếu callback là SUCCESS, hệ thống ghi có cho người nhận và chuyển trạng thái sang SUCCESS. Nếu là REJECT, hệ thống phải HOÀN tiền cho người gửi và giải phóng hold, trạng thái REFUNDED. Nếu callback không tới trong SLA, một job nền phải chủ động truy vấn hoặc tự hoàn tiền.

💡 Vẽ lại luồng và liệt kê mọi trạng thái + chuyển tiếp trạng thái (state machine) TRƯỚC khi thiết kế ca kiểm thử. Mỗi cạnh của máy trạng thái là một ca cần phủ; các trạng thái 'kẹt' (không có đường ra) chính là bug tiềm ẩn.

3. Mô hình dữ liệu & bất biến nghiệp vụ

Trái tim của một hệ thống ngân hàng là SỔ CÁI GHI KÉP (double-entry ledger): mỗi chuyển động tiền được ghi thành các bút toán Nợ/Có sao cho tổng Nợ luôn bằng tổng Có. Hiểu mô hình này giúp bạn định nghĩa 'oracle' — tức kết quả kỳ vọng chính xác — thay vì chỉ kiểm tra thông báo trên màn hình.

Sổ cái ghi kép · Double-entry ledger cho 1 lệnh chuyển 5.000.000đ (phí 11.000đ) Bút toán (entry)Nợ (Debit)Có (Credit)Tài khoản Trừ tiền người gửi5.011.000TK A Treo chờ NAPAS (hold)5.000.000TK trung gian Thu phí11.000TK phí Ghi có người nhận (sau callback)5.000.0005.000.000Trung gian→B Bất biến: TỔNG Nợ = TỔNG Có ở mọi thời điểm · sum(Debit) = sum(Credit). Tiền không tự sinh/mất. Nếu callback là REJECT: sinh bút toán ĐẢO (reverse) để hoàn 5.000.000đ về TK A và giải phóng hold. Trạng thái cuối = REFUNDED. Mỗi bút toán là một điểm assert; test tài chính phải kiểm cả SỐ DƯ lẫn BÚT TOÁN, không chỉ thông báo "thành công".
Các bút toán ghi kép sinh ra cho một lệnh chuyển 5.000.000đ và bất biến bảo toàn tiền.

Bốn bất biến phải đúng ở MỌI thời điểm

  • Bảo toàn tiền (conservation): tổng số dư toàn hệ thống không đổi; sum(Debit) = sum(Credit). Tiền chỉ dịch chuyển, không tự sinh/mất.
  • Idempotency: cùng một requestId dù được gửi lại bao nhiêu lần cũng chỉ tạo ĐÚNG MỘT giao dịch và trừ tiền một lần.
  • Trạng thái cuối duy nhất: mỗi giao dịch kết thúc ở đúng một trong SUCCESS / FAILED / REFUNDED — không 'lơ lửng' vô thời hạn.
  • Khớp đối soát: mỗi giao dịch nội bộ phải có bản ghi tương ứng ở NAPAS và ngược lại; lệch phải được phát hiện.

Bốn bất biến này chính là bộ 'oracle' cho toàn bộ bài test. Thay vì assert 'màn hình hiện Thành công', mỗi test tài chính sẽ assert số dư chính xác ở cả hai đầu, sự tồn tại và giá trị của từng bút toán, trạng thái cuối, và (ở tầng đối soát) sự khớp với dữ liệu NAPAS. Đây là khác biệt lớn nhất giữa test 'cho có' và test bảo vệ được tiền thật.

⚠️ Cạm bẫy kinh điển: chỉ test 'số dư người gửi giảm'. Bạn phải kiểm cả bút toán phí, tài khoản trung gian (hold), và số dư người nhận. Nhiều bug 'tiền ảo' đến từ việc hold không được giải phóng hoặc phí bị tính hai lần.

4. Phân tích rủi ro & chiến lược kiểm thử

Không thể (và không nên) tự động hoá mọi thứ qua giao diện. Chiến lược đúng bắt đầu từ rủi ro: ưu tiên tự động hoá những luồng mà nếu hỏng sẽ gây mất tiền hoặc vi phạm quy định, và đẩy phần còn lại xuống các tầng test nhanh và rẻ hơn.

Ma trận rủi ro (xác suất × hậu quả)

  • Cao/Cao — Trừ tiền hai lần khi double-submit: hiếm nhưng mất tiền khách & uy tín. Bắt buộc test tự động, chạy mỗi deploy.
  • Thấp/Cao — Callback NAPAS không tới (timeout): xảy ra khi mạng/đối tác trục trặc, để lại giao dịch treo. Bắt buộc test.
  • Trung bình/Cao — Đối soát lệch cuối ngày: nếu không phát hiện, sai lệch tích luỹ. Bắt buộc test luồng đối soát.
  • Cao/Trung bình — Vượt hạn mức bị chặn sai: ảnh hưởng trải nghiệm & tuân thủ. Test data-driven theo bảng hạn mức.
  • Trung bình/Thấp — Sai định dạng hiển thị số tiền: khó chịu nhưng không mất tiền. Test ở tầng component/UI nhẹ.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!