Unit Test là gì? Giới thiệu về Unit Test và Ví dụ

Nội dung bài viết

Video học lập trình mỗi ngày

Lời nói đầu

Unit testing là một trong ba cách test của một ứng dụng. Ngoài kiểm thử thích hợp ứng dụng, và giao diện người dùng thì điều quan trọng là phải có giai đoạn Unit test. Giai đoạn viết Unit testing cũng là một trong những yếu tố làm nên sự khác biệt về trình độ của một lập trình viên giỏi..

Với việc áp dụng unit test vào bạn có thể chạy thử nghiệm độc lập trên từng chức năng. Nghĩa là bạn viết một function, và cũng chính bạn là người đưa giá trị vào và test xem có đúng như ý đồ của bạn viết không? Và nếu đầu ra sau khi thử nghiệm khớp, thì thử nghiệm của bạn đã thành công. Trong bài viết này chúng ta sẽ thảo luận nhiều vấn đề như, sử dụng frameworks nào để viết unit test... Nhưng trước hết chúng ta đi xem định nghĩa của Unit test là gì? Và nó có thực sự quan trọng không?

Có nhiều công ty không quan trọng vấn đề này nhưng nếu Công Ty bạn bắt buộc nghiêm ngặt vấn đề này thì tôi tin và tôi viết vị trí của bạn đang ở đâu. Một lập trình viên lúc nào cũng cận thẩn trong việc code thì lúc nào cũng phải có test case.

Nếu như bạn đã hiểu về Unit test là gì rồi thì bạn có thể sử dụng jest và nodejs để thực hành luôn.

Unit Test là gì?

Unit Test là phương pháp trong đó các thành phần hoặc đơn vị phần mềm riêng lẻ được kiểm tra để xác định sự phù hợp của chúng với các thông số kỹ thuật được thiết kế và cũng bao gồm kiểm tra dữ liệu liên quan và quy trình sử dụng. Một đơn vị chỉ đơn giản là một đoạn mã nhỏ cho bất kỳ chức năng nào. Bản thân bài kiểm tra đơn vị là một đoạn mã ngắn hoặc đoạn mã được thiết kế để xác minh hành vi của một đơn vị cụ thể để tạo ra kết quả vượt qua hoặc thất bại.

Mục đích của thử nghiệm đơn vị là cho phép các nhà phát triển chạy càng nhiều thử nghiệm đơn vị càng tốt để xác định các lỗ hổng tiềm năng. Khi ứng dụng đã vượt qua thử nghiệm đơn vị, các hình thức thử nghiệm khác sau đó sẽ cần được áp dụng để xác nhận thêm.

Unit Test có cần thiết không?

Thực tế không phải chỉ riêng mỗi nghề viết code dạo mới có sử dụng Unit test. Các nghề khác như siêu thị chẳng hạn, việc làm này là thường xuyên mỗi ngày, thậm chí mỗi giờ. Ví dụ, check xem trứng có hư chưa, Sữa có tươi, rau có thối không...vv Chính vì vậy có thể kết luận luôn là Unit test là rất quan trọng. Và câu trả lời đương nhiên là cần thiết với một Lập Trình Viên có trách nhiệm với những dòng code của chính bản thân mình.

Phát triển ứng dụng nhanh hơn

Một khi các devloper viết các test case thì việc gỡ bug sẽ ít dành thời gian hơn và sau đó sẽ tự tin hơn về việc thực hiện các thay đổi code. Những kỹ năng về mọi mặt sẽ phát triển nhanh hơn các Lập Trình Viên bình thường. Tính cận thận và trách nhiệm trong những bài unit test cũng khẳng định ở bên ngoài cuộc sống của họ.

Cấu trúc Code tốt hơn

Khi các nhà phát triển viết unit tests, sự nhấn mạnh của họ là suy nghĩ về cách mã của họ sẽ được sử dụng trên toàn hệ thống, điều này thường dẫn đến thiết kế tốt hơn. Và còn nhiều lợi ích khác như là giảm công việc cho các tester, giảm giá thành chi phí code, giúp giảm chi phí cho việc bảo trì trong tương lai...

Unit Test có nhược điểm gì?

Mặc dù các lợi ích của Unit Test đang bắt đầu được hiểu rộng rãi hơn, nhưng vẫn còn một số lý do tại sao nó không được áp dụng đầy đủ hơn, điều này khiến tiềm năng của nó không được thực hiện.

Không có thời gian cho Unit Test.

Viết Unit Test là tốn thời gian đó là lý do tại sao rất khó để đáp ứng thời hạn. Trong thực tế, Unit Test có thể tiết kiệm rất nhiều thời gian và nỗ lực phát triển trong thời gian dài.

Unit tests khác với viết code

Đúng, bạn hãy nghĩ rằng để viết được một unit test đôi khi còn mất thời gian hơn viết một chức năng code. Và có thể có những Lập Trình Viên viết được code nhưng chưa chắc viết được test case. Không có gì đảm bảo, ngay cả khi mã được kiểm tra kỹ lưỡng, sẽ không có lỗi.

Viết Unit Test thông qua ví dụ

Bây giờ mình sẽ làm một bài tập nho nhỏ cho các bạn hiểu về cách thức viết một unit test như thế nào? Mình sẽ lấy bài toàn Viết hoa chữ cái đầu tiên của mỗi từ trong Câu trong bài Sự Khác Biệt Về Kinh Nghiệm Trong Lập Trình Javascript để làm ví dụ:

Sử dụng reduce() làm tăng hiệu quả và điều quan tâm là hiệu suất. Giải pháp dùng reduce() and map().

const capitalize = (word) => {
  const rest = word.slice(1);
  const firstLtr = word.charAt(0);
  return firstLtr.toUpperCase() + rest.toLowerCase();
}
const titleCase = (phrase) => {
  if(!phrase) return phrase;
  [first, ...rest] = phrase.split(' ');
  return rest.reduce((res,a) =>  res +' ' + capitalize(a), capitalize(first))
}

Unit Test:

Tôi đã viết một hàm trợ giúp khẳng định và một số trường hợp thử nghiệm. Đây không phải là một bài kiểm tra toàn diện

const assert = (fun, input, expected) => {
 return fun(input) === expected ?
  'passed' :
  `failed on input=${input}. expected ${expected}, but got ${fun(input)}`;
}

Test cases:

let testCases = [
 {input: "I’m a little tea pot", expected: "I’m A Little Tea Pot"},
 {input: "sHoRt AnD sToUt", expected: "Short And Stout"},
 {input: "sHoRt AnD sToUt", expected: "Short And Stout"},
 {input: "tôi là một lập trình viên javascript", expected: "Tôi Là Một Lập Trình Viên Javascript"},
 {input: "HERE IS MY HANDLE HERE IS MY SPOUT", expected: "Here Is My Handle Here Is My Spout"},
 {input: "", expected: ""},
 {input: undefined, expected: undefined},
]

Làm bài kiểm tra này, bạn sẽ vượt qua tất cả các bài kiểm tra:

let testResult = testCases.map(d => assert(titleCase, d.input, d.expected))

console.log(testResult);
output:
//Array(6)
0: "passed"
1: "passed"
2: "passed"
3: "passed"
4: "passed"
5: "passed"

Kết Luận

Một lý do chính đáng để Unit Test được khuyến khích cho các nhà phát triển là vì chất lượng là trách nhiệm chung của mọi bên liên quan. Unit Test cung cấp nhiều lợi thế, mặc dù có một số hạn chế liên quan đến nó như chỉ có thể kiểm tra Unit Test, nhưng không phải là vấn đề tích hợp hoặc hiệu năng. Nhưng bằng cách thực hiện Unit Test một cách nhất quán và với kỷ luật nghiêm ngặt, các nhóm có thể khắc phục các hạn chế và lợi ích từ quy trình xây dựng tích hợp hơn.

Có thể bạn đã bị missing