Software Testing

Từ Đọc Spec Đến Bắt Đúng Lỗi: Những Bài Học Thực Tế Của Một Người Làm Test

Thứ sáu, 30 Th10 2026 17 phút đọc 22 lượt xem

Lời mở đầu: làm test không chỉ là bấm thử theo kịch bản

Nhiều người ngoài ngành hình dung công việc tester là mở một kịch bản có sẵn rồi lần lượt bấm qua từng nút. Đó chỉ là bề mặt của nghề. Khi sản phẩm ra mắt và người dùng gặp sự cố, người đầu tiên bị hỏi vẫn là tester: vì sao lỗi này lọt qua?

Tôi viết bài này sau vài năm làm QA qua các dự án fintech, thương mại điện tử và SaaS. Mười hai bài học dưới đây không phải lý thuyết giáo trình. Tôi đã trả giá cho chúng bằng thời gian, bằng những buổi tranh luận căng thẳng và bằng những lần xin lỗi khách hàng.

Kiểm thử chương trình có thể chứng minh sự hiện diện của lỗi, nhưng không bao giờ chứng minh được sự vắng mặt của chúng.

Edsger W. Dijkstra, Notes on Structured Programming, 1970

Mười hai bài học trong một bảng

#Bài họcTóm tắt một dòng
1Hỏi, đừng đoánMọi điểm mơ hồ trong spec phải thành câu hỏi, không phải giả định.
2Happy path trướcMột nửa thời gian dành cho luồng đa số người dùng đi.
3Hai tầng thị giácCảm nhận như người dùng, rồi soi như kỹ sư.
4Bốn trạng thái dữ liệuRỗng, đang tải, quá tải, báo lỗi. Không chỉ trường hợp đẹp.
5Đề xuất cải tiếnĐừng dừng ở sai lệch, hãy nêu giải pháp cụ thể.
6Severity và PriorityẢnh hưởng kỹ thuật và cấp bách kinh doanh là hai trục khác nhau.
7Bằng chứng, không cảm tínhBáo cáo lỗi là hồ sơ giám định, không phải lời phàn nàn.
8Mở F12 trướcKhông có request là Frontend; 500 hoặc timeout là Backend.
9Database là chân lýThông báo xanh không chứng minh dữ liệu đúng.
10Hiệu ứng cánh bướmRetest mọi luồng dùng chung mã vừa sửa.
11Người dùng không ngăn nắpNhấp đúp, nút Back, dán văn bản, tên dài.
12Dev là đồng minhĐặt cả hai bên cùng một phía của vấn đề.

Phần 1: Tư duy với yêu cầu nghiệp vụ

Bài học 1: Đọc spec để đặt câu hỏi, không phải để đoán mò

Cái bẫy: Đọc lướt tài liệu rồi lấp mọi chỗ trống bằng cảm tính, vì ngại hỏi BA và Dev.

  • Đọc với cây bút và gạch chân mọi điểm mơ hồ.
  • Hỏi theo kiểu giả định: Nếu mạng ngắt giữa lúc trừ tiền thì sao? Nếu người dùng Hủy ở bước cuối thì sao? Nếu hai người cùng thanh toán một đơn thì sao?
  • Biến mỗi câu trả lời thành một tiêu chí kiểm thử rõ ràng.

Đúc kết: Một lỗi cú pháp tốn vài phút. Một yêu cầu hiểu sai tốn hàng trăm giờ.

Bài học 2: Giữ happy path trước khi tìm lỗi dị thường

Cái bẫy: Lao vào các ca biên hóc búa trên bản dựng mới trong khi luồng đăng ký hoặc thanh toán cốt lõi vẫn gãy.

  • Khoảng 50% thời gian cho happy path mà đa số người dùng đi.
  • Khoảng 30% cho các lỗi nhập liệu phổ biến.
  • 20% cuối cho ca biên và tình huống khắc nghiệt.

Đúc kết: Không ai test 100% mọi trường hợp. Hãy ưu tiên luồng mà một lỗi nhỏ gây mất tiền hoặc mất niềm tin.

Phần 2: Góc nhìn trải nghiệm

Bài học 3: Hai tầng thị giác

Cái bẫy: Hai thái cực sai. Một là soi lệch pixel mà quên cảm xúc hành trình. Hai là bấm lướt mà không thấy bố cục vỡ ở kích thước màn hình khác.

  • Năm phút đầu: đóng vai khách hàng mới đang vội, chỉ dùng chuột.
  • Sau đó mở công cụ responsive và soi nút bấm, khoảng cách, thứ tự ưu tiên ở từng độ rộng.

Đúc kết: Hãy cảm nhận như người dùng, rồi soi như kỹ sư.

Bài học 4: Tư duy bốn trạng thái dữ liệu

Cái bẫy: Chỉ test với dữ liệu mẫu đẹp và quên trải nghiệm lần đầu, mạng chậm, dữ liệu nặng và lúc thất bại.

  • Rỗng: có hình minh họa, lời giải thích ngắn và nút tạo mới.
  • Đang tải: khóa nút và hiển thị loading nội tại để chống nhấp đúp.
  • Quá tải: thử tên dài trên 100 ký tự, danh sách rất dài và trường tùy chọn bị thiếu.
  • Báo lỗi: giải thích chuyện gì xảy ra và cách khắc phục.

Đúc kết: Bốn trạng thái là mức tối thiểu cho mọi màn hình.

Bài học 5: Đừng chỉ tìm lỗi, hãy đóng góp cải tiến

Cái bẫy: Bỏ qua một tính năng rườm rà với lý do spec viết sao thì làm vậy.

  • Ghi đề xuất cải tiến kèm giải pháp cụ thể, không chỉ nêu sai lệch.
  • Ví dụ: gộp hai trường địa chỉ và tự điền từ mã bưu chính, thay vì nói form rườm rà.

Đúc kết: Đề xuất có giải pháp thì được lắng nghe.

Báo cáo lỗi là hồ sơ giám định, không phải lời phàn nàn.

Phần 3: Bắt lỗi bằng bằng chứng khách quan

Bài học 6: Phân định rạch ròi Severity và Priority

Cái bẫy: Gắn mác khẩn cấp cho mọi lỗi, tạo căng thẳng và che khuất những lỗi thật sự nghiêm trọng.

  • Severity đo ảnh hưởng kỹ thuật: sập hệ thống, mất dữ liệu, hỏng chức năng cốt lõi.
  • Priority đo cấp bách kinh doanh: sai logo không làm sập web nhưng phải sửa ngay.

Đúc kết: Hai trục độc lập. Khi mọi thứ đều đỏ thì không còn gì nổi bật.

Bài học 7: Nói bằng bằng chứng khách quan

Cái bẫy: Báo rằng màn hình thỉnh thoảng lỗi hoặc giao diện chậm.

  • Các bước tái hiện được đánh số.
  • Kết quả thực tế đặt cạnh kết quả kỳ vọng.
  • Ảnh chụp hoặc video có khoanh vùng.
  • Mã HTTP và trace ID từ bảng Network.

Đúc kết: Đủ bằng chứng biến nửa ngày điều tra thành vài phút sửa.

Bài học 8: Mở F12 trước khi báo lỗi

Cái bẫy: Đổ lỗi cho Backend trước khi kiểm tra giao diện có gửi request hay chưa.

  • Bấm mà không có request: lỗi Frontend, thường do thiếu sự kiện hoặc bị validation chặn.
  • Trả về 200 nhưng không vẽ dữ liệu: lỗi hiển thị Frontend.
  • Trả về 500 hoặc timeout: lỗi Backend.

Đúc kết: Ba nhánh này tiết kiệm cho đội nhiều vòng đi lại.

So do phan loai loi tren bang Network

Hình 1. Phân loại lỗi ngay trong bảng Network trước khi gán cho ai.

Bài học 9: Giao diện chỉ là lớp vỏ, database mới là chân lý

Cái bẫy: Thấy thông báo thành công là đánh dấu đạt.

  • Truy vấn trực tiếp bản ghi theo ID.
  • Kiểm tra trường phụ, múi giờ và lịch sử thay đổi.
  • Với thanh toán, phân quyền và cấu hình hệ thống, đối soát database là bắt buộc.

Đúc kết: Thông báo xanh không phải bằng chứng. Một dòng dữ liệu đúng mới là bằng chứng.

Thông báo xanh không phải bằng chứng. Một dòng dữ liệu đúng mới là bằng chứng.

Phần 4: Tư duy hệ thống và thấu cảm

Bài học 10: Hiệu ứng cánh bướm

Cái bẫy: Chỉ kiểm tra đúng ô Dev vừa sửa rồi đóng vé.

  • Retest mọi luồng dùng chung component, bộ validate hoặc lớp dịch vụ vừa chạm.
  • Coi regression là một phần của việc sửa, không phải bước phụ.

Đúc kết: Một hàm dùng chung có thể làm hỏng ba màn hình.

Bài học 11: Người dùng thật không ngăn nắp như kịch bản

Cái bẫy: Test chậm rãi, tuần tự rồi cho rằng người dùng cũng làm vậy.

  • Bấm xác nhận liên tục và kiểm tra đơn trùng.
  • Bấm nút Back của trình duyệt giữa lúc thanh toán.
  • Nhập dấu tiếng Việt phức tạp, dán từ Word, tải tệp có tên dài.

Đúc kết: Những thao tác không ngăn nắp phơi ra lỗi mà kịch bản gọn gàng không chạm tới.

Bài học 12: Đừng biến Dev thành đối thủ

Cái bẫy: Thái độ bắt bẻ biến đồng nghiệp thành đối thủ.

  • Thay "code của anh bị lỗi rồi" bằng "khi em gửi dữ liệu này, hệ thống phản hồi thế này, anh xem giúp em nhé".
  • Đặt cả hai bên cùng một phía của vấn đề.

Đúc kết: Tôn trọng và thấu cảm kỹ thuật giúp công việc trôi nhanh hơn mọi công cụ.

Phụ lục: bộ ba công cụ thực chiến

Công cụ 1: Biểu mẫu báo cáo lỗi pháp y kỹ thuật

Một báo cáo lỗi chuẩn có năm phần. Tiêu đề theo cấu trúc module, tần suất 100% hoặc ngẫu nhiên, và sự cố khi điều kiện kích hoạt.

  1. Môi trường: thiết bị và hệ điều hành, trình duyệt và phiên bản, môi trường và số hiệu bản dựng, tài khoản thử nghiệm kèm vai trò.
  2. Các bước tái hiện tối thiểu: đánh số và đủ ngắn để người khác làm lại chính xác.
  3. Kết quả thực tế: chuyện gì xảy ra, thời gian chờ và thông báo hiển thị nguyên văn.
  4. Kết quả kỳ vọng: hành vi đúng theo nghiệp vụ, gồm cảnh báo tại chỗ và nút Lưu bị khóa sau lần bấm đầu.
  5. Bằng chứng kỹ thuật: ảnh hoặc video khoanh vùng, URL request, mã HTTP, thời gian phản hồi, payload gửi đi, body trả về và trace ID.

Công cụ 2: Ma trận Severity và Priority

Chỉ số rủi ro là trọng số Severity nhân trọng số Priority, giúp đội ngũ sắp thứ tự khắc phục một cách khách quan.

Ma tran Severity va Priority

Hình 2. Severity đo ảnh hưởng kỹ thuật, Priority đo mức độ cấp bách kinh doanh.

Mức độSeverity 1: Thảm họaSeverity 2: Nghiêm trọngSeverity 3: Trung bìnhSeverity 4: Nhẹ hoặc thẩm mỹ
Priority 1: Khẩn cấp, sửa trong 2 đến 4 giờSập cổng thanh toán, rò rỉ dữ liệu thẻ, mất kết nối database chính.Mã giảm giá không áp được trong giờ vàng, email xác thực tài khoản mới không gửi được.Sai logo đối tác lớn trên trang chủ, sai tên thương hiệu trong thông cáo.Lệch icon trên màn hình chờ của bản dựng sự kiện báo chí.
Priority 2: Ưu tiên cao, sửa trong sprint hiện tạiBáo cáo thuế của kế toán tính sai, có thể xử lý thủ công tạm thời.Lọc đơn theo ngày sai múi giờ với nhóm tài khoản phụ.Nút đóng bảng thông báo lệch trên iPad Safari.Font tiêu đề trang Liên hệ lệch 2px so với design system.
Priority 3: Bình thường, đưa vào backlogRò rỉ bộ nhớ ở job sao lưu dữ liệu cũ chạy mỗi quý.Không đổi được ảnh đại diện với tệp webp.Menu bên không có hiệu ứng chuyển cảnh.Nền footer tối hơn mã màu quy định.
Priority 4: Thấp, sửa khi có thời gianXung đột tiến trình trong công cụ xuất dữ liệu sẽ được thay thế tháng sau.Lỗi định dạng khi in báo cáo nội bộ chỉ hai nhân viên IT dùng.Một từ sai không ảnh hưởng ngữ nghĩa trong trang Điều khoản.Lề dưới trang 404 hơi rộng ở màn hình 300px.

Công cụ 3: Bảng kiểm bốn trạng thái dữ liệu

Bon trang thai du lieu giao dien

Hình 3. Bốn trạng thái mà mọi màn hình đều phải vượt qua.

1. Trạng thái rỗng.

  • ☐ Không để màn hình trắng hoặc bảng trống không có lời giải thích.
  • ☐ Có hình minh họa phù hợp ngữ cảnh.
  • ☐ Có tiêu đề ngắn và lời giải thích thân thiện.
  • ☐ Có nút hành động chính dẫn tới việc tạo dữ liệu đầu tiên.

2. Trạng thái đang tải.

  • ☐ Dùng khung xương mô phỏng đúng bố cục sắp xuất hiện.
  • ☐ Khóa nút xác nhận và hiển thị loading nội tại.
  • ☐ Trên Slow 3G, bố cục không vỡ sau 5 giây và tác vụ dài phải báo tiến độ.

3. Quá tải và dữ liệu khuyết thiếu.

  • ☐ Dán 500 ký tự không dấu cách, bố cục phải xuống dòng hoặc cắt bớt kèm tooltip.
  • ☐ Với 1.000 đến 10.000 bản ghi, dùng ảo hóa hoặc phân trang.
  • ☐ Khi thiếu trường tùy chọn, bố cục vẫn cân đối.

4. Trạng thái báo lỗi.

  • ☐ Mất mạng: hiển thị banner và nút thử lại.
  • ☐ Lỗi 5xx: xin lỗi kèm trace ID, không phơi stack trace hay lỗi database.
  • ☐ Lỗi xác thực: viền đỏ, chỉ dẫn ngay dưới trường và tự cuộn tới trường lỗi đầu tiên.

Tài liệu tham khảo

  • ISTQB Glossary, định nghĩa severity và priority: glossary.istqb.org
  • Chứng chỉ ISTQB Certified Tester Foundation Level: istqb.org
  • Ham Vocke, The Practical Test Pyramid, martinfowler.com: martinfowler.com
  • Nielsen Norman Group, thiết kế giao diện trạng thái rỗng: nngroup.com
  • MDN, tổng quan công cụ dành cho nhà phát triển trên trình duyệt: developer.mozilla.org
  • W3C, Web Content Accessibility Guidelines 2.2: w3.org
  • OWASP, Web Security Testing Guide: owasp.org

Lời kết

Kiểm thử không phải cuộc đua xem ai bắt được nhiều lỗi hơn. Đó là cách cả đội giữ gìn niềm tin của người dùng. Nếu chỉ mang theo một thói quen, hãy mang theo điều này: hỏi trước khi giả định, và kiểm tra dữ liệu thật trước khi tin vào thông báo trên màn hình.

Sẵn sàng chuyển đổi doanh nghiệp?

Hãy thảo luận về cách chúng tôi có thể giúp bạn tận dụng AI và chuyển đổi số.

Câu hỏi thường gặp

Severity và Priority khác nhau như thế nào?
Severity đo mức độ ảnh hưởng kỹ thuật như sập hệ thống hay mất dữ liệu. Priority đo mức độ cấp bách với kinh doanh. Hai chiều này độc lập: một lỗi sai logo có severity thấp nhưng priority cao vì ảnh hưởng trực tiếp đến hình ảnh doanh nghiệp. Phân định đúng giúp đội ngũ sửa đúng thứ tự và tránh căng thẳng không cần thiết.
Vì sao tester cần kiểm tra cơ sở dữ liệu sau khi giao diện báo thành công?
Giao diện chỉ là lớp hiển thị. Đã có nhiều trường hợp màn hình báo cập nhật thành công nhưng dữ liệu lưu vào bảng bị thiếu trường phụ, sai múi giờ hoặc không ghi lịch sử thay đổi. Với các tính năng quan trọng như thanh toán, phân quyền hay cấu hình hệ thống, truy vấn trực tiếp theo mã bản ghi là bước bắt buộc để xác nhận dữ liệu thực sự đúng.
Làm sao phân biệt lỗi Frontend và Backend bằng công cụ F12?
Mở bảng Network và thao tác lại. Nếu bấm nút mà không có request nào xuất hiện, đó là lỗi Frontend do sự kiện chưa gắn hoặc bị validation chặn. Nếu request trả về 200 nhưng màn hình không vẽ dữ liệu, đó là lỗi hiển thị Frontend. Nếu trả về 500 hoặc timeout, đó là lỗi Backend cần chuyển cho đội máy chủ.
Bốn trạng thái dữ liệu giao diện mà tester cần kiểm tra là gì?
Đó là trạng thái rỗng, trạng thái đang tải, trạng thái quá tải và trạng thái báo lỗi. Trạng thái rỗng cần hình minh họa và nút tạo mới; trạng thái đang tải cần khóa nút để chống nhấp đúp; trạng thái quá tải cần kiểm tra tràn văn bản và danh sách dài; trạng thái lỗi cần thông điệp dễ hiểu và cách khắc phục.
Một báo cáo lỗi đạt chuẩn cần có những thành phần nào?
Một báo cáo lỗi đạt chuẩn gồm năm phần: môi trường kiểm thử, chuỗi thao tác tái hiện tối thiểu, kết quả thực tế, kết quả kỳ vọng và hồ sơ bằng chứng kỹ thuật. Phần bằng chứng nên có ảnh hoặc video khoanh vùng, mã HTTP, payload gửi đi, body trả về và trace ID để lập trình viên sửa nhanh.

Chia sẻ bài viết