Kiểm thử đơn vị
Unit testing là một mức độ kiểm thử phần mềm, đòi hỏi phải chuẩn bị trước các test case hoặc script, chỉ định rõ dữ liệu vào, các bước thực hiện và dữ liệu mong đợi được xuất ra. Chúng ta cùng tìm hiểu rõ hơn qua bài viết này nhé.
1. Unit là gì?
Trước tiên, ta cần hiểu được khác niệm Unit là gì?
Unit là một thành phần nhỏ nhất trong phần mềm có thể thực hiện kiểm thử. Các hàm (Function), thủ tục (Procedure), lớp (Class), hoặc các phương thức (Method) đều là Unit.
2. Kiểm thử đơn vị (Unit testing) là gì?
Kiểm thử đơn vị được định nghĩa là một loại kiểm thử phần mềm trong đó các đơn vị hay thành phần riêng lẻ của phần mềm được kiểm thử.
Bài viết này được đăng tại [free tuts .net]
Kiểm thử đơn vị được thực hiện trong quá trình phát triển (coding) ứng dụng. Mục tiêu của Kiểm thử đơn vị là cô lập một phần code và xác minh tính chính xác của đơn vị đó. Trong lập trình thủ tục, một đơn vị có thể là một chức năng hoặc thủ tục riêng lẻ. Kiểm thử đơn vị thường được thực hiện bởi developer.
Trong quy trình phát triển phần mềm, quy trình kiểm thử phần mềm, Mô hình chữ V, Kiểm thử đơn vị là cấp độ kiểm thử đầu tiên được thực hiện trước khi kiểm thử tích hợp. Kiểm thử đơn vị là một kỹ thuật WhiteBox testing, thường được thực hiện bởi developer. Tuy nhiên trong một thực tế, do thời gian bị giới hạn hoặc yêu cầu của các developer, các kỹ sư QA cũng thực hiện kiểm thử đơn vị.
3. Tại sao cần kiểm thử đơn vị?
Đôi khi các developer tiết kiệm thời gian bằng cách thực hiện kiểm thử đơn vị trong phạm vi tối thiểu. Đây là một sai lầm bởi vì thực hiện kiểm thử đơn vị không kĩ lưỡng sẽ dẫn đến chi phí sửa lỗi cao hơn trong quá trình Kiểm thử hệ thống, Kiểm thử tích hợp và thậm chí Kiểm thử Beta sau khi ứng dụng hoàn tất. Kiểm thử đơn vị được thực hiện trong giai đoạn xây dựng sẽ giúp tiết kiệm cả thời gian và tiền bạc. Đây là những lý do chính để thực hiện kiểm thử đơn vị.
- Kiểm thử đơn vị giúp sửa lỗi sớm trong chu kỳ phát triển và tiết kiệm chi phí.
- Kiểm thử đơn vị giúp các developer hiểu cơ sở nền tảng và cho phép họ thay đổi nhanh chóng
- Kiểm thử đơn vị tốt sẽ được phục vụ như tài liệu dự án
- Kiểm thử đơn vị có thể sử dụng lại code. Sao chép cả code và những trường hợp kiểm thử sang dự án mới. Chỉnh code để có thể chạy lại.
4. Cách thực hiện kiểm thử đơn vị
Kiểm thử đơn vị có hai loại:
- Thủ công
- Tự động
Kiểm thử đơn vị thường được thực hiện tự động nhưng vẫn có thể được thực hiện thủ công. Kiểm thử đơn vị tự động hóa được ưa thích hơn.
Theo hướng tiếp cận tự động:
- Một developer viết một phần code trong ứng dụng và chỉ kiểm thử chức năng. Sau đó, họ sẽ chú thích và cuối cùng sẽ loại bỏ code kiểm thử khi ứng dụng được triển khai.
- Một developer cũng có thể cô lập chức năng để kiểm thử được chặt chẽ hơn. Kiểm thử đơn vị được thực hiện kỹ lưỡng hơn nếu copy code vào môi trường kiểm thử riêng so với môi trường tự nhiên của nó. Cô lập code giúp nhận biết các ràng buộc không cần thiết giữa code được kiểm thử và các đơn vị khác trong sản phẩm. Những ràng buộc đó có thể được loại bỏ.
- Một lập trình viên thường sử dụng UnitTest Framework để phát triển các test cases tự động. Sử dụng Framework tự động hóa, các developer kiểm thử các tiêu chí codes để xác minh tính chính xác của code. Trong quá trình thực hiện các test cases, framework ghi và file log các test cases bị lỗi. Nhiều framework cũng sẽ tự động gắn cờ và báo cáo. Tùy thuộc vào mức độ nghiêm trọng của một lỗi, framework có thể tạm dừng kiểm thử.
- Quy trình làm việc của Kiểm thử đơn vị là: Tạo các test cases => Review/Rework => Baseline => Thực hiện các test cases
5. Kỹ thuật kiểm thử đơn vị
Các kỹ thuật bao phủ code được sử dụng trong kiểm thử đơn vị được liệt kê dưới đây:
- Statement Coverage
- Decision Coverage
- Branch Coverage
- Condition Coverage
- Finite State Machine Coverage
6. Ví dụ kiểm thử đơn vị: đối tượng giả lập
Kiểm thử đơn vị dựa trên các đối tượng giả lập được tạo để kiểm thử các phần code chưa phải là một phần của ứng dụng hoàn chỉnh. Các đối tượng giả lập là các phần còn thiếu của chương trình.
Ví dụ: có một hàm cần các biến hoặc đối tượng chưa được tạo. Trong kiểm thử đơn vị, chúng sẽ được tính toán dưới dạng các đối tượng giả lập được tạo ra chỉ nhằm mục đích kiểm thử đơn vị, được thực hiện trên phần code đó.
7. Công cụ kiểm thử đơn vị
Có một số công cụ tự động có sẵn hỗ trợ kiểm thử đơn vị. Chúng ta cùng xem một vài ví dụ dưới đây:
- Jtest: Parasoft Jtest là một plugin IDE sử dụng các frameworks mã nguồn mở (Junit, Mockito, PowerMock và Spring) với các chỉ dẫn và hành động, dễ dàng tạo, mở rộng và bảo trì kiểm thử đơn vị. Bằng cách kiểm thử đơn vị tự động trường hợp tốn thời gian, sẽ giúp developer tập trung vào logic và tạo ra các bộ kiểm thử có ý nghĩa hơn.
- Junit: Junit là một công cụ kiểm thử miễn phí, được sử dụng cho ngôn ngữ lập trình Java. Junit cung cấp các nhận định để xác định phương pháp kiểm thử. Công cụ này kiểm thử dữ liệu đầu tiên, sau đó chèn vào đoạn code.
- NUnit: NUnit được sử dụng rộng rãi, sử dụng framework kiểm thử đơn vị cho tất cả các ngôn ngữ .net. Đây là một công cụ mã nguồn mở cho phép viết các kịch bản thủ công, hỗ trợ các kiểm thử dựa trên dữ liệu (data-driven) có thể chạy song song.
- JMockit: JMockit là công cụ kiểm thử Đơn vị mã nguồn mở. Đây là một công cụ bao phủ code với các số liệu path và line. JMockit cho phép bắt chước API với cú pháp recording và verification. Công cụ này xác định Line coverage, Path Coverage, và Data Coverage.
- EMMA: EMMA là bộ công cụ mã nguồn mở dùng để 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 bao phủ như method, line, basic block. Emma dựa trên Java nên không phụ thuộc vào thư viện bên ngoài và có thể truy cập mã nguồn.
- PHPUnit: PHPUnit là một công cụ kiểm thử đơn vị cho lập trình viên PHP. Phải mất một phần nhỏ code được gọi là các đơn vị và kiểm thử từng mã riêng biệt. Công cụ này cũng cho phép các developer sử dụng các phương thức xác nhận được xác định trước để khẳng định rằng một hệ thống hoạt động theo một cách nhất định.
Đó chỉ là một vài công cụ kiểm thử đơn vị. Có nhiều công cụ kiểm thử đơn vị khác, đặc biệt là đối với ngôn ngữ C và Java, nhưng rất dễ dàng để tìm thấy một công cụ kiểm thử đơn vị cho nhu cầu lập trình của mình bất kể ngôn ngữ bạn sử dụng là gì.
8. Kiểm thử hướng phát triển (Test Driven Development - TDD) & Kiểm thử đơn vị
Kiểm thử đơn vị trong TDD liên quan đến việc sử dụng rộng rãi các framework kiểm thử. Một framework kiểm thử đơn vị được sử dụng để tạo các kiểm thử đơn vị tự động. Các framework kiểm thử đơn vị không phải dành riêng cho TDD, nhưng chúng rất cần thiết.
- Các kiểm thử được viết trước code
- Dựa rất nhiều vào các framework kiểm thử
- Tất cả các lớp trong các ứng dụng được kiểm thử
- Tích hợp nhanh chóng và dễ dàng
9. Sai lầm trong kiểm thử đơn vị
Sai lầm:
- Mất nhiều thời gian và kiểm thử đơn vị là không cần thiết
- Code đã chay đúng, không cần kiểm thử đơn vị.
Sai lầm tạo nên từ những giả định sai lầm. Những giả định đó dẫn đến một vòng luẩn quẩn sau đây:
Sự thật là kiểm thử đơn vị là rất cần thiết, làm tăng tốc độ phát triển phần mềm.
Các lập trình viên nghĩ rằng Kiểm thử tích hợp sẽ phát hiện tất cả các lỗi và không cần thực hiện kiểm thử đơn vị. Khi các đơn vị được tích hợp, các lỗi rất đơn giản có thể dễ dàng tìm thấy và sửa chữa trong đơn vị được kiểm thử sẽ mất một thời gian rất dài để được theo dõi và sửa chữa.
10. Ưu điểm và Nhược điểm của kiểm thử đơn vị
Ưu điểm:
- Các developer muốn tìm hiểu chức năng nào được cung cấp bởi một đơn vị và cách sử dụng chức năng này có thể xem xét các test cases kiểm thử đơn vị để có được sự hiểu biết cơ bản về unit API.
- Kiểm thử đơn vị cho phép lập trình viên cấu trúc lại code vào một ngày sau đó và đảm bảo mô-đun vẫn hoạt động chính xác (ví dụ: Kiểm thử hồi quy). Quy trình là viết các trường hợp kiểm thử cho tất cả các hàm và phương thức để mỗi khi thay đổi gây ra lỗi, nó có thể được xác định và sửa chữa nhanh chóng.
- Do tính chất mô-đun của kiểm thử đơn vị, chúng ta có thể kiểm thử các phần của dự án mà không cần chờ người khác hoàn thành.
Nhược điểm:
- Kiểm thử đơn vị không thể phát hiện được mọi lỗi trong một chương trình. Không thể đánh giá tất cả các luồng thực hiện ngay cả trong các chương trình tầm thường nhất
- Kiểm thử đơn vị theo bản chất là tập trung vào một đơn vị code. Do đó, kiểm thử đơn vị không thể bắt lỗi tích hợp hoặc lỗi hệ thống lớn.
11. Thực hiện kiểm thử đơn vị như thế nào để đạt được kết quả tốt nhất?
- Các trường hợp kiểm thử đơn vị phải độc lập. Trong trường hợp có bất kỳ cải tiến hoặc thay đổi trong yêu cầu, các trường hợp kiểm thử đơn vị sẽ không bị ảnh hưởng.
- Chỉ kiểm thử một đoạn code tại một thời điểm.
- Thực hiện theo các quy ước đặt tên rõ ràng và nhất quán cho các test cases kiểm thử đơn vị
- Trường hợp thay đổi code trong bất kỳ mô-đun nào, nên đảm bảo có Trường hợp kiểm thử đơn vị tương ứng cho mỗi mô-đun, khi pass các trường hợp kiểm thử của một mô-đun mới nên thay đổi triển khai kiểm thử mô-đun khác.
- Lỗi được xác định trong quá trình kiểm thử đơn vị phải được sửa trước khi chuyển sang giai đoạn tiếp theo trong quy trình phát triển phần mềm
- Càng viết nhiều code mà không kiểm thử, bạn càng phải kiểm thử nhiều trường hợp.
12. Kết luận
Kiểm thử đơn vị có thể phức tạp hoặc đơn giản tùy thuộc vào ứng dụng đang được kiểm thử và các chiến lược, công cụ, triết lý kiểm thử được sử dụng. Kiểm thử đơn vị luôn luôn cần thiết ở nhiều cấp độ. Đó là một điều chắc chắn.