Unit test là gì? Đây là một hoạt động kiểm thử phần mềm. Trong đó, các đơn vị được kiểm thử. Mục đích là xác minh tính chính xác của mỗi đơn vị code.
Nếu công việc hiện tại của bạn gắn liền với các dự án phát triển phần mềm. Thì chắc hẳn Unit Test đã không còn quá xa lạ với bạn nữa rồi. Unit Test mang đến rất nhiều lợi ích, góp phần đem đến thành công của ứng dụng. Vậy nên có thể nói rằng nó là bước không thể thiếu để đưa ứng dụng vào thực tế.
Nếu bạn là một newbie, mới chập chững bước vào thế giới lập trình. Chắc hẳn những kiến thức cơ bản về Unit Tes sẽ rất hữu ích với bạn. Vì thế trong bài viết này sẽ đi lần lượt từng phần như sau:
- Unit Test là gì?
- Tại sao chúng ta nên Unit Test?
- Cách thực hiện Unit Test
- Kỹ thuật Unit Test
- Công cụ Unit Test
- Ưu và nhược điểm của Unit Test
- Vậy thế nào là Unit Test tốt?
Unit Test là gì?
Unit test 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 Test 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 test là bước kiểm thử đầu tiên trước khi kiểm tra tích hợp. Unit test là một kỹ thuật kiểm tra hộp trắng (WhiteBox) thường được thực hiện bởi dev.
Tại sao chúng ta nên Unit Test?
Unit Test 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 test tối thiểu. Điều này là sai lầm vì unit test 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 test 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 test 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.
Cách thực hiện Unit Test
Để thực hiện Unit Test, 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 test.
Unit Test có hai loại:
- Thủ công
- Tự động
Unit test 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 test 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 test 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 Unit Test để 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 Test 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.
Kỹ thuật Unit Test
Kỹ thuật Unit Test 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 Test được liệt kê dưới đây:
- Statement Coverage
- Decision Coverage
- Branch Coverage
- Condition Coverage
- Finite State Machine Coverage
Công cụ Unit Test
Có một số phần mềm unit test tự động có sẵn nhằm hỗ trợ unit test. Dưới đây là một vài ví dụ:
Ngôn ngữ | Công cụ Unit Test |
---|---|
Python | unittest, pytest |
Java | JUnit, TestNG |
C++ | Google Test, Catch2, CppUnit |
C# | NUnit, xUnit.net |
JavaScript | Jest, Mocha, Jasmine |
PHP | PHPUnit, Codeception |
Go | testify, go-test, gocov |
Ruby | RSpec, minitest |
Swift | XCTest |
Kotlin | JUnit, Kotlinx Test |
Scala | ScalaTest, JUnit |
TypeScript | Jest, Mocha, Jasmine |
Ví dụ JUnit Test case
// MathFunctions.java public class MathFunctions { public int add(int a, int b) { return a + b; } } import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class MathFunctionsTest { @Test public void testAddition() { MathFunctions mathFunctions = new MathFunctions(); int result = mathFunctions.add(2, 3); assertEquals(5, result); } @Test public void testNegativeNumbers() { MathFunctions mathFunctions = new MathFunctions(); int result = mathFunctions.add(-1, -2); assertEquals(-3, result); } @Test public void testMixedNumbers() { MathFunctions mathFunctions = new MathFunctions(); int result = mathFunctions.add(5, -3); assertEquals(2, result); } }
Dùng maven run unit test
mvn test
Đó chỉ là một vài trong số các công cụ unit test có sẵn. Có rất nhiều tool khác nữa dành cho các ngôn ngữ C và Java.
Ưu và nhược điểm của Unit Test
Ưu điểm của Unit Test:
- 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 Test:
- 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 test 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.
Vậy thế nào mới được xem là Unit Test 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
Lời kết:
Tương tự như code, Unit Test 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 Test 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.
Hi vọng bạn có thêm những kiến thức cơ bản về Unit Test. Những kiến thức này sẽ phần nào giúp bạn hình dung về công việc kiểm thử các đơn vị. Từ những lý thuyết nền tảng, chúc bạn sẽ dần dần tiến xa hơn trên con đường sự nghiệp của mình.