Nội dung
1. Unit Testing là gì?
Unit testing là một loại kiểm thử phần mềm. Trong đó, các đơn vị (unit) hoặc thành phần riêng lẻ của phần mềm được kiểm thử. Mục đích của việc này là xác minh tính chính xác của mỗi đơn vị code.
Các dev thực hiện Unit Testing trong quá trình phát triển (giai đoạn viết code) ứng dụng. Unit Tests tách một phần code và xác minh tính đúng đắn của nó. Một đơn vị có thể là một chức năng (function), phương pháp (method), thủ tục (procedure), mô-đun hoặc đối tượng riêng lẻ (object).
Trong SDLC, STLC, V Model, Unit testing là bước kiểm thử đầu tiên trước khi kiểm tra tích hợp. Unit testing là một kỹ thuật kiểm tra hộp trắng (WhiteBox) thường được thực hiện bởi dev.
2. Tại sao chúng ta nên Unit Testing?
Unit Testing rất quan trọng. Đôi khi, các software dev lại cố gắng tiết kiệm thời gian bằng cách thực hiện unit testing tối thiểu. Điều này là sai lầm vì unit testing không phù hợp dễ khiến chi phí tăng lên. Bởi vì chúng ta phải sửa lại những lỗi trong quá trình kiểm tra hệ thống, kiểm tra tích hợp và thậm chí là thử nghiệm beta (Beta Testing) sau khi ứng dụng được build. Nếu unit testing thích hợp sớm được thực hiện trong quá trình phát triển. Nó sẽ giúp chúng ta tiết kiệm được thời gian, công sức và cả tiền bạc.
Dưới đây là những lý do chính để thực hiện unit testing trong kỹ thuật phần mềm:
- Unit tests giúp sớm fix bugs trong vòng đời phát triển (development cycle) và tiết kiệm chi phí.
- Nó giúp các dev hiểu việc test code base và cho phép họ thay đổi một cách nhanh chóng
- Các unit test tốt đóng vai trò như tài liệu của dự án
- Unit tests giúp sử dụng lại code. Di chuyển cả code và test của bạn sang dự án mới. Chỉnh sửa code cho đến khi các test chạy lại.
3. Cách thực hiện Unit Testing
Để thực hiện Unit Testing, các dev viết một đoạn code để kiểm tra chức năng (function) cụ thể trong ứng dụng phần mềm. Các dev cũng có thể cô lập function này để có thể kiểm tra kỹ hơn. Điều này cho ta thấy dependencies không cần thiết giữa function được test và các đơn vị khác để có thể loại bỏ. Các dev thường sử dụng framework UnitTest để phát triển test cases (trường hợp kiểm thử) tự động cho unit testing.
Unit Testing có hai loại:
- Thủ công
- Tự động
Unit testing thường được tự động hóa nhưng vẫn có thể thực hiện thủ công. Software Engineering không ưu tiên cái này hơn cái kia. Tuy nhiên, tự động hóa lại được yêu thích hơn. Nếu muốn unit testing theo cách thủ công, bạn có thể sử dụng tài liệu hướng dẫn theo từng bước cụ thể.
Theo phương pháp tự động
- Dev viết một đoạn code trong ứng dụng để kiểm tra function. Sau đó, họ sẽ đưa ra bình luận và cuối cùng xóa test code khi ứng dụng được triển khai.
- Dev cũng có thể cô lập function để kiểm tra nó kỹ hơn. Đây là việc thực hành unit testing kỹ lưỡng hơn bao gồm việc sao chép và dán code vào môi trường kiểm thử (test environment) hơn là môi trường tự nhiên (natural environment). Việc cô lập code giúp biết được dependencies không cần thiết giữa các code được kiểm tra và các đơn vị hoặc không gian dữ liệu khác trong sản phẩm. Dependencies này sau đó có thể được loại bỏ.
- Dev thường sử dụng Framework UnitTest để phát triển test cases tự động. Sử dụng framework tự động hóa, dev mã hóa các tiêu chí vào bài test để xác minh tính đúng đắn của code. Trong quá trình thực hiện test cases, framework ghi lại test cases không thành công. Nhiều framework cũng sẽ tự động gắn cờ và report. Tùy thuộc vào mức độ nghiêm trọng của lỗi, framework có thể tạm dừng test.
- Workflow của Unit Testing là 1) Tạo ra test cases 2) Xem lại/Làm lại 3) Đường cơ sở (baseline) 4) Thực hiện test cases.
4. Kỹ thuật Unit Testing
Kỹ thuật Unit Testing chủ yếu được phân loại thành ba phần là: kiểm thử hộp đen bao gồm kiểm tra giao diện người dùng cùng với đầu vào và đầu ra, kiểm thử hộp trắng bao gồm kiểm tra hành vi chức năng của ứng dụng phần mềm và kiểm thử hộp xám được sử dụng để thực hiện test suites, test methods, test cases và thực hiện phân tích rủi ro.
Các kỹ thuật code coverage được sử dụng trong Unit Testing được liệt kê dưới đây:
- Statement Coverage
- Decision Coverage
- Branch Coverage
- Condition Coverage
- Finite State Machine Coverage
5. Công cụ Unit Testing
Có một số phần mềm unit test tự động có sẵn nhằm hỗ trợ unit testing. Dưới đây là một vài ví dụ:
- Junit: Junit là công cụ miễn phí được sử dụng cho ngôn ngữ lập trình Java. Nó cung cấp assertions để xác định phương pháp kiểm tra. Đầu tiên, công cụ này kiểm tra dữ liệu và sau đó chèn vào đoạn code.
- NUnit: NUnit là framework unit-testing được sử dụng rộng rãi cho tất cả các ngôn ngữ .NET. Nó là công cụ mã nguồn mở, có thể viết script theo cách thủ công. Ngoài ra, nó còn hỗ trợ các bài kiểm tra data-driven có thể chạy song song.
- JMockit: JMockit là công cụ Unit testing mã nguồn mở. Nó là công cụ code coverage với các số liệu đường (line) và đường dẫn (path). Công cụ này cung cấp Line coverage, Path Coverage, và Data Coverage.
- EMMA: EMMA là một toolkit mã nguồn mở để phân tích và báo cáo code được viết bằng ngôn ngữ Java. Emma hỗ trợ các loại coverage như method, line, basic block. Nó dựa trên Java nên không có dependencies thư viện bên ngoài và có thể truy cập source code.
- PHPUnit: PHPUnit là công cụ unit testing dành cho lập trình viên PHP. Nó sử dụng các phần nhỏ của code được gọi là các đơn vị và kiểm tra từng phần trong số chúng một cách riêng biệt. Công cụ này cũng cho phép các dev sử dụng các phương pháp pre-define assertion để khẳng định hệ thống hoạt động theo cách nhất định.
6. Ưu và nhược điểm của Unit Testing
Ưu điểm của Unit Testing bao gồm:
- Chúng 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 gồm:
- 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.
7. Vậy thế nào mới được xem là Unit Testing tốt?
- Chạy nhanh
- Chạy độc lập giữa các test case, không phụ thuộc vào thứ tự kiểm thử
- Sử dụng data dễ hiểu, dễ đọc
- Test case dễ đọc, đơn giản, dễ bảo trì
- Phản ảnh đúng hoạt động của module
8. Lời kết
Tương tự như code, Unit Testing cũng nên thực hành một cách liên tục để có thể thành thạo hơn. Bất kỳ công cụ hay ngôn ngữ nào trong thế giới lập trình đều có 2 mặt ưu và nhược điểm. Điều quan trọng là bạn phải biết cách tận dụng, phát huy những ưu điểm. Và Unit Testing chỉ mang lại lợi ích nếu bạn đặt vấn đề chất lượng phần mềm lên hàng đầu.
Nguồn: