Giới thiệu về Unit Test trong .NET
Unit testing không phải là một khái niệm quá mới mẻ trong phát triển phần mềm.
1 unit (use case) là gì
Trước khi tìm hiểu Unit Test là gì, chúng ta sẽ tìm hiểu một unit là gì:
-
Một unit là tập hợp các hành động xảy ra giữa việc gọi một phương thức public trong hệ thống và một kết quả được tạo ra bằng việc test hệ thống đó. Kết quả đó có thể là:
- Khi gọi một phương thức public sẽ trả về một giá trị rõ ràng (không phải phương thức void).
- Thay đổi trạng thái hoặc hành vi của hệ thống trước và sau khi phương thức đó được gọi test. (Ví dụ: thay đổi thuộc tính tham số hay các biển static...).
- Gọi sang một bên thứ 3 mà bên đó không trả về bất kì giá trị gì (Ví dụ: hệ thống logging...).
-
Vì vậy, một unit có thể bao gồm ít nhất một phương thức, hoặc nhiều lớp để đạt được một mục đích gì đó.
Unit test là gì?
Một unit test là một đoạn code gọi một unit (use case) và kiểm tra kết quả cuối cùng của unit đó, nếu kết quả đúng với giả định => thử nghiệm thành công, ngược lại thì thất bại.
Ví dụ:
Trong hàm trên có 2 unit:
- Khi gọi phương thức Withdraw, với unit thứ nhất thì nó giảm đi biến Balance.
- Unit thứ hai là sẽ văng exception.
Mỗi một Unit Test là một đoạn code sẽ gọi một trong hai phương thức trên rồi kiểm tra xem có đúng kết quả giả định mong muốn hay không? Rồi đánh giá test đó fail hay pass.
Tại sao phải viết Unit Test
- Ai trong dân dev chúng ta đều đã từng phát triển một tính năng phần mềm nào đó. Bạn đã bao giờ gặp trường hợp khi thi công một tính năng xong và kiểm tra chúng trên giao diện okie bằng cách nhập liệu tất cả những trường hợp bạn có thể biết? Và một thời gian sau, bạn cần phải thi công một tính năng gì đó và bạn nghi rằng nó có thể ảnh hưởng đến tính năng cũ? Vậy làm sao để nhớ lại tất cả những case bạn đã từng test trên UI của tính năng cũ để kiểm tra lại xem tính năng mới có ảnh hưởng đến tính năng cũ hay không vì không có chỗ nào ghi nhớ cả? => Nếu không có Unit Test thì bạn cũng mất kha khá thời gian và dễ sai sót, Unit test sẽ giúp bạn giải quyết vấn đề này.
- Việc viết unit test sẽ giúp method bao quát được các trường hợp, ví dụ một người dev đọc hàm của bạn họ sẽ có thể hiểu được logic hàm của hàm đó.
- Việc chạy tất cả các trường hợp của Unit Test cũng không mất nhiều thời gian, thậm chí chạy cả hàng trăm test case chỉ mất vài phút, giúp tiết kiệm thời gian.
- Việc sử dụng Unit test giúp kiểm tra độc lập, không phụ thuộc vào yếu tố thực như thời gian, cơ sở dữ liệu, máy chủ, hệ thống mạng...
Như nào là một bài kiểm tra đơn vị tốt
Một bài kiểm tra đơn vị tốt có các thuộc tính sau:
- Nó phải được tự động hóa và có thể lặp lại.
- Nó phải dễ thực hiện.
- Bất kỳ ai cũng có thể chạy nó chỉ bằng một nút nhấn.
- Nó sẽ chạy nhanh.
- Nó phải nhất quán về kết quả (luôn trả về cùng một kết quả nếu bạn không thay đổi bất cứ điều gì giữa các lần chạy).
- Nó phải được độc lập (chạy độc lập với các thử nghiệm khác).
- Khi xảy ra lỗi, cần dễ dàng phát hiện những gì được mong đợi và in ra được vấn đề.
Khi viết Unit Test có một số câu hỏi dev cần tự hỏi đề viết một unit test chất lượng:
- Tôi có thể chạy và nhận kết quả từ bài kiểm tra đơn vị mà tôi đã viết cách đây nhiều tuần, tháng hoặc năm không?
- Các thành viên nào trong dự án của tôi có thể chạy và nhận kết quả từ các bài kiểm tra đơn vị mà tôi đã viết vài tháng trước không?
- Tôi có thể chạy tất cả các bài kiểm tra đơn vị mà tôi đã viết trong thời gian không quá vài phút không?
- Tôi có thể chạy tất cả các bài kiểm tra đơn vị mà tôi đã viết chỉ bằng một nút nhấn không?
- Tôi có thể viết một bài kiểm tra cơ bản trong thời gian không quá vài phút không?
Nếu một unit test của bạn đáp ứng được tất cả câu hỏi trên, chúng mừng bạn đã có một Unit Test chất lượng rồi đấy.
Kết luận
Chúng ta đã đi qua khái niệm Unit Test. Bài sau chúng ta sẽ tìm hiểu về công cụ để có thể viết một Unit Test, ở đây tôi lựa chọn NUnit và NSubtitue. Trong bài tiếp theo ta sẽ tìm hiểu về chúng.
Contact
Facebook: hcphi