Menu
ESC

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

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

Đang tải...

Bảy nguyên tắc kiểm thử theo ISTQB

Software Testing Fundamentals Bài 4/60

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

Hãy tưởng tượng bạn vừa được nhận vào làm tester tại một công ty fintech ở TP.HCM. Ngày đầu tiên, sếp giao cho bạn một tính năng chuyển tiền và nói: "Em test kỹ giúp anh, đảm bảo không còn bug nào nhé." Nghe rất hợp lý, nhưng thực ra câu nói đó chứa một sai lầm cơ bản mà cả người mới lẫn nhiều quản lý đều mắc phải — và bạn sẽ hiểu vì sao ngay trong bài này.

ISTQB (International Software Testing Qualifications Board) là tổ chức chứng chỉ kiểm thử phần mềm uy tín nhất thế giới. Trong tài liệu Foundation Level, họ đúc kết bảy nguyên tắc cốt lõi — những sự thật đã được kiểm chứng qua hàng chục năm thực tiễn ngành phần mềm. Đây không phải lý thuyết suông để học thuộc rồi quên. Bảy nguyên tắc này là "kim chỉ nam tư duy": chúng giúp bạn giải thích được vì sao ta test theo cách này chứ không phải cách kia, biết đặt kỳ vọng đúng với sếp và khách hàng, và tránh những cái bẫy tư duy khiến công sức test đổ sông đổ bể.

Nếu bạn định thi chứng chỉ ISTQB, đây gần như chắc chắn là phần có câu hỏi trong đề. Nhưng quan trọng hơn: khi bạn thấm được bảy nguyên tắc này, cách bạn nói chuyện về chất lượng phần mềm sẽ chuyên nghiệp lên hẳn. Bạn sẽ thôi hứa những điều không thể, và bắt đầu hứa những điều thật sự tạo ra giá trị.

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

Bảy nguyên tắc kiểm thử theo ISTQB được tóm gọn trong bảng dưới đây, sau đó ta sẽ đi sâu từng cái.

#Nguyên tắc (tiếng Anh)Diễn giải ngắn
1Testing shows the presence of defects, not their absenceKiểm thử chứng minh có lỗi, không chứng minh được là không còn lỗi
2Exhaustive testing is impossibleKhông thể test hết mọi trường hợp
3Early testing saves time and moneyTest sớm tiết kiệm thời gian và tiền bạc
4Defects cluster togetherLỗi thường tụ lại thành cụm
5Beware of the pesticide paradoxCẩn thận "nghịch lý thuốc trừ sâu"
6Testing is context dependentKiểm thử phụ thuộc bối cảnh
7Absence-of-errors is a fallacy"Không còn lỗi" là một ngộ nhận

1. Kiểm thử cho thấy sự hiện diện của lỗi, không phải sự vắng mặt

Đây là nguyên tắc nền tảng nhất. Khi bạn chạy test và tìm ra bug, bạn đã chứng minh được phần mềm có lỗi. Nhưng khi bạn chạy hết bộ test và không thấy bug nào, điều đó không chứng minh phần mềm hoàn hảo — nó chỉ chứng minh rằng những test bạn đã chạy không phát hiện ra lỗi mà thôi. Có thể vẫn còn hàng loạt lỗi ẩn ở những chỗ bạn chưa chạm tới. Testing làm giảm xác suất còn lỗi, chứ không đưa nó về không.

2. Kiểm thử toàn diện là bất khả thi

"Toàn diện" (exhaustive) nghĩa là test tất cả mọi tổ hợp đầu vào, mọi điều kiện tiền đề có thể xảy ra. Với đa số phần mềm thực tế, số tổ hợp này lớn đến mức nếu có test cả tỉ năm cũng không xong. Ví dụ một ô nhập mật khẩu cho phép 20 ký tự, mỗi ký tự có khoảng 90 lựa chọn — số tổ hợp đã là con số thiên văn. Vì vậy thay vì cố test hết, ta phải ưu tiên rủi ro và dùng các kỹ thuật thiết kế test thông minh để chọn ra tập test có giá trị nhất.

3. Kiểm thử sớm tiết kiệm thời gian và tiền bạc

Lỗi phát hiện càng muộn thì càng đắt để sửa. Một lỗi tìm ra ở giai đoạn phân tích yêu cầu có thể chỉ tốn vài phút sửa một dòng tài liệu. Cũng lỗi đó nếu lọt ra production và làm khách hàng mất tiền, chi phí có thể gấp hàng trăm lần: sửa code khẩn cấp, hoàn tiền, mất uy tín, đền bù. Vì vậy hoạt động kiểm thử — bao gồm cả review yêu cầu và thiết kế — nên bắt đầu càng sớm càng tốt, ngay từ khi tài liệu đầu tiên ra đời.

4. Lỗi tụ thành cụm

Kinh nghiệm ngành cho thấy lỗi không rải đều khắp phần mềm. Thường thì một số ít module chứa phần lớn số bug — hiện tượng này liên hệ với nguyên lý Pareto (80% lỗi đến từ 20% module). Những module phức tạp, mới viết vội, hoặc do người ít kinh nghiệm làm thường là "ổ lỗi". Hiểu điều này giúp bạn tập trung công sức vào đúng chỗ đáng test nhất.

5. Nghịch lý thuốc trừ sâu

Nếu bạn phun mãi một loại thuốc trừ sâu, lũ sâu sẽ dần kháng thuốc và thuốc mất tác dụng. Test cũng vậy: nếu bạn chạy đi chạy lại cùng một bộ test case không đổi, đến một lúc chúng sẽ không còn tìm ra lỗi mới nữa — vì những lỗi mà chúng có khả năng bắt đã bị bắt hết rồi. Giải pháp là thường xuyên rà soát và làm mới bộ test case: thêm test mới, thay đổi dữ liệu, khai thác các đường đi chưa test.

6. Kiểm thử phụ thuộc vào bối cảnh

Không có một công thức test "chuẩn" cho mọi dự án. Cách test một app ngân hàng khác hoàn toàn cách test một game giải trí. Phần mềm điều khiển thiết bị y tế đòi hỏi mức độ nghiêm ngặt vượt xa một website tin tức. Loại phần mềm, mức độ rủi ro, ngành nghề, quy định pháp lý — tất cả đều quyết định bạn nên test cái gì, test bao nhiêu và test thế nào.

7. Ngộ nhận "không còn lỗi"

Giả sử đội của bạn tìm và sửa hết mọi lỗi tìm được, phần mềm chạy "sạch bong". Nhưng nếu sản phẩm đó lại giải quyết sai nhu cầu người dùng, hoặc khó dùng đến mức không ai muốn dùng, thì nó vẫn thất bại. Một phần mềm không lỗi mà không đáp ứng đúng mong đợi của người dùng thì cũng vô nghĩa. Chất lượng không chỉ là "ít bug", mà là đáp ứng đúng nhu cầu thực tế.

Tình huống thực tế

Ví dụ 1: Lời hứa "không còn bug" ở công ty fintech (nguyên tắc 1 & 7)

Quay lại câu chuyện đầu bài. Bạn Minh, tester mới tại một startup ví điện tử, được sếp yêu cầu "test đến khi hết bug". Minh làm việc chăm chỉ suốt hai tuần, chạy 400 test case, sửa xong 37 bug. Minh tự tin báo cáo: "Tính năng chuyển tiền đã sạch, không còn lỗi."

Ba ngày sau khi lên production, một khách hàng chuyển 5.000.000đ nhưng nhập số tài khoản có dấu cách ở cuối do copy-paste từ Zalo. Hệ thống xử lý sai định dạng và tiền treo lơ lửng suốt 6 tiếng. Đây là trường hợp Minh chưa từng nghĩ tới, nên chưa từng test.

Bài học: Test của Minh chỉ chứng minh 400 kịch bản kia hoạt động (nguyên tắc 1), chứ không chứng minh "không còn lỗi". Sai lầm nằm ở chỗ cả sếp lẫn Minh đều tin vào một lời hứa bất khả thi. Cách nói chuyên nghiệp hơn là: "Tôi đã test các kịch bản rủi ro cao và hiện chưa phát hiện lỗi trong phạm vi đó" — trung thực với giới hạn của kiểm thử.

Ví dụ 2: Grab và bài toán không thể test hết (nguyên tắc 2 & 6)

Hãy hình dung đội QA của một siêu ứng dụng gọi xe như Grab đứng trước tính năng tính giá cước. Giá phụ thuộc vào: điểm đón, điểm đến, loại xe (bike/car/premium), giờ cao điểm, thời tiết (mưa thì tăng giá), mã khuyến mãi, hạng thành viên, khu vực địa lý... Nếu nhân tất cả tổ hợp lại, con số lên tới hàng triệu kịch bản. Test hết là điều bất khả thi (nguyên tắc 2).

Thay vì cố test tất cả, đội QA áp dụng tư duy phụ thuộc bối cảnh (nguyên tắc 6). Vì đây là tính năng ảnh hưởng trực tiếp đến tiền của khách hàng và tài xế, họ ưu tiên: các mốc giá quan trọng, logic nhân giá giờ cao điểm, và tổ hợp mã giảm giá dễ bị lạm dụng gian lận. Những nhánh ít rủi ro hơn (ví dụ khác biệt nhỏ giữa hai loại xe cùng phân khúc) được test ở mức nhẹ hơn.

Bài học: Không ai test hết được, và cũng không cần. Nghệ thuật của tester giỏi là biết ưu tiên đúng theo rủi ro và bối cảnh sản phẩm.

Ví dụ 3: Đội test regression bị "lờn thuốc" tại một công ty e-commerce (nguyên tắc 4 & 5)

Một sàn thương mại điện tử tại Hà Nội có bộ test regression gồm 1.200 test case, chạy tự động mỗi lần release. Suốt 8 tháng đầu, bộ test này bắt được trung bình 15 bug mỗi release. Nhưng đến tháng thứ 9, dù code liên tục thay đổi lớn, bộ test gần như không bắt được bug nào nữa — trong khi khách hàng vẫn phàn nàn về lỗi ở trang thanh toán.

Trưởng nhóm QA phân tích và phát hiện hai điều. Thứ nhất, bộ test đã bị lờn thuốc (nguyên tắc 5): 1.200 case cứ chạy y hệt suốt 9 tháng, những lỗi chúng có thể bắt đã bị bắt sạch từ lâu, còn code mới thì không được test case nào chạm tới. Thứ hai, khi nhìn lại lịch sử bug, họ thấy 60% lỗi tập trung ở module thanh toán và giỏ hàng — đúng là lỗi tụ cụm (nguyên tắc 4), nhưng bộ test cũ lại phân bổ đều 1.200 case cho mọi module.

Đội quyết định viết thêm 200 test case mới nhắm thẳng vào module thanh toán, đồng thời làm mới dữ liệu test. Ngay release kế tiếp, họ bắt được 9 bug nghiêm trọng ở đúng khu vực đó.

Bài học: Bộ test cần được làm mới định kỳ, và công sức test nên dồn vào nơi lỗi hay xuất hiện. Một bộ test "chạy xanh" đều đặn chưa chắc là bộ test tốt — nó có thể chỉ đang ngủ quên.

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

Làm sao để biến bảy nguyên tắc từ lý thuyết thành hành động hằng ngày? Dưới đây là cách áp dụng có hệ thống.

Bước 1 — Đặt kỳ vọng đúng ngay từ đầu. Khi nhận yêu cầu test, đừng bao giờ hứa "sẽ hết bug". Thay vào đó, thống nhất với team về phạm vi test và mức rủi ro chấp nhận được. Đây là ứng dụng của nguyên tắc 1 và 7.

Bước 2 — Tham gia sớm. Đừng đợi đến khi code xong mới test. Hãy đọc và phản biện tài liệu yêu cầu, đặt câu hỏi về các trường hợp biên ngay từ khâu phân tích. Mỗi câu hỏi tốt ở giai đoạn này tiết kiệm hàng giờ debug sau này (nguyên tắc 3).

Bước 3 — Phân tích rủi ro trước khi viết test. Liệt kê các chức năng, đánh giá tác động nếu chúng hỏng và xác suất chúng hỏng. Dồn công sức vào nhóm rủi ro cao. Đây là cách bạn sống chung với sự bất khả thi của test toàn diện (nguyên tắc 2 & 6).

Bước 4 — Nhìn vào lịch sử lỗi. Xem những module nào từng có nhiều bug nhất trong các release trước. Đó nhiều khả năng vẫn là ổ lỗi cần soi kỹ (nguyên tắc 4).

Bước 5 — Rà soát và làm mới test case định kỳ. Sau mỗi vài chu kỳ, dành thời gian bổ sung test mới, thay dữ liệu, khai thác đường đi chưa test. Đừng để bộ test "lờn thuốc" (nguyên tắc 5).

Bước 6 — Đánh giá chất lượng bằng góc nhìn người dùng. Ngoài việc đếm bug, hãy hỏi: sản phẩm này có thật sự giải quyết đúng nhu cầu không? Có dễ dùng không? (nguyên tắc 7).

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

Lỗi 1 — Hứa "test hết, không còn bug". Đây là cái bẫy phổ biến nhất với người mới. Nó vừa bất khả thi vừa khiến bạn mất uy tín khi bug xuất hiện. Mẹo: Luôn diễn đạt kết quả test kèm phạm vi: "chưa phát hiện lỗi trong các kịch bản đã kiểm thử".

Lỗi 2 — Chạy mãi một bộ test cũ và tin rằng phần mềm ổn. Test xanh liên tục dễ tạo cảm giác an toàn giả. Mẹo: Đặt lịch review bộ test định kỳ, coi việc làm mới test là công việc thường xuyên chứ không phải làm một lần rồi thôi.

Lỗi 3 — Test dàn trải đều mọi nơi. Chia đều công sức cho mọi module nghe có vẻ công bằng nhưng lại kém hiệu quả, vì lỗi vốn tụ cụm. Mẹo: Ưu tiên theo rủi ro và lịch sử lỗi.

Lỗi 4 — Chỉ săn bug mà quên bức tranh lớn. Có tester tìm được rất nhiều lỗi nhỏ nhưng bỏ qua việc sản phẩm không đáp ứng đúng nhu cầu. Mẹo: Luôn ngẩng đầu lên hỏi "sản phẩm này có đúng là thứ người dùng cần không?".

Lỗi 5 — Áp một quy trình test cứng nhắc cho mọi dự án. Copy nguyên si quy trình từ dự án ngân hàng sang dự án làm app tin tức là lãng phí, hoặc ngược lại là thiếu an toàn. Mẹo: Luôn điều chỉnh theo bối cảnh.

Mẹo tổng quát để nhớ bảy nguyên tắc: Hãy ghép chúng thành một câu chuyện — test cho thấy có lỗi (1) nhưng không thể test hết (2), nên ta test sớm (3), dồn vào ổ lỗi (4), làm mới bộ test (5), tùy bối cảnh (6), và nhớ rằng hết bug chưa chắc là tốt (7).

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

Bài 1 — Ghép tình huống với nguyên tắc. Với mỗi tình huống dưới đây, xác định nó minh họa nguyên tắc nào (có thể nhiều hơn một):

  • a) Một PM nói với khách hàng: "App của chúng tôi đã được test kỹ nên chắc chắn không còn lỗi." Câu này sai ở nguyên tắc nào?
  • b) Đội QA quyết định không test mọi tổ hợp màu sắc và font chữ, mà chỉ test vài cấu hình phổ biến nhất.
  • c) Suốt 5 sprint, bộ test tự động không bắt được bug nào dù code thay đổi nhiều.
Bài 2 — Viết lại lời hứa. Sếp yêu cầu bạn "đảm bảo tính năng đăng nhập không còn bug". Hãy viết lại một câu trả lời chuyên nghiệp, trung thực với bản chất của kiểm thử, mà vẫn giúp sếp yên tâm.

Bài 3 — Lập bản đồ rủi ro. Chọn một app bạn hay dùng (ví dụ MoMo, Shopee, hoặc app của trường bạn). Liệt kê 5 chức năng, đánh giá mỗi chức năng theo hai tiêu chí: mức độ nghiêm trọng nếu hỏng (cao/trung/thấp) và tần suất người dùng dùng (cao/trung/thấp). Dựa vào đó, chọn ra 2 chức năng bạn sẽ test kỹ nhất và giải thích vì sao — vận dụng nguyên tắc 2, 4 và 6.

Bài 4 — Tự phản biện. Nhìn lại một lần bạn (hoặc đội bạn) từng nghĩ "phần mềm này ổn rồi" nhưng sau đó vẫn có sự cố. Hãy chỉ ra nguyên tắc nào đã bị bỏ qua trong tình huống đó.

Gợi ý đáp án Bài 1: a) nguyên tắc 1 & 7; b) nguyên tắc 2 & 6; c) nguyên tắc 5 (nghịch lý thuốc trừ sâu).

Tóm tắt

Bảy nguyên tắc kiểm thử của ISTQB là bộ khung tư duy giúp bạn test một cách thông minh và chuyên nghiệp, thay vì cắm đầu chạy test một cách mù quáng. Điểm mấu chốt cần nhớ:

  • Kiểm thử chỉ chứng minh có lỗi, không bao giờ chứng minh được "hết lỗi" (nguyên tắc 1 & 7). Đừng hứa điều không thể.
  • Không thể test hết, nên phải ưu tiên theo rủi ro và bối cảnh (nguyên tắc 2 & 6).
  • Test sớm rẻ hơn nhiều so với sửa lỗi muộn (nguyên tắc 3).
  • Lỗi tụ thành cụm — hãy soi kỹ những ổ lỗi (nguyên tắc 4).
  • Bộ test sẽ lờn thuốc nếu không được làm mới định kỳ (nguyên tắc 5).
Khi bạn thấm được bảy nguyên tắc này, bạn không chỉ trả lời đúng câu hỏi trong đề thi ISTQB, mà quan trọng hơn, bạn sẽ ra quyết định test tốt hơn mỗi ngày và giao tiếp về chất lượng một cách đáng tin cậy. Đây chính là nền tảng tư duy để bạn bước tiếp vào các kỹ thuật thiết kế test cụ thể ở những bài sau.