Menu
ESC

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

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

Đang tải...

Agile Testing Quadrants (Brian Marick)

Software Testing Fundamentals Bài 39/60

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

Hãy tưởng tượng bạn vừa gia nhập một team Agile làm sản phẩm ví điện tử tại một startup fintech ở Sài Gòn. Sprint nào cũng chạy nước rút, mỗi hai tuần lại có bản build mới. Bạn — với tư cách tester — nhận được một câu hỏi tưởng chừng đơn giản từ Scrum Master: "Sprint này chúng ta cần test những gì?". Và bạn bối rối. Test tính năng mới? Đúng rồi. Nhưng còn phải chạy lại regression. Rồi phải viết unit test cùng dev. Rồi khách hàng muốn team ngồi khám phá app xem có gì kỳ lạ không. Rồi lại lo về hiệu năng khi 50.000 người cùng nạp tiền dịp Tết. Tất cả những thứ đó đều là "test", nhưng chúng khác nhau hoàn toàn về mục đích, công cụ, và người thực hiện.

Đây chính xác là vấn đề mà Agile Testing Quadrants ra đời để giải quyết. Được Brian Marick phác thảo lần đầu năm 2003 và sau đó được Lisa Crispin cùng Janet Gregory phổ biến rộng rãi qua cuốn Agile Testing (2009), mô hình này cho bạn một tấm bản đồ để trả lời câu hỏi "chúng ta đang test cái gì, để làm gì, và bằng cách nào". Nó không phải là một quy trình bắt buộc phải làm theo tuần tự, mà là một khung tư duy (mental model) giúp team Agile không bỏ sót loại kiểm thử nào, đồng thời phân bổ nguồn lực hợp lý.

Với một tester đang muốn tiến lên vai trò cao hơn trong môi trường Agile, hiểu Testing Quadrants là điều gần như bắt buộc. Nó giúp bạn nói cùng ngôn ngữ với dev, PO, và cả khách hàng — biết khi nào cần bàn về "logic nghiệp vụ", khi nào cần bàn về "kỹ thuật bên dưới", khi nào cần con người ngồi khám phá, và khi nào cần công cụ chạy tự động hàng nghìn lần.

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

Hai trục tạo nên bốn góc phần tư

Brian Marick tổ chức toàn bộ hoạt động kiểm thử trong một team Agile dựa trên hai trục vuông góc.

Trục dọc (theo mục đích của test):

  • Phía trên — Business-facing (hướng nghiệp vụ): những test được mô tả bằng ngôn ngữ mà khách hàng, PO, người dùng cuối hiểu được. Chúng trả lời câu hỏi "phần mềm có làm đúng điều nghiệp vụ mong muốn không?". Ví dụ: "Khi khách chuyển 500.000đ, số dư có giảm đúng không?".
  • Phía dưới — Technology-facing (hướng kỹ thuật): những test được mô tả bằng ngôn ngữ của lập trình viên, gắn với chi tiết triển khai bên trong. Chúng trả lời "code có hoạt động đúng về mặt kỹ thuật không?". Ví dụ: "Hàm calculateFee() có trả về đúng giá trị với input âm không?".
Trục ngang (theo vai trò của test):
  • Bên trái — Supporting the team (hỗ trợ phát triển): test giúp định hướng và hỗ trợ quá trình viết code. Chúng thường được viết TRƯỚC hoặc TRONG khi code, đóng vai trò như lưới an toàn và như đặc tả. Đây là các test phòng ngừa lỗi (defect prevention).
  • Bên phải — Critiquing the product (phê bình sản phẩm): test dùng để đánh giá, "soi", phê bình sản phẩm đã có, nhằm phát hiện những điều còn thiếu sót. Chúng thường diễn ra SAU khi có sản phẩm và tập trung vào phát hiện lỗi (defect detection).
Giao hai trục này lại, ta có bốn góc phần tư. Một lưu ý cực kỳ quan trọng: số thứ tự Q1, Q2, Q3, Q4 KHÔNG phải là thứ tự thực hiện. Đây là hiểu lầm phổ biến nhất. Chúng chỉ là nhãn để gọi tên, không hàm ý bạn phải làm Q1 xong rồi mới tới Q2.

Q1 — Technology-facing & Supporting the team

Đây là góc dưới-trái: các test kỹ thuật hỗ trợ đội phát triển. Bao gồm unit test, component test, integration test ở tầng code. Chúng thường do lập trình viên viết, chạy tự động trong pipeline, cực nhanh và chạy hàng nghìn lần mỗi ngày.

Mục tiêu của Q1 là xây nền móng vững chắc: nếu từng viên gạch code đều đúng, ta có cơ sở tin tưởng. Đây là nơi TDD (Test-Driven Development) sống. Ví dụ với ví điện tử: unit test cho hàm tính phí giao dịch, hàm định dạng số tiền theo chuẩn Việt Nam (1.000.000 ₫), hàm kiểm tra số điện thoại đầu số Việt Nam hợp lệ.

Q2 — Business-facing & Supporting the team

Góc trên-trái: các test nghiệp vụ nhưng vẫn hỗ trợ quá trình phát triển. Bao gồm functional test, story test, ví dụ nghiệp vụ (examples), prototype, mô phỏng (wireframe/mockup). Đây là nơi BDD (Behavior-Driven Development) và kỹ thuật "Specification by Example" phát huy tác dụng — team cùng khách hàng thống nhất các ví dụ cụ thể mô tả hành vi mong muốn, rồi biến chúng thành test tự động.

Q2 là góc quan trọng bậc nhất mà tester Agile thường đóng vai chính. Ví dụ: "Với tài khoản chưa xác thực (chưa eKYC), khi nạp trên 5 triệu đồng thì hệ thống phải chặn và hiển thị yêu cầu xác thực". Đây là một ví dụ nghiệp vụ, viết được bằng ngôn ngữ khách hàng, và cũng chính là tiêu chí nghiệm thu.

Q3 — Business-facing & Critiquing the product

Góc trên-phải: các test nghiệp vụ dùng để phê bình sản phẩm. Đây là nơi con người là trung tâm: exploratory testing (kiểm thử khám phá), usability testing (kiểm thử khả năng sử dụng), UAT (kiểm thử chấp nhận của người dùng), alpha/beta testing, demo cho khách hàng.

Q3 không thể tự động hóa hoàn toàn được, vì nó đòi hỏi trực giác, cảm nhận, và đánh giá của con người. Máy móc không biết được một giao diện có "khó chịu" hay không, một luồng đăng ký có "rối rắm" hay không. Ví dụ: một tester ngồi khám phá app ví điện tử và phát hiện rằng khi màn hình xoay ngang giữa lúc nhập OTP, ô nhập bị mất focus — một lỗi mà không đặc tả nào ghi ra.

Q4 — Technology-facing & Critiquing the product

Góc dưới-phải: các test kỹ thuật dùng để phê bình sản phẩm về các thuộc tính phi chức năng (non-functional). Bao gồm performance testing, load/stress testing, security testing, reliability, khả năng mở rộng (scalability). Chúng thường cần công cụ chuyên dụng (JMeter, k6, OWASP ZAP...) và kiến thức kỹ thuật sâu.

Ví dụ: kiểm tra app ví có chịu nổi 50.000 giao dịch/phút trong khung giờ cao điểm mùng 1 Tết không; kiểm tra API nạp tiền có bị lỗ hổng SQL injection không.

Bảng tổng hợp nhanh

Supporting the team (trái)Critiquing the product (phải)
Business-facing (trên)Q2: Functional test, Story test, Examples, BDD, PrototypeQ3: Exploratory, Usability, UAT, Alpha/Beta
Technology-facing (dưới)Q1: Unit test, Component test, Integration (code-level), TDDQ4: Performance, Load, Stress, Security, Scalability

Mối quan hệ giữa các quadrant và tự động hóa

Một cách nhìn hữu ích: bên trái (Q1, Q2) nghiêng về automation (tự động hóa)phòng ngừa lỗi; Q3 nghiêng về con người thủ công (manual) và khám phá; Q4 dùng công cụ chuyên dụng. Điều này lý giải vì sao Testing Quadrants gắn chặt với triết lý Test Pyramid: phần lớn công sức tự động nên dồn vào Q1, đủ Q2 ở tầng nghiệp vụ, còn Q3 dành cho trí tuệ con người.

Tình huống thực tế

Ví dụ 1 — Team ví điện tử "PayNhanh" (giả định) lấp đầy bốn góc

Team PayNhanh gồm 5 dev, 2 tester, 1 PO, làm sprint 2 tuần. Trước đây họ chỉ hiểu "test" là chạy tay các kịch bản trước khi release, dẫn đến mỗi lần release đều căng thẳng, bug rơi ra production liên tục. Sau khi áp dụng Testing Quadrants, họ vẽ lại bức tranh:

  • Q1: Dev cam kết mỗi user story phải có unit test cho logic tính phí, tính hạn mức. Độ phủ code từ 20% lên 68% sau 3 sprint.
  • Q2: Mỗi story trong buổi refinement, PO + tester + dev cùng viết 3–5 ví dụ nghiệp vụ dạng Given-When-Then, sau đó tester biến thành test tự động bằng Cypress. Ví dụ: "Cho tài khoản đã eKYC, khi nạp 10 triệu, thì giao dịch thành công và số dư tăng đúng".
  • Q3: Hai ngày cuối sprint, cả team dành 2 giờ "exploratory session" — mỗi người tự do dùng app như người dùng thật. Chính buổi này họ phát hiện lỗi bàn phím số che mất nút "Xác nhận" trên máy màn hình nhỏ.
  • Q4: Cuối mỗi tháng, họ chạy load test bằng k6 mô phỏng 30.000 người dùng đồng thời, phát hiện API tra cứu số dư sập ở mức 12.000 request/giây và kịp tối ưu cache Redis.
Bài học rút ra: Testing Quadrants biến một khái niệm mơ hồ ("test cho kỹ") thành một checklist bốn ô rõ ràng. PayNhanh không còn bỏ sót loại test nào, và số bug lọt production giảm khoảng 40% sau một quý.

Ví dụ 2 — Sàn TMĐT bỏ quên Q4 và cái giá phải trả

Một sàn thương mại điện tử tầm trung ở khu vực Đông Nam Á (tạm gọi ShopEZ) có team QA rất mạnh về Q1 và Q2: unit test đầy đủ, automation functional chạy xanh mượt trong CI. Họ tự tin ra mắt chương trình flash sale 12.12. Nhưng họ gần như bỏ trống Q4 — không ai làm performance testing nghiêm túc vì "chức năng chạy đúng là được rồi".

Kết quả: đúng 0h ngày 12.12, khi lượng truy cập tăng gấp 25 lần bình thường, hệ thống thanh toán treo cứng trong 40 phút. Ước tính thiệt hại doanh thu hàng trăm triệu đồng, chưa kể uy tín. Điều trớ trêu là tất cả functional test đều "pass" — vì mỗi test chỉ chạy với một người dùng.

Bài học rút ra: Bốn góc phần tư không phải để bạn chọn làm cái nào bạn giỏi, mà để nhắc bạn về cái bạn đang bỏ quên. Một team "lệch" về Q1/Q2 vẫn có thể chết vì Q4. Chất lượng thực sự đòi hỏi cân bằng cả bốn góc theo mức độ rủi ro của sản phẩm.

Ví dụ 3 — Tester Q3 cứu một tính năng "đúng đặc tả nhưng sai trải nghiệm"

Tại một công ty làm app đặt lịch khám bệnh, có một tính năng chọn ngày giờ khám. Tất cả test Q1 (unit) và Q2 (functional automation) đều pass: chọn ngày hợp lệ → lưu đúng, chọn ngày quá khứ → báo lỗi đúng. Đặc tả được đáp ứng hoàn hảo.

Nhưng trong một buổi usability testing (Q3), tester ngồi quan sát 5 bệnh nhân lớn tuổi thật sử dụng app. Cả 5 người đều loay hoay: lịch mặc định hiển thị theo định dạng MM/DD gây nhầm lẫn với người Việt vốn quen DD/MM, và nút "Hôm nay" quá nhỏ. Không một test tự động nào bắt được điều này, vì về mặt logic mọi thứ đều đúng.

Bài học rút ra: Q3 là góc phần tư mà máy móc bất lực. Automation trả lời câu hỏi "code có làm đúng điều ta bảo không", nhưng chỉ con người mới trả lời được "điều ta bảo có thực sự đúng với người dùng không". Đừng bao giờ nghĩ automation Q1/Q2 tốt là đủ để bỏ Q3.

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

Dưới đây là cách áp dụng Testing Quadrants vào một sprint thực tế:

Bước 1 — Vẽ bảng bốn ô cho team. Dán một bảng bốn góc phần tư lên tường (hoặc Miro board). Đây là công cụ giao tiếp, không phải tài liệu để cất tủ. Mục tiêu là mọi người nhìn vào và cùng hiểu.

Bước 2 — Phân loại các hoạt động test hiện tại của bạn vào bốn ô. Liệt kê mọi thứ team đang làm và đặt chúng vào đúng ô. Bạn sẽ nhanh chóng thấy ô nào đang trống hoặc quá mỏng.

Bước 3 — Bắt đầu từ bên trái với mỗi user story (phòng ngừa trước). Khi story vào sprint, cùng nhau xác định các ví dụ nghiệp vụ Q2 (đây cũng là acceptance criteria) và thống nhất dev sẽ viết unit test Q1 nào. Làm việc này TRƯỚC khi code giúp phòng ngừa lỗi.

Bước 4 — Lên lịch cho bên phải theo rủi ro. Với Q3, chốt thời điểm cho exploratory session và, nếu cần, UAT với khách hàng. Với Q4, đánh giá story này có chạm tới hiệu năng/bảo mật không — nếu có (ví dụ luồng thanh toán, đăng nhập), lên kế hoạch performance/security test tương ứng.

Bước 5 — Cân bằng nỗ lực theo mức độ rủi ro, không chia đều máy móc. Không phải sprint nào cũng cần cả bốn ô như nhau. Một story chỉ đổi màu nút có thể chỉ cần Q1+Q3 nhẹ. Một story xử lý tiền cần cả bốn góc đầy đủ. Testing Quadrants là bản đồ, còn Risk-Based Testing là la bàn giúp bạn quyết định đổ công sức vào đâu.

Bước 6 — Rà soát lại trong retrospective. Cuối sprint, nhìn lại: có bug nào lọt ra thuộc góc phần tư nào chúng ta bỏ quên không? Dùng phát hiện đó để điều chỉnh sprint sau.

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

Lỗi 1 — Tưởng Q1→Q2→Q3→Q4 là thứ tự thực hiện. Không phải. Các con số chỉ là nhãn. Trong một sprint, bạn có thể làm Q2 (viết ví dụ) trước cả khi code, làm Q1 song song lúc code, và Q3/Q4 khi có sản phẩm. Nhiều hoạt động diễn ra đồng thời.

Lỗi 2 — Cho rằng chỉ tester mới "làm test". Trong Agile, Q1 chủ yếu do dev đảm nhiệm, Q3 có thể có PO và khách hàng tham gia, Q4 có thể cần chuyên gia hiệu năng/bảo mật. Testing Quadrants nhấn mạnh chất lượng là trách nhiệm cả team (whole-team approach).

Lỗi 3 — Cố tự động hóa Q3. Exploratory và usability không thể automation hóa toàn bộ. Nếu bạn ép mọi thứ vào script, bạn mất đi giá trị lớn nhất của Q3 là trực giác con người.

Lỗi 4 — Bỏ quên Q4 cho tới sát ngày release. Performance và security test cần thời gian chuẩn bị dữ liệu, môi trường, công cụ. Đưa chúng vào kế hoạch sớm cho các story rủi ro cao.

Mẹo 1 — Dùng bốn ô làm checklist trong buổi refinement. Mỗi story, hỏi nhanh: "Story này chạm vào ô nào?". Đây là cách rẻ nhất để không bỏ sót.

Mẹo 2 — Đừng nhầm Testing Quadrants là mô hình bắt buộc. Nó là công cụ tư duy. Nếu sản phẩm của bạn là một trang landing page tĩnh, bạn không cần Q4 nặng nề. Hãy uyển chuyển.

Mẹo 3 — Kết hợp với Test Pyramid. Quadrants cho biết "test loại gì", Pyramid cho biết "phân bổ số lượng ở tầng nào". Hai mô hình bổ sung cho nhau rất tốt.

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

Bài 1 — Phân loại. Cho các hoạt động sau, hãy xếp mỗi cái vào Q1, Q2, Q3 hay Q4: (a) Viết unit test cho hàm kiểm tra định dạng email. (b) Chạy JMeter mô phỏng 10.000 người dùng đăng nhập cùng lúc. (c) Ngồi cùng 3 người dùng thật quan sát họ đặt hàng. (d) Viết kịch bản Given-When-Then cho tính năng áp mã giảm giá và tự động hóa bằng Cypress. (e) Quét lỗ hổng bảo mật API bằng OWASP ZAP.

Bài 2 — Tìm ô trống. Lấy dự án hiện tại của bạn (hoặc một app bạn dùng hằng ngày như ứng dụng ngân hàng). Liệt kê tất cả loại test bạn nghĩ team đó nên làm, xếp vào bốn ô, và chỉ ra ô nào có vẻ đang bị bỏ trống nhất. Ô đó ẩn chứa rủi ro gì?

Bài 3 — Tình huống thiết kế. Bạn là tester cho tính năng "chuyển tiền liên ngân hàng" của một app fintech. Hãy đề xuất ít nhất 2 hoạt động test cho MỖI góc phần tư (tổng cộng tối thiểu 8 hoạt động), và giải thích ngắn gọn vì sao mỗi hoạt động thuộc góc đó.

(Gợi ý đáp án Bài 1: a→Q1, b→Q4, c→Q3, d→Q2, e→Q4.)

Tóm tắt

Agile Testing Quadrants của Brian Marick là tấm bản đồ giúp team Agile trả lời câu hỏi "chúng ta đang test gì và để làm gì". Mô hình dùng hai trục: dọc phân biệt business-facing (ngôn ngữ nghiệp vụ, hướng người dùng) với technology-facing (ngôn ngữ kỹ thuật, hướng lập trình); ngang phân biệt supporting the team (hỗ trợ phát triển, phòng ngừa lỗi) với critiquing the product (phê bình sản phẩm, phát hiện lỗi).

Bốn góc: Q1 (unit/integration, hỗ trợ dev), Q2 (functional/story test, ví dụ nghiệp vụ, BDD), Q3 (exploratory, usability, UAT — nơi con người là trung tâm), Q4 (performance, security — cần công cụ chuyên dụng). Hãy nhớ ba điều: số thứ tự KHÔNG phải thứ tự làm; chất lượng là trách nhiệm cả team; và bốn ô là để nhắc bạn về cái bạn đang bỏ quên chứ không phải để chọn cái bạn giỏi. Kết hợp Quadrants với tư duy risk-based sẽ giúp bạn phân bổ nỗ lực kiểm thử thông minh trong từng sprint.