Hay còn gọi là Kiểm thử đơn vị, là một loại kiểm thử phần mềm tập trung vào việc kiểm tra các thành phần hoặc “đơn vị” nhỏ nhất và riêng biệt của mã nguồn. Một đơn vị có thể là một hàm (function), một phương thức (method), một lớp (class) hoặc một module. Mục đích chính của Unit Testing là để xác minh rằng mỗi đơn vị này hoạt động đúng theo thiết kế và thực hiện chức năng của nó một cách độc lập.
Vòng đời Unit Test
Unit Test có 3 trạng thái cơ bản như sau:
- Fail – trạng thái lỗi.
- Ignore – trạng thái tạm ngừng thực hiện.
- Pass – trạng thái làm việc.
Unit Test được vận hành trong hệ thống tách biệt có nhiều PM hỗ trợ thực thi UT với giao diện trực quan. Thường thì trạng thái Unit Test được biểu hiện với những màu sắc khác nhau như là màu xanh (pass), màu vàng (ignore) và màu đỏ (fail).
Unit Test chỉ đem lại hiệu quả khi:
- Tự động hoàn toàn
- Được vận hành lặp lại nhiều lần
- Độc lập với các Unit Test khác.
Thiết kế Unit test
Mỗi UT đều được thiết kế theo đúng trình tự như sau:
- Thiết lập các điều kiện cần thiết: Khởi tạo đối tượng -> Xác định tài nguyên cần thiết -> Xây dựng các dữ liệu giả.
- Triệu gọi phương thức cần kiểm tra.
- Kiểm tra hoạt động chính xác của các phương thức.
- Dọn dẹp tài nguyên sau khi kiểm tra kết thúc.
Ứng dụng Unit test
- Kiểm tra đơn vị nhỏ nhất sẽ là các thuộc tính, thủ tục, sự kiện và hàm.
- Kiểm tra trạng thái, ràng buộc đối tượng ở mức sâu mà thông thường chúng ta khó có thể truy cập được.
- Kiểm tra quy trình (process) và mở rộng là các khung làm việc (workflow – tập hợp của nhiều quy trình).
Những khái niệm thường thấy khi làm Unit test
- Assertion
- Là một phát biểu mô tả các công việc kiểm tra cần tiến hành, thí dụ: AreEqual(), IsTrue(), IsNotNull()…
- Mỗi một UT gồm nhiều assertion kiểm tra dữ liệu đầu ra, tính chính xác của các lỗi ngoại lệ ra và các vấn đề phức tạp khác như:
- Sự tồn tại của một đối tượng
- Điều kiện biên: Các giá trị có vượt ra ngoài giới hạn hay không
- Thứ tự thực hiện của các luồng dữ liệu …
- Test Point
- Là một đơn vị kiểm tra nhỏ nhất, chỉ chứa đơn giản một assertion nhằm khẳng định tính đúng đắn của một chi tiết mã nào đó. Mọi thành viên dự án đều có thể viết một test point.
- Test Case
- Là một tập hợp các test point nhằm kiểm tra một đặc điểm chức năng cụ thể, thí dụ toàn bộ giai đoạn người dùng nhập dữ liệu cho đến khi thông tin được nhập vào cơ sở dữ liệu. Trong nhiều trường hợp kiểm tra đặc biệt và khẩn cấp có thể không cần đến test case.
- Test Suite
- Là một tập hợp các test case định nghĩa cho từng module hoặc hệ thống con.
- Regression Testing (hoặc Automated Testing)
- Là phương pháp kiểm nghiệm tự động sử dụng một phần mềm đặc biệt. Cùng một loại dữ liệu kiểm tra giống nhau nhưng được tiến hành nhiều lần lặp lại tự động nhằm ngăn chặn các lỗi cũ phát sinh trở lại.
- Kết hợp Regression Testing với Unit Testing sẽ đảm bảo các đoạn mã mới vẫn đáp ứng yêu cầu thay đổi và các đoạn mã cũ sẽ không bị ảnh hưởng bởi các hoạt động bảo trì.
- Production Code
- Phần mã chính của ứng dụng được chuyển giao cho khách hàng.
- Unit Testing Code
- Phần mã phụ để kiểm tra mã ứng dụng chính, không được chuyển giao cho khách hàng.
Ưu điểm của Unit Testing
- Ta có thể kiểm thử từng phần riêng rẽ mà không phải đợi các phần khác hoàn thành.
- Vấn đề được phát hiện càng sớm thì càng ít lỗi phức hợp xảy ra.
- Quá trình debug được thực hiện dễ dàng hơn.
- Các dev có thể nhanh chóng thực hiện những thay đổi đối với code base.
- Các dev cũng có thể sử dụng lại code, chuyển nó sang các dự án mới.
- Các lỗi được phát hiện sớm sẽ giúp giảm chi phí sửa lỗi. Bởi vì chi phí sửa lỗi trong giai đoạn unit test sẽ ít hơn so với những giai đoạn sau.
Nhược điểm của Unit Testing
- Các bài test sẽ không phát hiện ra tất cả các bug.
- Unit tests chỉ kiểm tra các tập dữ liệu và chức năng của nó. Chứ unit tests không tìm ra các lỗi tích hợp.
- Có thể cần viết nhiều dòng test code hơn để kiểm tra một dòng code.
- Unit testing cần đầu tư thời gian, công sức để học tập. Bởi vì đôi khi bạn cần học cách sử dụng các công cụ phần mềm tự động.