Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Risk-Based Testing

Mở đầu — vì sao bài này quan trọng

Có một sự thật phũ phàng mà mọi người làm QA đều phải học sớm hay muộn: bạn không bao giờ có đủ thời gian để test hết mọi thứ. Một hệ thống ngân hàng lõi (core banking) có thể có hàng chục nghìn tổ hợp đầu vào. Một ứng dụng thương mại điện tử với 200 màn hình, mỗi màn hình vài chục trường dữ liệu, nhân với trình duyệt, thiết bị, ngôn ngữ, trạng thái tài khoản... con số tổ hợp test lý thuyết vượt xa khả năng của bất kỳ đội ngũ nào, dù bạn có 5 hay 500 tester.

Nếu không thể test hết, câu hỏi sống còn không phải là "test cái gì" mà là "test cái gì trước, test cái gì kỹ hơn, và bỏ qua cái gì mà vẫn ngủ ngon". Đây chính là bản chất của Risk-Based Testing (RBT) — kiểm thử dựa trên rủi ro: một cách tiếp cận có kỷ luật để phân bổ công sức kiểm thử tỷ lệ thuận với mức độ rủi ro, thay vì rải mỏng đều mọi nơi hoặc test theo cảm tính.

Với một QA Lead, RBT không chỉ là kỹ thuật — nó là ngôn ngữ để đàm phán với sếp và stakeholder. Khi Product Manager hỏi "tại sao cần thêm 3 ngày test?", bạn không trả lời bằng cảm giác, mà bằng ma trận rủi ro cụ thể. Khi phải cắt scope test vì deadline ép, RBT cho bạn cơ sở để quyết định cắt phần nào một cách minh bạch và có thể bảo vệ được. Bài học này sẽ trang bị cho bạn tư duy và công cụ để làm điều đó.

Khái niệm cốt lõi

Rủi ro là gì trong ngữ cảnh kiểm thử?

Trong RBT, rủi ro (risk) là khả năng một tính năng hoặc thành phần bị lỗi, kết hợp với hậu quả nếu lỗi đó xảy ra. Công thức nền tảng:

> Mức độ rủi ro = Xác suất lỗi (Likelihood) × Tác động khi lỗi xảy ra (Impact)

Hai yếu tố này độc lập nhau và phải được đánh giá riêng:

  • Xác suất lỗi (Likelihood / Probability): khả năng phần này thực sự có bug. Nó cao khi: code phức tạp, mới viết, thay đổi nhiều lần gần đây, do người mới làm, tích hợp với hệ thống bên thứ ba, hoặc lịch sử từng có nhiều lỗi ở đó.
  • Tác động khi lỗi xảy ra (Impact / Consequence): thiệt hại nếu lỗi lọt ra production. Nó cao khi: liên quan tiền bạc, dữ liệu người dùng, tuân thủ pháp lý, an toàn, hoặc ảnh hưởng đến số đông khách hàng và uy tín thương hiệu.
Điểm mấu chốt: một tính năng có tác động khủng khiếp nhưng cực kỳ ổn định (xác suất lỗi thấp) chưa chắc là ưu tiên số một. Ngược lại, một module hay hỏng nhưng chỉ ảnh hưởng nội bộ cũng vậy. Ưu tiên cao nhất luôn nằm ở góc "vừa dễ lỗi, vừa hậu quả nặng".

Ma trận rủi ro (Risk Matrix)

Công cụ trực quan nhất để làm việc với rủi ro là ma trận rủi ro — một lưới hai chiều với trục dọc là Impact và trục ngang là Likelihood, mỗi trục chia 3 mức (Thấp / Trung bình / Cao):

Impact \ LikelihoodThấpTrung bìnhCao
CaoTrung bìnhCaoRất cao
Trung bìnhThấpTrung bìnhCao
ThấpRất thấpThấpTrung bình
Mỗi tính năng được đặt vào một ô. Vùng đỏ (góc trên phải) là nơi bạn dồn quân test kỹ nhất — nhiều test case, nhiều loại kỹ thuật, test hồi quy đầy đủ. Vùng xanh (góc dưới trái) chỉ cần smoke test hoặc thậm chí chấp nhận rủi ro không test.

RBT không phải là "không test những phần rủi ro thấp"

Đây là hiểu lầm phổ biến nhất. RBT không nói "bỏ hoàn toàn phần rủi ro thấp". Nó nói phân bổ công sức tỷ lệ thuận với rủi ro. Phần rủi ro thấp vẫn được kiểm tra ở mức tối thiểu (một test case chính, một smoke test), còn phần rủi ro cao được đào sâu với nhiều kịch bản biên, kịch bản âm, và test tích hợp. Sự khác biệt là ở độ sâu và số lượng, không phải "có hay không".

Rủi ro sản phẩm và rủi ro dự án

Cần phân biệt hai loại:

  • Product risk (rủi ro sản phẩm): rủi ro nằm trong chính phần mềm — tính năng thanh toán sai, dữ liệu bị mất. Đây là đối tượng chính của RBT.
  • Project risk (rủi ro dự án): rủi ro về tiến độ, nhân sự, môi trường test không sẵn sàng. RBT không xử lý trực tiếp phần này nhưng một QA Lead giỏi cần nhận diện cả hai.

Tình huống thực tế

Ví dụ 1 — Ví điện tử tại Việt Nam trước dịp Tết

Một ví điện tử giả định tên "MoMoPay" chuẩn bị cho cao điểm Tết, khi lượng giao dịch lì xì và thanh toán tăng gấp 4 lần. Đội QA chỉ có 6 người và 2 tuần regression trước ngày freeze code. Backlog có 180 tính năng cần kiểm thử — bất khả thi nếu test đều tay.

QA Lead tổ chức một buổi risk workshop cùng dev lead và PM. Họ chấm điểm từng nhóm tính năng:

  • Chuyển tiền P2P và thanh toán QR: Impact = Cao (liên quan trực tiếp tiền, lỗi = mất tiền thật + khủng hoảng truyền thông), Likelihood = Cao (vừa refactor luồng đối soát tháng trước) → Rất cao. Dồn 60% công sức test vào đây, gồm cả test tải và test đối soát ngược.
  • Lịch sử giao dịch, biểu đồ chi tiêu: Impact = Trung bình (sai thì khó chịu nhưng không mất tiền), Likelihood = Thấp (code ổn định 1 năm) → Thấp. Chỉ smoke test.
  • Giao diện đổi ảnh đại diện, theme sáng/tối: Impact = Thấp, Likelihood = Thấp → Rất thấp. Chấp nhận không test trong đợt này.
Kết quả: đội test đúng phần trọng yếu và phát hiện một bug đối soát khiến số dư hiển thị lệch trong 0,3% giao dịch đồng thời — đúng cái sẽ thành thảm họa trong đêm Giao thừa. Bài học: khi tài nguyên eo hẹp, việc quyết định không test phần rủi ro thấp một cách có chủ đích chính là điều giải phóng thời gian để test kỹ phần sống còn.

Ví dụ 2 — Sàn thương mại điện tử và tính năng đổi ngôn ngữ

Một sàn TMĐT khu vực Đông Nam Á (giả định tên "ShopSEA") ra mắt thị trường Philippines, thêm ngôn ngữ tiếng Anh bên cạnh tiếng Việt. Đội QA ban đầu định test lại toàn bộ 200 màn hình ở cả hai ngôn ngữ — gấp đôi khối lượng.

QA Lead áp dụng RBT và đặt câu hỏi: phần nào thực sự rủi ro khi đa ngôn ngữ? Câu trả lời không phải mọi màn hình, mà là:

  • Màn hình thanh toán có định dạng tiền tệ và số (Impact cao, dễ lỗi do format khác nhau).
  • Email xác nhận đơn và thông báo (dễ vỡ layout khi chuỗi tiếng Anh dài hơn tiếng Việt).
  • Các chuỗi có ghép biến động (ví dụ "Bạn có {n} sản phẩm") — nơi ngữ pháp số nhiều tiếng Anh dễ sai.
Ngược lại, các màn hình tĩnh như "Điều khoản sử dụng" có Likelihood lỗi rất thấp. Đội chỉ kiểm tra chúng bằng một lượt duyệt nhanh (visual scan) thay vì test case đầy đủ.

Kết quả: khối lượng test đa ngôn ngữ giảm từ "gấp đôi" xuống chỉ tăng khoảng 25%, nhưng vẫn bắt được lỗi vỡ layout ở nút "Add to Cart" khi dịch sang tiếng Anh. Bài học: RBT không chỉ dùng khi thiếu người — nó còn là công cụ chống lãng phí, giúp bạn không test những thứ về bản chất không thể sai.

Ví dụ 3 — Khi bỏ qua rủi ro thành thảm họa

Một công ty fintech giả định cho vay tiêu dùng ("CreditFast") ra một bản cập nhật nhỏ: chỉnh giao diện màn hình đăng nhập. Đội cho rằng "chỉ là CSS, rủi ro thấp" và bỏ qua regression phần tính lãi. Nhưng bản build đó vô tình kéo theo một thay đổi thư viện dùng chung, làm tròn số lãi sai ở chữ số thập phân thứ hai.

Vì không ai đánh giá rủi ro ở cấp độ thay đổi thực tế (mà chỉ nhìn "tính năng nào thay đổi"), lỗi lọt ra production và ảnh hưởng hàng nghìn hợp đồng vay. Bài học: đánh giá Likelihood phải dựa trên cái gì thực sự thay đổi trong code và dependency, không chỉ dựa trên mô tả tính năng bề mặt. Một thay đổi "vô hại" về giao diện có thể chạm vào vùng rủi ro cao qua các phụ thuộc ẩn.

Hướng dẫn từng bước

Dưới đây là quy trình 6 bước để triển khai RBT cho một đợt release, có thể áp dụng ngay:

Bước 1 — Lập danh sách hạng mục cần đánh giá. Liệt kê các tính năng, module hoặc user story trong phạm vi release. Đừng chia quá nhỏ (mệt) hay quá to (mất độ phân giải) — mức "epic" hoặc "feature" thường vừa phải.

Bước 2 — Tổ chức risk workshop đa bên. Đây là bước quan trọng nhất và hay bị bỏ qua. Mời dev (biết chỗ nào code mong manh), PM/BA (biết chỗ nào ảnh hưởng doanh thu), và cả support/vận hành nếu có (biết chỗ nào khách hay than phiền). Đánh giá rủi ro một mình là công thức dẫn tới thiên kiến.

Bước 3 — Chấm điểm Likelihood và Impact. Với mỗi hạng mục, cho điểm hai trục theo thang 1–3 (hoặc 1–5 nếu cần chi tiết). Ghi rõ lý do cho mỗi điểm — sau này khi có người chất vấn "sao cái này lại Impact cao?", bạn có bằng chứng. Nhân hai điểm để ra Risk Score.

Bước 4 — Xếp hạng và phân tầng. Sắp xếp danh sách theo Risk Score giảm dần, rồi chia thành các nhóm: Rất cao / Cao / Trung bình / Thấp. Quyết định mức độ test cho từng nhóm — ví dụ: Rất cao = full test + biên + âm + tích hợp + performance; Thấp = 1 happy-path test; Rất thấp = không test, chấp nhận rủi ro.

Bước 5 — Phân bổ công sức và thiết kế test. Dồn test case, thời gian và người giỏi nhất vào vùng rủi ro cao. Đây là lúc bạn cụ thể hóa: bao nhiêu test case, dùng kỹ thuật gì, ai làm.

Bước 6 — Theo dõi và điều chỉnh liên tục. Rủi ro không tĩnh. Nếu trong quá trình test bạn phát hiện một module tưởng an toàn lại đầy bug, hãy nâng mức rủi ro và tái phân bổ. Sau release, dùng dữ liệu lỗi thực tế (nhất là các bug lọt ra production) để hiệu chỉnh mô hình cho lần sau — đây là vòng lặp học hỏi khiến đánh giá của bạn ngày càng chính xác.

Lỗi thường gặp & mẹo

Lỗi 1 — Chấm điểm một mình theo cảm tính. QA Lead tự đoán rủi ro mà không hỏi dev sẽ đánh giá sai Likelihood, không hỏi PM sẽ đánh giá sai Impact. Mẹo: luôn có ít nhất một dev và một người hiểu nghiệp vụ trong buổi chấm điểm.

Lỗi 2 — Ma trận rủi ro làm một lần rồi để đó. Nhiều đội lập ma trận đầu sprint rồi không bao giờ mở lại. Mẹo: coi nó là tài liệu sống, review lại giữa đợt test khi tình hình thay đổi.

Lỗi 3 — Nhầm "rủi ro thấp" thành "không quan trọng". Rủi ro thấp vẫn cần smoke test tối thiểu; bỏ hoàn toàn là liều lĩnh trừ khi bạn đã ghi nhận quyết định "chấp nhận rủi ro" một cách minh bạch. Mẹo: luôn ghi lại các phần chủ đích không test để sếp và stakeholder cùng biết và cùng chịu trách nhiệm.

Lỗi 4 — Đánh giá Impact chỉ theo góc nhìn kỹ thuật. Dev thường thấy lỗi thanh toán và lỗi crash như nhau về mặt "bug". Nhưng về mặt kinh doanh, lỗi tiền bạc nặng hơn nhiều. Mẹo: để người nghiệp vụ định nghĩa Impact.

Lỗi 5 — Đánh giá Likelihood theo mô tả tính năng thay vì theo thay đổi thực. Như ví dụ CreditFast, một thay đổi "CSS nhỏ" có thể chạm dependency nguy hiểm. Mẹo: hỏi dev "lần này thực sự đụng vào những gì trong code?" trước khi kết luận rủi ro thấp.

Mẹo nâng cao — Định lượng để đàm phán. Khi phải xin thêm thời gian test, trình bày bằng con số: "Nếu cắt test phần thanh toán rủi ro rất cao, xác suất lỗi lọt production ước tính X%, thiệt hại ước tính Y đồng và Z giờ khủng hoảng." Ngôn ngữ rủi ro định lượng thuyết phục ban lãnh đạo hơn mọi lời khẩn cầu.

Bài tập thực hành

Hãy lấy một sản phẩm bạn đang làm (hoặc dùng ví dụ ứng dụng đặt đồ ăn) và thực hiện:

  • Liệt kê 10 tính năng chính của sản phẩm.
  • Lập bảng chấm điểm với 3 cột: Tính năng | Likelihood (1–3) | Impact (1–3). Chấm điểm và ghi một câu lý do cho mỗi điểm số.
  • Tính Risk Score (Likelihood × Impact) và sắp xếp giảm dần.
  • Vẽ ma trận rủi ro 3×3 và đặt 10 tính năng vào đúng ô.
  • Ra quyết định phân bổ: với top 3 rủi ro cao nhất, viết cụ thể bạn sẽ test bao nhiêu và bằng kỹ thuật gì; với 3 rủi ro thấp nhất, ghi rõ bạn test tối thiểu hay chấp nhận không test — và giải thích lý do như thể đang bảo vệ trước sếp.
  • Tự phản biện: chọn một tính năng bạn chấm rủi ro thấp và tự hỏi "có dependency ẩn nào khiến nó thực ra rủi ro cao không?" Ghi lại phát hiện.
Hoàn thành bài tập này, bạn sẽ có một artifact thật — bảng rủi ro — mà bạn có thể mang thẳng vào công việc.

Tóm tắt

Risk-Based Testing xuất phát từ một thực tế không thể chối cãi: không ai test được hết mọi thứ, nên phải test thông minh. Cốt lõi của phương pháp là công thức Rủi ro = Xác suất lỗi × Tác động, được trực quan hóa bằng ma trận rủi ro, và biến thành hành động qua việc phân bổ công sức tỷ lệ thuận với rủi ro — dồn quân vào vùng đỏ, test tối thiểu vùng xanh, và chủ đích chấp nhận một số rủi ro rất thấp một cách minh bạch.

Ba điều cần khắc cốt ghi tâm: (1) đánh giá rủi ro phải đa bên, có cả dev và người nghiệp vụ; (2) Likelihood phải dựa trên thay đổi thực trong code, không phải mô tả bề mặt; (3) ma trận rủi ro là tài liệu sống, cần cập nhật liên tục và hiệu chỉnh bằng dữ liệu lỗi thực tế sau mỗi release. Nắm vững RBT, bạn không chỉ test tốt hơn mà còn có ngôn ngữ để đàm phán, bảo vệ quyết định và dẫn dắt đội QA một cách chuyên nghiệp.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi