Kiểm thử phần mềm là một khâu không thể thiếu khi phát triển bất kỳ hệ thống, website hay ứng dụng nào. Kiểm thử giúp đảm bảo hệ thống không xảy ra lỗi và vận hành đúng chức năng mong đợi ban đầu. Là một kiểm thử viên hay lập trình viên, bạn cũng nên nắm được các loại kiểm thử phần mềm phổ biến bởi mỗi loại lại phù hợp với mục đích riêng.
Kiểm thử thủ công (Manual Testing) và Kiểm thử tự động (Automation Testing)
Ở cấp độ cao, kiểm thử thường được chia làm 2 loại: Kiểm thử thủ công và kiểm thử tự động, hay còn được đọc ngắn gọn là “manual test” và “auto test”.
Kiểm thử thủ công
Kiểm thử thủ công thường được thực hiện bằng chính bản thân kiểm thử viên (tester). Họ sẽ tương tác với ứng dụng hoặc phần mềm và API bằng công cụ thích hợp. Từ đó tester tìm ra điểm không phù hợp hay các lỗi của hệ thống. Cách kiểm thử truyền thống này thường tốn kém vì nó yêu cầu môi trường kiểm thử. Cùng với đó, việc tự thực hiện các thao tác kiểm thử có thể dễ xảy ra lỗi do con người. Vì người kiểm thử có thể mắc lỗi chính tả hoặc bỏ qua các bước trong tập lệnh kiểm thử (test script).
Kiểm thử tự động
Ngược lại, kiểm thử tự động được thực hiện bởi máy móc, thực thi tập lệnh kiểm thử đã được viết trước. Các lệnh kiểm thử này có thể khác nhau rất nhiều về độ phức tạp. Từ việc kiểm tra các đơn vị nhỏ nhất trong mã nguồn như method, class đến việc đảm bảo rằng việc thực hiện một chuỗi các hành động phức tạp trong giao diện người dùng sẽ dẫn đến kết quả giống nhau. Nhiều người cho rằng phương pháp này mạnh mẽ và đáng tin cậy hơn so với kiểm thử thủ công. Nhưng chất lượng của các lệnh kiểm thử tự động phụ thuộc việc các tập lệnh kiểm thử được viết ra có tốt hay không.
Các loại kiểm thử phần mềm phổ biến
Unit testing (Kiểm thử đơn vị)
Unit test là cấp độ kiểm thử thấp nhất trong các loại kiểm thử phần mềm. Với unit test, nhiệm vụ của tester là kiểm thử các phần riêng lẻ của phần mềm như: hàm (Function), phương thức (Method), lớp (Class), thủ tục (Procedure). Hình thức kiểm thử này thường được áp dụng trong giai đoạn phát triển, khi các phần code được cô lập để kiểm tra tính chính xác của các đơn vị riêng biệt. Unit test nói chung khá rẻ để tự động hóa và có thể được chạy rất nhanh bởi một máy chủ tích hợp liên tục.
Integration Testing (Kiểm thử tích hợp)
Đúng như tên gọi của nó, việc kiểm thử tích hợp có tác dụng xác minh xem các mô-đun (modules) khác nhau của ứng dụng của bạn có hoạt động tốt cùng nhau. Ví dụ: kiểm thử sự tương tác với cơ sở dữ liệu hoặc đảm bảo rằng các microservices hoạt động cùng nhau như mong muốn. Việc thực hiện loại kiểm thử này tốn kém hơn vì chúng yêu cầu nhiều phần của ứng dụng được thiết lập và chạy cùng nhau.
Functional Testing (Kiểm thử chức năng)
Việc kiểm thử chức năng sẽ tập trung vào các yêu cầu nghiệp vụ của một ứng dụng. Đôi khi có sự nhầm lẫn giữa các kiểm thử tích hợp và kiểm thử chức năng. Vì cả hai hình thức kiểm thử này đều yêu cầu nhiều thành phần của hệ thống tương tác với nhau. Sự khác biệt là kiểm thử tích hợp có thể chỉ đơn giản xác minh rằng bạn có thể truy vấn cơ sở dữ liệu. Còn kiểm thử chức năng sẽ mong muốn nhận được một giá trị cụ thể từ cơ sở dữ liệu như được xác định bởi các yêu cầu sản phẩm.
End-to-end testing (Kiểm tra từ đầu đến cuối)
Kiểm thử end-to-end tái tạo hành vi của người dùng với ứng dụng trong một môi trường ứng dụng hoàn chỉnh. Hình thức này giúp xác minh rằng các luồng người dùng (user flow) khác nhau hoạt động như mong đợi. Hành vi này có thể đơn giản như tải một trang web hoặc đăng nhập, hoặc các hành vi phức tạp hơn nhiều như: xác minh thông báo qua email, thanh toán trực tuyến, v.v. Việc kiểm thử đầu cuối rất hữu ích trong các loại kiểm thử phần mềm, nhưng cũng rất tốn kém để thực hiện và có thể khó duy trì khi chúng được tự động hóa. Bạn nên có một vài thử nghiệm đầu cuối quan trọng và dựa nhiều hơn vào các loại thử nghiệm cấp thấp hơn (kiểm thử đơn vị và tích hợp).
Acceptance Testing (Kiểm thử chấp nhận)
Kiểm thử chấp nhận là các kiểm tra chính thức được thực hiện để xác minh xem hệ thống có đáp ứng các yêu cầu nghiệp vụ của nó hay không. Chúng yêu cầu toàn bộ ứng dụng phải được thiết lập và chạy và tập trung vào việc tái tạo các hành vi của người dùng. Nhưng ta có thể tiến xa hơn, đó là đo lường hiệu suất của hệ thống và từ chối các thay đổi nếu các mục tiêu nhất định không được đáp ứng.
Performance Testing (Kiểm thử hiệu suất)
Cách kiểm thử này kiểm tra các hành vi của hệ thống khi nó đang phải chịu lượng tải (loading) lớn. Kiểm thử hiệu suất không mang tính chức năng và có thể có nhiều dạng khác nhau để hiểu độ tin cậy, tính ổn định và tính khả dụng của phần mềm. Ví dụ: kiểm thử quan sát thời gian phản hồi khi thực hiện một số lượng lớn yêu cầu hoặc xem hệ thống hoạt động như thế nào với một lượng lớn dữ liệu. Hình thức này về bản chất là khá tốn kém để thực hiện và chạy, nhưng lại có thể giúp bạn hiểu liệu các thay đổi mới có làm suy giảm hệ thống của bạn hay không.
Smoke Testing (Kiểm thử khói)
Kiểm thử khói là các bài kiểm tra cơ bản giúp kiểm tra chức năng cơ bản của ứng dụng. Mục tiêu của kiểm thử khói là đảm bảo rằng các tính năng chính của hệ thống của bạn đang hoạt động như mong đợi. Cách kiểm thử phần mềm này được thực hiện ngay sau khi một bản dựng (build) mới được thực hiện để quyết định xem bạn có thể thực hiện các hình thức kiểm thử đắt tiền hơn hay không. Kiểm thử khói cũng có thể diễn ra ngay sau khi triển khai để đảm bảo rằng ứng dụng đang chạy đúng cách trong môi trường mới được triển khai.