Phương pháp Unit Testing

Unit Testing là phương pháp kiểm thử phần mềm dựa trên các đơn vị kiểm thử (hay unit test). Trong các ngôn ngữ hướng đối tượng (ví dụ C#), các đơn vị kiểm thử này có thể là các phương thức hay lớp. Một đơn vị kiểm thử được dùng để kiểm tra một đơn vị công việc (unit of work) với một kết quả giả định nào đó; Nếu kết quả thực thi của đơn vị công việc cần kiểm tra khác với kết quả giả định thì đơn vị kiểm thử thất bại.

Các đặc điểm của một đơn vị kiểm thử tốt

  • Tự động và có thể lặp
  • Dễ dàng thực thi
  • Có thể dùng trong tương lai
  • Chạy nhanh
  • Kết quả nhất quán
  • Kiểm soát đầy đủ hay toàn quyền (full control) các thành phần kiểm thử
  • Độc lập với các đơn vị kiểm thử khác
  • Khi thất bại, dễ dàng phát hiện ra những gì được mong đợi và xác định hướng giải quyết

Framework cho Unit Testing

Unit Testing có thể được thực hiện dễ dàng nhờ các framework. Framework phổ biến hỗ trợ cho các nhà phát triển .NET là NUnit vì nó dễ dùng, dễ nhớ, có nhiều tính năng nổi trội và dễ dàng cài đặt đến Visual Studio qua NuGet. Bên cạnh NUnit, một vài framework có thể được cân nhắc sử dụng cho dân .NET là xUnit hay MSTest (của Microsoft). Đối với các ngôn ngữ khác có thể sử dụng danh sách các framework tại https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks

Tạo dự án kiểm thử

Trong bài viết này, chúng ta sẽ minh học kỹ thuật Unit Testing bằng cách sử dụng framework NUnit trong Visual Studio 2017 Community. Để đơn giản, chúng ta sẽ tạo một dự án Console App (.NET Framework) tên UnitTestingDemo và thêm một lớp tên Calculator đến dự án này. Thay đổi nội dung tập tin Calculator.cs như sau:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace UnitTestingDemo

{

  public class Calculator

  {

    public int Add(int a, int b) {

      return a + b;

    }

    public int Sub(int a, int b)

    {

     return a - b;

    }

  }

}

Kế tiếp, thêm một lớp thư viện đến Solution bằng cách nhấn chuột phải vào Solution trong cửa sổ Solution Explorer chọn Add > New Project

Trong cửa sổ New Project chọn Class Library (.NET Framework), đặt tên lớp là Calculator_Test:

Nhấn OK. Đổi tên tập tin Class1.cs trong dự án Calculator_Test vừa tạo thành MyTesting.cs

Như vậy chúng ta đã hoàn thành việc tạo các dự án kiểm thử. Bây giờ chúng ta sẽ cài đặt framework NUnit. Trước khi kết thúc phần cài đặt này, chúng ta sẽ thêm một tham chiếu từ dự án Calculator_Test đến dự án UnitTestingDemo với mục đích là tham chiếu các lớp hay phương thức từ lớp UnitTestingDemo. Để làm điều này, nhấn chuột phải vào Calculator_Test, chọn Add > Reference. Trong cửa sổ Reference Manager chọn Project và dự án UnitTestingDemo:

Cài đặt NUnit

Để cài NUnit, trong Visual Studio 2017 chọn Tools > NuGet Package Manager > Manage NuGet Packages for Solution

Trong cửa sổ NuGet – Solution chọn tab Browse và gõ cụm từ ‘nunit‘ trong ô tìm kiếm và chọn NUnit đầu tiên:

Bên khung cửa sổ NUnit bên phải chọn Project (bao gồm hai dự án) và nhấn Install:

Nếu hộp thoại Preview Changes xuất hiện thì nhấn OK. Nếu cài đặt thành công thì kết quả từ hộp thoại Output sẽ như sau:

Đóng cửa sổ NuGet – Solution và Output. Trở lại cửa sổ Solution Explorer tìm đến mục Reference của hai sự án sẽ xuất hiện nunit.framwork:

Một cách tương tự, chúng ta cũng cài đặt NUnit3TestAdapter:

Mục đích cài đặt thư viện này là để thực thi các đơn vị kiểm thử NUnit trong Visual Studio.

Như vậy chúng ta đã cài đặt thành công NUnit. Kế tiếp, chúng ta sẽ tìm hiểu một vài thuộc tính và lớp quan trọng trước khi tiến hành kiểm thử.

Các thuộc tính TestFixture, Test và lớp Assert

NUnit chứa hai thuộc tính TestFixture Test dùng để đánh dấu lớp và phương thức sẽ là các đơn vị kiểm thử (unit tests). Trước khi sử dụng hai thuộc tính này, chúng ta cần khai báo thư viện NUnit:


using NUnit.Framework;

Chúng ta muốn lớp MyTesting sẽ là lớp kiểm thử, thêm thuộc tính TestFixture và khai báo thư viện NUnit đến tập tin MyTesting.cs như sau:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using NUnit.Framework;

namespace Calculator_Test

{

  [TestFixture]

  public class MyTesting

  {

  }

}

Lưu ý rằng, thuộc tính TestFixture được đặt trong dấu ngoặc vuông.

Sau khi chọn lớp kiểm thử, chúng ta sẽ xây dựng hai phương thức Add_Test và Sub_Test dùng để kiểm thử các phương thức Add và Sub từ lớp Calculator. Lớp MyTesting được thay đổi như sau:


[TestFixture]

public class MyTesting

{

  [Test]

  public void Add_Test() {

  }

  [Test]

  public void Sub_Test() {

  }

}

Thuộc tính Test được đặt trong dấu ngoặc vuông để đánh dấu các phương thức là đơn vị kiểm thử. Trước khi viết vài đoạn mã cho hai phương thức Add_Test và Sub_Test, chúng ta sẽ tìm hiểu lớp Assert từ namespace NUnit.Framework.

Lớp Assert như là chiếc cầu nối giữa mã chương trình cần kiểm thử và NUnit. Một đơn vị kiểm thử sẽ dùng lớp này với mục đích khai báo một giả định nào đó là tồn tại và nếu các đối số được chuyển vào lớp Assert được thực hiện với kết quả khác với giả định thì đơn vị kiểm thử này thất bại.

Thay đối nội dung hai phương thức Add_Test và Sub_Test như sau:


[TestFixture]

public class MyTesting

{

  [Test]

  public void Add_Test() {

     Calculator cal = new Calculator();

     int add_Result = cal.Add(3, 5);

     Assert.That(add_Result, Is.EqualTo(8));

  }

  [Test]

  public void Sub_Test() {

    Calculator cal = new Calculator();

    int sub_Result = cal.Sub(3, 5);

    Assert.That(sub_Result, Is.EqualTo(8));

  }

}

Chúng ta sử dụng phương thức That của lớp Assert để xác nhận một kết quả là đúng với giả định hay không. Trong hai phương thức Add_Test và Sub_Test, chúng ta gọi các phương thức Add và Sub từ lớp Calculator với các đối số là 3 và 5. Kết quả từ các phương thức này sẽ được so sánh với kết quả giả định là 8.

Thực hiện kiểm thử với công cụ Test Explorer

Chúng ta thực hiện kiểm thử bằng cách dùng công cụ Test Explorer từ mục Test trong Visual Studio 2017:

Cửa sổ Test Explorer như sau:

Chúng ta có thể chọn Run All để chạy cả hai phương thức kiểm thử hay chúng ta có thể chọn một trong hai phương thức và nhấn chuột phải chọn Run Selected Tests, ví dụ chọn Add_Test:

Kết quả:

Như vậy đơn vị kiểm thử Add_Test đã thành công vì tổng 3 và 5 là 8 khớp với kết quả giả định. Tương tự, chúng ta thực thi Sub_Test:

Sub_Test đã thất bại vì kết quả hiệu 3 và 5 là -2 khác với kết quả giả định là 8.

Kết luận

Trong bài viết này chỉ giới thiệu một cách khái quát về kỹ thuật kiểm thử Unit Testing và cách cài đặt cũng như sử dụng framework NUnit trong Visual Studio 2017 Community. Một điều cần lưu ý rằng, để có thể thực hiện thành công việc kiểm thử với NUnit, trong Visual Studio 2017 chúng ta cần cài đặt hai gói thư viện NUnitNUnit3TestAdapter thông NuGet. Chúng ta cũng đã tìm hiểu các thuộc tính TestFixture, Test và lớp Assert từ namespace NUnit.Framework và cũng đã chạy thử các đơn vị kiểm thử bằng công cụ Test Explorer.