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

Lời nói đầu.

Dành cho các bạn lười biếng =]]. Nêú các bạn không muốn đọc lý thuyết thì scroll xuống để xem ví dụ về cách viết unit test và hãy xem mình là ở vị trí nào?

Bất cứ ai đã tham gia vào vòng đời phát triển phần mềm dù ít hay nhiều kinh nghiệm đều cũng đã từng nghe tới Unit Test. Unit Test là một cơ chế chấp nhận để khám phá phần mềm hoạt động tốt như thế nào theo các yêu cầu được chỉ định. Mặc dù mục đích của kiểm tra là tìm ra các lỗi, nhưng nó không thể đảm bảo sự vắng mặt của các lỗi khác, bất kể các trường hợp kiểm thử đã được thiết kế sáng tạo như thế nào.

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.

Tham gia cùng chúng tôi:

Facebook: Cộng đồng lập trình javascript

Facebook Cộng đồng giới thiệu bài viết, website, sản phẩm tăng traffic.

 Bài viết này sẽ cung cấp cho bạn những điều sau đây: 

  • Unit Test là gì? 
  • Unit Test có cần thiết không?
  •  Unit Test có nhược điểm gì? 
  • Viết Unit Test thông qua ví dụ. 

#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? 

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. 

1 - Phát triển 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ọ. 

2 - 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. 

1 - 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.

2 - 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

Tham gia cùng chúng tôi:

Facebook: Cộng đồng lập trình javascript

Facebook Cộng đồng giới thiệu bài viết, website, sản phẩm tăng traffic.

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. 

Tham khảo tại: 

https://www.guru99.com/unit-testing-guide.html

https://areknawo.com/lets-talk-js-unit-testing/

https://blog.testlodge.com/what-is-unit-testing/