Kiểm chứng (Verification) và Thẩm định (Validation) trong Kiểm thử Phần mềm: Đâu là sự khác biệt?

Chào mừng các bạn đã trở lại với loạt bài “QA Engineer (Tester) Roadmap”! Trong các bài trước, chúng ta đã cùng nhau khám phá lộ trình học tập, hiểu về đảm bảo chất lượng (QA) là gì, rèn luyện tư duy của một người kiểm thử, tìm hiểu các phương pháp kiểm thử Black Box, White Box, Gray Box, và xem xét vai trò của QA trong các mô hình phát triển phần mềm SDLC khác nhau như Agile, V-Model, hay Waterfall, cũng như cụ thể hơn trong các phương pháp Agile phổ biến. Hôm nay, chúng ta sẽ đi sâu vào một cặp khái niệm nền tảng nhưng thường gây nhầm lẫn cho những người mới bắt đầu: Kiểm chứng (Verification) và Thẩm định (Validation).

Tại sao việc phân biệt rõ ràng hai khái niệm này lại quan trọng đến vậy? Đơn giản là vì chúng định hình cách chúng ta tiếp cận công việc kiểm thử, cách chúng ta lên kế hoạch, thực hiện và đánh giá chất lượng phần mềm ở từng giai đoạn trong vòng đời phát triển. Hiểu rõ Verification và Validation giúp chúng ta không chỉ “tìm bug” hiệu quả hơn mà còn đảm bảo rằng sản phẩm cuối cùng thực sự đáp ứng được cả yêu cầu kỹ thuật lẫn nhu cầu thực tế của người dùng.

Kiểm chứng (Verification): “Chúng ta có đang xây dựng sản phẩm đúng cách không?”

Hãy bắt đầu với Kiểm chứng (Verification). Theo nghĩa rộng trong kỹ thuật phần mềm, Verification là quá trình đánh giá một hệ thống hoặc thành phần để xác định xem sản phẩm của một giai đoạn phát triển có đáp ứng các điều kiện được đặt ra ở giai đoạn trước đó hay không. Nghe có vẻ hơi học thuật phải không? Đơn giản hơn, Verification tập trung vào việc kiểm tra xem chúng ta có đang xây dựng sản phẩm theo đúng các thông số kỹ thuật, thiết kế và yêu cầu ban đầu hay không.

Nó giống như việc một kỹ sư xây dựng kiểm tra xem móng nhà có đúng kích thước và vật liệu theo bản vẽ hay không, hoặc thợ điện kiểm tra xem hệ thống dây dẫn có tuân thủ quy định an toàn và sơ đồ thiết kế không. Việc kiểm chứng diễn ra quá trình phát triển, thường là ở các giai đoạn đầu và giữa. Mục tiêu chính của Verification là tìm ra lỗi (defect) càng sớm càng tốt trong các tài liệu thiết kế, mã nguồn, hoặc các thành phần riêng lẻ của hệ thống.

Các hoạt động Verification không nhất thiết phải chạy mã nguồn. Chúng thường bao gồm các phương pháp tĩnh (static methods), tập trung vào việc xem xét, phân tích và đánh giá các sản phẩm làm việc (work products) của quá trình phát triển. Một số kỹ thuật Kiểm chứng phổ biến bao gồm:

  • Reviews (Đánh giá): Đọc và đánh giá các tài liệu như tài liệu yêu cầu (requirements), tài liệu thiết kế (design documents), kế hoạch kiểm thử (test plan), hoặc mã nguồn (code review).
  • Inspections (Kiểm tra chính thức): Một quy trình đánh giá có cấu trúc và chi tiết hơn, thường có vai trò cụ thể cho từng thành viên (người đọc, người ghi chép, người điều phối…).
  • Walkthroughs (Duyệt): Người tạo ra sản phẩm làm việc (ví dụ: developer trình bày code) dẫn dắt nhóm xem xét qua sản phẩm của họ để tìm lỗi hoặc hiểu rõ hơn.
  • Static Analysis (Phân tích tĩnh): Sử dụng các công cụ tự động để phân tích mã nguồn mà không cần thực thi, nhằm tìm kiếm các vấn đề tiềm ẩn như lỗi cú pháp, vi phạm tiêu chuẩn mã hóa, lỗ hổng bảo mật cơ bản… Các công cụ này có thể tích hợp ngay vào quy trình xây dựng (build pipeline), thậm chí là một phần của cách tiếp cận như TDD (Test-Driven Development) ở mức độ nhất định.

Nói tóm lại, Kiểm chứng trả lời câu hỏi: “Are we building the product right?” (Chúng ta có đang xây dựng sản phẩm theo đúng các yêu cầu kỹ thuật và thiết kế đã đặt ra không?). Nó đảm bảo sự nhất quán, đầy đủ và chính xác của các sản phẩm làm việc ở từng giai đoạn phát triển so với các sản phẩm làm việc của giai đoạn trước.

Thẩm định (Validation): “Chúng ta có đang xây dựng đúng sản phẩm không?”

Tiếp theo là Thẩm định (Validation). Validation là quá trình đánh giá một hệ thống hoặc thành phần trong hoặc cuối quá trình phát triển để xác định xem nó có đáp ứng các yêu cầu nghiệp vụ của người dùng hay không. Khác với Verification tập trung vào “xây dựng đúng cách”, Validation tập trung vào việc “xây dựng đúng sản phẩm” – sản phẩm mà người dùng thực sự cần và mong muốn.

Quay lại ví dụ về ngôi nhà. Validation là khi chủ nhà bước vào, kiểm tra xem ngôi nhà có đủ phòng, đủ ánh sáng, bố cục có hợp lý, có thoải mái để ở không. Việc thẩm định thường diễn ra quá trình phát triển, khi sản phẩm hoặc một phần đáng kể của sản phẩm đã hoàn thành và có thể chạy được. Mục tiêu chính của Validation là đảm bảo rằng sản phẩm cuối cùng đáp ứng được nhu cầu thực tế, giải quyết vấn đề cho người dùng và phù hợp với mục đích sử dụng.

Các hoạt động Validation chủ yếu là các phương pháp động (dynamic methods), liên quan đến việc thực thi (chạy) phần mềm. Đây là nơi các kỹ thuật kiểm thử mà chúng ta thường nghĩ đến phát huy tác dụng. Một số kỹ thuật Thẩm định phổ biến bao gồm:

  • Functional Testing (Kiểm thử chức năng): Kiểm tra xem các chức năng của phần mềm có hoạt động theo đúng yêu cầu nghiệp vụ hay không. Đây là trọng tâm của kiểm thử thủ công và kiểm thử tự động chức năng.
  • Non-functional Testing (Kiểm thử phi chức năng): Kiểm tra các khía cạnh về hiệu năng, bảo mật, khả năng sử dụng (usability), khả năng chịu tải, khả năng tương thích… Đây là những yếu tố quan trọng ảnh hưởng đến trải nghiệm người dùng và sự thành công của sản phẩm, dù không phải là một “chức năng” cụ thể.
  • User Acceptance Testing (UAT – Kiểm thử chấp nhận người dùng): Người dùng cuối hoặc khách hàng trực tiếp sử dụng phần mềm để kiểm tra xem nó có đáp ứng được nhu cầu và yêu cầu của họ hay không trước khi chính thức chấp nhận sản phẩm. Đây là một trong những hình thức Validation quan trọng nhất.
  • Usability Testing (Kiểm thử khả năng sử dụng): Quan sát và thu thập phản hồi từ người dùng thực tế khi họ tương tác với phần mềm để đánh giá mức độ dễ sử dụng, hiệu quả và sự hài lòng.

Nói tóm lại, Thẩm định trả lời câu hỏi: “Are we building the right product?” (Chúng ta có đang xây dựng đúng sản phẩm mà người dùng cần không?). Nó đảm bảo rằng sản phẩm cuối cùng phù hợp với mục đích sử dụng và đáp ứng được kỳ vọng của các bên liên quan, đặc biệt là người dùng cuối.

Sự Khác Biệt Cốt Lõi: Một Phép Tương Đồng Dễ Hiểu

Cách đơn giản nhất để ghi nhớ sự khác biệt giữa Verification và Validation là thông qua câu nói kinh điển trong ngành:

  • Verification: “Are we building the product ?”>right?” (Làm đúng sản phẩm – theo spec?)
  • Validation: “Are we building the right product?” (Làm đúng sản phẩm – theo nhu cầu?)

Hãy lấy một ví dụ khác: nướng bánh.

  • Verification:

    • Bạn kiểm tra xem công thức có ghi đủ nguyên liệu không?
    • Bạn cân đong các nguyên liệu theo đúng liều lượng trong công thức?
    • Bạn trộn bột đúng theo hướng dẫn?
    • Bạn kiểm tra xem lò nướng có đang ở đúng nhiệt độ được ghi trong công thức không?

    Bạn đang kiểm tra xem bạn có đang thực hiện *đúng cách* theo công thức đã có.

  • Validation:

    • Bạn nếm thử miếng bánh sau khi nướng xem có ngon không?
    • Bạn hỏi người khác xem họ có thích chiếc bánh này không?
    • Chiếc bánh có đáp ứng mục đích ban đầu không? (Ví dụ: có đủ ngọt để làm bánh sinh nhật không?)

    Bạn đang kiểm tra xem chiếc bánh cuối cùng có *đúng* là thứ bạn và người khác muốn ăn không, nó có phù hợp với mục đích sử dụng không.

Verification tập trung vào quy trình và các sản phẩm trung gian (công thức, nguyên liệu cân sẵn). Validation tập trung vào kết quả cuối cùng (chiếc bánh đã nướng).

Kiểm chứng (Verification) vs. Thẩm định (Validation): So sánh Chi tiết

Để làm rõ hơn, dưới đây là bảng so sánh chi tiết giữa hai khái niệm này:

Tiêu chí Kiểm chứng (Verification) Thẩm định (Validation)
Mục đích chính Kiểm tra xem sản phẩm có được xây dựng theo đúng các thông số kỹ thuật, thiết kế, yêu cầu đã định nghĩa hay không. Kiểm tra xem sản phẩm cuối cùng có đáp ứng được nhu cầu và mong đợi của người dùng/khách hàng hay không.
Câu hỏi trả lời “Are we building the product right?” (Chúng ta có đang xây dựng sản phẩm đúng cách không?) “Are we building the right product?” (Chúng ta có đang xây dựng đúng sản phẩm không?)
Thời điểm thực hiện Trong suốt vòng đời phát triển phần mềm (thường là các giai đoạn đầu và giữa). Có thể thực hiện trên các sản phẩm làm việc chưa hoàn chỉnh. Trong và sau khi sản phẩm hoặc một phần lớn của sản phẩm đã hoàn thành và có thể chạy được (thường là các giai đoạn cuối).
Phương pháp chính Các phương pháp tĩnh (Static methods): Review, Inspection, Walkthrough, Static Analysis. Các phương pháp động (Dynamic methods): Functional Testing, Non-functional Testing (Performance, Security, Usability…), UAT.
Ai làm Thường được thực hiện bởi đội phát triển nội bộ (Developers, QA Engineers, Business Analysts). Thường được thực hiện bởi đội QA, nhưng quan trọng nhất là có sự tham gia của người dùng cuối, khách hàng, hoặc các bên liên quan khác.
Trọng tâm Kiểm tra tính đúng đắn, đầy đủ, nhất quán của các sản phẩm làm việc (tài liệu, mã nguồn) so với các sản phẩm làm việc trước đó. Kiểm tra tính phù hợp với mục đích sử dụng, khả năng đáp ứng yêu cầu nghiệp vụ và sự hài lòng của người dùng trên sản phẩm đang chạy.
Đầu ra (Outcome) Phát hiện và sửa lỗi (defect) trong tài liệu, thiết kế, mã nguồn sớm. Đảm bảo các sản phẩm làm việc tuân thủ quy trình và tiêu chuẩn. Phát hiện và sửa lỗi (bug) trong hành vi của phần mềm đang chạy. Đảm bảo phần mềm đáp ứng được nhu cầu và kỳ vọng của người dùng.

Tại Sao Việc Phân Biệt Này Quan Trọng Đối Với Kỹ Sư QA?

Đối với một Kỹ sư QA, việc hiểu rõ sự khác biệt giữa Verification và Validation không chỉ là kiến thức lý thuyết suông. Nó ảnh hưởng trực tiếp đến cách chúng ta làm việc hàng ngày:

  1. Lập Kế Hoạch Kiểm Thử Hiệu Quả: Hiểu được V&V giúp chúng ta xác định loại hoạt động kiểm thử nào cần được thực hiện ở giai đoạn nào của dự án. Ví dụ, ở đầu dự án, chúng ta cần tập trung vào Verification (review yêu cầu, thiết kế). Khi có bản build, chúng ta chuyển sang Validation (viết và chạy test case/scenario, thực hiện functional/non-functional testing). Việc này giúp phân bổ nguồn lực và thời gian hợp lý.
  2. Lựa Chọn Kỹ Thuật Kiểm Thử Phù Hợp: Khi biết mình đang thực hiện Verification hay Validation, chúng ta sẽ dễ dàng lựa chọn kỹ thuật và công cụ phù hợp. Review và phân tích tĩnh cho Verification; kiểm thử động (thủ công hoặc tự động), UAT cho Validation. Hiểu về Black Box, White Box testing cũng giúp ích ở đây: White Box thường liên quan nhiều hơn đến Verification (kiểm tra cấu trúc nội bộ, mã nguồn), trong khi Black Box và Gray Box được dùng rộng rãi cho Validation (kiểm tra hành vi từ bên ngoài).
  3. Giao Tiếp Với Các Bên Liên Quan: Chúng ta có thể giải thích rõ ràng hơn về vai trò của QA trong từng giai đoạn cho Developers, Product Owners, hoặc Khách hàng. Khi thảo luận về lỗi, chúng ta biết liệu đó là lỗi sai sót trong tài liệu (Verification issue) hay lỗi trong hành vi chức năng (Validation issue). Điều này giúp việc báo cáo kết quả kiểm thử trở nên chính xác và hiệu quả hơn.
  4. Nâng Cao Chất Lượng Tổng Thể: Bằng cách kết hợp cả Verification và Validation, chúng ta tạo ra một quy trình đảm bảo chất lượng toàn diện. Verification giúp “xây dựng đúng cách” ngay từ đầu, giảm thiểu lỗi phải sửa ở các giai đoạn sau (chi phí sửa lỗi càng muộn càng tốn kém). Validation đảm bảo sản phẩm cuối cùng thực sự hữu ích và có giá trị cho người dùng. Cả hai đều cần thiết để sản phẩm thành công.
  5. Phù Hợp Với Các Mô Hình SDLC: Hiểu V&V đặc biệt quan trọng khi làm việc với các mô hình phát triển. Trong mô hình V-Model, Verification và Validation được thể hiện rất rõ ràng trên hai nhánh của chữ V. Trong Agile, các hoạt động V&V diễn ra lặp đi lặp lại trong mỗi sprint.

Verification và Validation Hoạt Động Cùng Nhau Như Thế Nào?

Điều quan trọng cần nhớ là Kiểm chứng và Thẩm định không phải là hai khái niệm đối lập hay loại trừ nhau. Chúng là hai mặt của cùng một đồng xu – đảm bảo chất lượng phần mềm. Chúng bổ trợ cho nhau và cùng đóng góp vào mục tiêu cuối cùng: một sản phẩm phần mềm chất lượng cao, đáp ứng được cả yêu cầu kỹ thuật lẫn nhu cầu người dùng.

Trong một dự án thực tế:

  • Verification diễn ra sớm để phát hiện các vấn đề trong tài liệu, thiết kế, mã nguồn trước khi chúng trở thành lỗi nghiêm trọng trong sản phẩm chạy được. Ví dụ: QA review tài liệu yêu cầu, tìm thấy một chỗ mơ hồ -> Dev/BA sửa lại yêu cầu.
  • Validation diễn ra sau đó để kiểm tra xem sản phẩm đã hoàn thiện (hoặc một phần của sản phẩm) có hoạt động đúng như mong đợi của người dùng hay không. Ví dụ: QA thực hiện kiểm thử chức năng dựa trên yêu cầu đã được làm rõ, phát hiện bug -> Dev sửa code. Người dùng UAT kiểm tra, thấy luồng làm việc không tiện lợi -> BA/PO xem xét điều chỉnh yêu cầu/thiết kế cho sprint sau.

Một sản phẩm có thể được xây dựng “đúng cách” (pass Verification – tuân thủ mọi spec, không có lỗi cú pháp…) nhưng lại không phải là “đúng sản phẩm” (fail Validation – không đáp ứng nhu cầu thực tế, khó sử dụng). Ngược lại, một sản phẩm có thể tạm thời hoạt động đúng (pass Validation ở mức độ cơ bản) nhưng lại được xây dựng sai cách (fail Verification – mã nguồn lộn xộn, không tuân thủ tiêu chuẩn, khó bảo trì). Cả hai trường hợp đều không mang lại sản phẩm chất lượng bền vững.

Do đó, một chiến lược đảm bảo chất lượng hiệu quả luôn kết hợp chặt chẽ cả Verification và Validation trong suốt vòng đời phát triển phần mềm.

Ví Dụ Thực Tế

Hãy xem xét một kịch bản cụ thể về tính năng “Đăng ký người dùng mới” trên một website:

  1. Giai đoạn Yêu cầu (Requirements):
    • Verification: Kỹ sư QA, BA và Developer cùng nhau review tài liệu yêu cầu. QA kiểm tra xem các yêu cầu có đầy đủ, rõ ràng, không mâu thuẫn không? Ví dụ: Yêu cầu có ghi rõ định dạng email hợp lệ là gì không? Mật khẩu tối thiểu bao nhiêu ký tự? Các trường bắt buộc là gì? Họ tìm và ghi lại các điểm cần làm rõ hoặc mâu thuẫn.
  2. Giai đoạn Thiết kế (Design):
    • Verification: Team review bản thiết kế giao diện người dùng (UI/UX) và thiết kế cơ sở dữ liệu. QA kiểm tra xem thiết kế có phản ánh đúng yêu cầu không? Ví dụ: Giao diện đăng ký có đủ các trường thông tin cần thiết theo yêu cầu không? Cấu trúc bảng người dùng trong DB có lưu trữ được tất cả thông tin yêu cầu không?
  3. Giai đoạn Phát triển (Development):
    • Verification: Developer viết mã. Họ thực hiện Unit Test để kiểm tra các đơn vị code riêng lẻ (ví dụ: hàm kiểm tra định dạng email). Team thực hiện Code Review để tìm lỗi logic, vi phạm tiêu chuẩn mã hóa, hoặc các vấn đề về hiệu năng/bảo mật ngay trong mã nguồn. Các công cụ Static Analysis tự động chạy để phát hiện các vấn đề phổ biến.
    • Validation (sớm, ở mức độ unit/integration): Mặc dù Validation thường dùng cho sản phẩm chạy được, một số dạng kiểm thử ở mức thấp như Integration Test có thể được coi là Validation sớm, kiểm tra sự tương tác giữa các thành phần (ví dụ: API đăng ký hoạt động đúng với DB).
  4. Giai đoạn Kiểm thử (Testing):
    • Validation: Đây là trọng tâm của Validation. Kỹ sư QA viết và thực hiện các Test Case dựa trên yêu cầu nghiệp vụ:
    • Kiểm thử chức năng: Đăng ký thành công với dữ liệu hợp lệ, đăng ký thất bại với dữ liệu không hợp lệ (email sai định dạng, mật khẩu quá ngắn, email đã tồn tại…), kiểm tra thông báo lỗi.
    • Kiểm thử phi chức năng: Kiểm tra hiệu năng khi có nhiều người đăng ký cùng lúc, kiểm thử bảo mật (ví dụ: SQL injection trên form đăng ký), kiểm thử khả năng sử dụng (form có dễ điền không, lỗi có thân thiện không?), kiểm thử tương thích trên các trình duyệt/thiết bị khác nhau.
  5. Giai đoạn Chấp nhận Người dùng (UAT):
    • Validation: Người dùng cuối hoặc khách hàng sử dụng tính năng đăng ký trong môi trường gần giống production. Họ kiểm tra xem luồng đăng ký có phù hợp với quy trình làm việc thực tế của họ không, có dễ hiểu và sử dụng không. Phản hồi của họ là cơ sở quan trọng để khẳng định sản phẩm có “đúng” với nhu cầu thực tế hay không.

Qua ví dụ này, bạn có thể thấy Verification giúp chúng ta xây dựng tính năng “Đăng ký” theo đúng “công thức” (yêu cầu, thiết kế, tiêu chuẩn code), còn Validation giúp chúng ta đảm bảo tính năng “Đăng ký” thực sự là thứ mà người dùng cần và có thể sử dụng hiệu quả.

Kết Luận

Kiểm chứng (Verification) và Thẩm định (Validation) là hai khái niệm cốt lõi trong lĩnh vực đảm bảo chất lượng phần mềm. Mặc dù thường đi đôi và bổ trợ cho nhau, chúng đại diện cho hai góc nhìn khác nhau về chất lượng:

  • Verification: Làm đúng sản phẩm theo đặc tả kỹ thuật (“Are we building the product right?”).
  • Validation: Làm đúng sản phẩm đáp ứng nhu cầu người dùng (“Are we building the right product?”).

Đối với những bạn đang trên lộ trình trở thành Kỹ sư QA chuyên nghiệp, việc nắm vững sự khác biệt này là bước đệm vững chắc để hiểu sâu hơn về các hoạt động kiểm thử, lập kế hoạch công việc hiệu quả và đóng góp tích cực vào việc tạo ra các sản phẩm phần mềm không chỉ hoạt động đúng mà còn thực sự mang lại giá trị cho người dùng.

Hy vọng bài viết này đã giúp các bạn làm sáng tỏ hai khái niệm quan trọng này. Trong các bài viết tiếp theo của loạt bài “QA Engineer (Tester) Roadmap”, chúng ta sẽ tiếp tục khám phá sâu hơn về các kỹ thuật kiểm thử, các loại kiểm thử khác nhau, và nhiều kiến thức hữu ích khác. Hãy cùng chờ đón nhé!

Chỉ mục