Giới thiệu tổng quan về Unit Test

Tram Ho

Bạn sẽ học gì trong bài viết này:

  • Giới thiệu, định nghĩ về Unit Test
  • Lợi ích của việc viết Unit Test
  • Tìm hiểu về Test case
  • Các thuật ngữ thường dùng trong Unit Test

Giới thiệu, định nghĩ về Unit Test

Unit Test (Kiểm thử đơn vị) là kỹ thuật kiểm thử những thành phần hoặc đơn vị nhỏ nhất trong code (thường là các hàm hoặc phương thức). Đây là một trong những cấp độ kiểm thử đơn giản và có thể bắt đầu sớm trong vòng đời phát triển phần mềm. Thậm chí, trên thế giới một số công ty hiện đang áp dụng những mô hình phát triển phần mềm cho phép viết Unit Test trước cả khi viết Code.

Với nhiều lập trình viên, bất kể ngôn ngữ lập trình nào, dù mới vào nghề hay đã gạo cội, thì unit test là một trong những kỹ năng không thể thiếu khi làm việc. Nếu bạn chưa từng nghe qua hoặc chưa có điều kiện thực hành thì cùng bước những bước chân đầu tiên qua bài viết này nhé!

Lợi ích của việc viết Unit Test

  • Tăng tính linh hoạt trong quy trình phát triển
  • Nâng cao chất lượng code và kiến trúc code
  • Phát hiện lỗi sớm trong quy trình phát triển, giảm thiểu chi phí
  • Giảm thiểu rủi ro khi có sự thay đổi, thêm mới hoặc tích hợp tính năng

Tìm hiểu về Test case

Test case

là các trường hợp cần kiểm thử với đầu vào và đầu ra được xác định cụ thể. Một test case thường có hai thành phần dưới đây:

  • Expected value: Giá trị mà chúng ta mong đợi khối lệnh trả về
  • Actual value: Giá trị thực tế mà khối lệnh trả về
    Sau khi thực hiện khối lệnh cần kiểm thử, chúng ta sẽ nhận được actual value. Lấy giá trị đó so sánh với expected value. Nếu hai giá trị này trùng khớp nhau thì kết quả của test case là PASS. Ngược lại, kết quả là FAIL.

Phân loại test case

  • Positive test case: Là những trường hợp kiểm thử đảm bảo người dùng có thể thực hiện được thao tác với dữ liệu hợp lệ.
  • Negative test case: Là những trường hợp kiểm thử tìm cách gây lỗi cho ứng dụng bằng cách sử dụng các dữ liệu không hợp lệ.

Hãy làm rõ các loại test case trên qua một ví dụ đơn giản như sau. Giả sử, chúng ta đang thiết kế ứng dụng đặt phòng khách sạn và có một yêu cầu là:
Hệ thống cho phép khách hàng có thể đặt phòng mới với thời gian xác định.Với yêu cầu trên, chúng ta có một số trường hợp cần kiểm thử như sau:

Trường hợp positive là đảm bảo có thể thêm phòng với các dữ liệu hợp lệ như mã phòng cần đặt, thời gian hợp lệ, mã khách hàng hợp lệ, giá tiền được tính với số ngày đặt,…

Còn các trường hợp negative sẽ cố gắng thực hiện thao tác đặt phòng với những dữ liệu không hợp lệ như:

  • Đặt phòng mới mà không có mã phòng
  • Đặt phòng mới với thời gian không hợp lệ (thời gian ở quá khứ)
  • Đặt phòng mới với mã khách hàng không tồn tại trong cơ sở dữ liệu
  • Đặt phòng mới với giá tiền âm (nhỏ hơn 0).
  • … và nhiều trường hợp khác
    Hy vọng qua ví dụ trên, bạn có thể phân loại được các test case và tự xác định được các test case cho yêu cầu phần mềm mà bạn đang thực hiện.

Cấu trúc một test case

Các trúc mã mà chúng ta nên tuân thủ trong một test case là cấu trúc AAA. Cấu trúc này gồm 3 thành phần:

  • Arrange – Chuẩn bị dữ liệu đầu vào và các điều kiện khác để thực thi test case.
  • Act – Thực hiện việc gọi phương thức/hàm với đầu vào đã được chuẩn bị ở Arrange và nhận về kết quả thực tế.
  • Assert – So sánh giá trị mong đợi và giá trị thực tế nhận được ở bước Act.

Kết quả của test case sẽ là một trong hai trạng thái sau:

  • PASS: nếu kết quả mong đợi và kết quả thực tế khớp nhau
  • FAIL: nếu kết quả mong đợi khác với kết quả thực tế

Đôi khi bạn sẽ bắt gặp một số bài viết dùng từ cấu trúc Given-When-Then. Về bản chất, cũng chính là cấu trúc AAA như trên.

Các thuật ngữ thường dùng trong Unit Test

Một số thuật ngữ và khái niệm thiết yếu cần nắm rõ trong UnitTest như sau:

  • Application (hoặc Code) Under Test
    Application Under Test (AUT) là thuật ngữ thường được dùng để chỉ đến hệ thống/ứng dụng đang được kiểm thử. Với hoạt động unit test, các đơn vị kiểm thử của chúng ta là những thành phần nhỏ nhất trong hệ thống nên có thể dùng các thuật ngữ khác phù hợp hơn như Code Under Test (CUT).

  • Mock và Stub
    Đây là các thành phần bên ngoài được mô phỏng hoặc giả lập trong ngữ cảnh của hoạt động kiểm thử. Thông thường, để AUT hoạt động đúng chức năng thì sẽ cần đến những thành phần bên ngoài như Web Service, Database,… Ở cấp độ unit test, chúng ta cần phải tách rời các thành phần phụ thuộc này để có thể dễ dàng thực thi test case. Phần này sẽ được giải thích rõ hơn trong mục Sử dụng Mockito (Mocking framework).

Lưu ý: Ngoài thuật ngữ mock và stub, thỉnh thoảng bạn sẽ gặp các từ khác như Spy và Fake.

  • Thành phần cố định (Fixtures)
    Là những thành phần được lặp đi lặp lại qua mỗi test case và có thể chia sẻ các thao tác chung giữa các test case. Ví dụ: thiết lập cấu hình hoặc chuẩn bị dữ liệu trước khi bộ test được thực thi, và dọn dẹp bộ nhớ sau khi hoàn thành. Thành phần cố định phải được đặt lên trên cùng của bộ kiểm thử.

Có bốn loại thành phần cố định chính:

Setup
Là thành phần được thực thi trước khi test case thực thi. Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi unit test), chúng ta thường gặp những phương thức/hàm, hoặc annotion có tên là BeforeEach. Thành phần này chính là Setup.

One-Time Setup
Là thành phần được thực thi đầu tiên (trước cả khi cả setup và test case được thực thi). Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi unit test), chúng ta thưsờng gặp những phương thức/hàm, hoặc annotion có tên là BeforeAll. Thành phần này chính là One-Time Setup.

Teardown
Là thành phần được thực thi sau khi test case được thực thi. Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi unit test), chúng ta thường gặp những phương thức/hàm, hoặc annotion có tên là AfterEach. Thành phần này chính là Teardown.

One-Time Teardown
Là thành phần được thực thi sau cùng (sau khi tất cả test case và teardown được thực thi). Trong một số thư viện xUnit (công cụ hỗ trợ viết và thực thi unit test), chúng ta thường gặp những phương thức/hàm, hoặc annotion có tên là AfterAll. Thành phần này chính là One-Time Teardown.

Đừng lo nếu bạn vẫn chưa hiểu rõ được những thuật ngữ vừa được đề cập đến, chúng sẽ được làm rõ ở những bài viết tiếp theo của Series này.

Trong bài tiếp theo, chúng ta sẽ tiếp tục đi tìm hiểu về các framework thường dùng trong Unit Test và đặc biệt là framework XUnit. Ở bài viết này chúng ta đã nắm được tổng quan về Unit Test, Testcase cũng như một số thuật ngữ thường dùng trong Unit Test.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo