Thứ Ba, 12 tháng 2, 2008

Hướng dẫn Test Code Với NUnit

Unit Testing là gì?
Unit Testing, theo ý hiểu đơn giản của tớ, đó là kiểm tra từng bộ phận rất, rất nhỏ, từng unit riêng biệt trong source code của chuơng trình để kiểm tra xem nó có hoạt động chính xác không. Từ những bộ phận nhỏ này, ta lại kiểm tra những unit lớn hơn có sử dụng những unit đã được kiểm tra ấy, giống như kiểm tra từ móng nhà lên trên vậy.

Tại sao lại phải giây với unit testing?
Đơn giản vì nó làm đời lập trình dễ thở hơn, thay vì ngồi mà ko biết cái lỗi khỉ gió này mọc đâu ra thì có thể tìm ngay được từ đầu những lỗi nhỏ không đáng có.
Và rõ ràng, unit testing là dành cho lập trình viên, là những người tự tay viết ra những unit đó mà không phải là tester ( tester phải làm những công việc lớn lao hơn ^.^)

NUnit là gì?
NUnit là một framework miễn phí mã nguồn mở được sử dụng khá rộng rãi trong unit testing đối với .Net ( chỉ unit testing , không phải dành cho các loại test nào khác)
Một ví dụ đơn giản sử dụng NUnit
Ta sẽ xét tới một ví dụ đơn giản: một phuơng thức static được tạo ra để tìm só lớn nhất trong một danh sách ( nghe có vẻ hơn ngu ngốc )

CODE(Mã)
static int Largest(int[] list);

Như vậy nếu chúng ta đưa vào một mảng [ 7, 8, 9] thì nhất định đầu ra sẽ là số 9

Vậy chúng ta sẽ có vài trường hợp test đơn giản sau đây:
[ 7, 8, 9] -> 9
[ 8, 7, 9] -> 9
[ 9, 8, 7] -> 9
số lớn nhất được lặp lại [ 9, 8, 7, 9] -> 9
Chỉ có 1 số trong mảng [1] -> 1
Số âm [ -7, -8, -9 ] -> -7
Thực hành
Bạn hãy dùng vs 2005 tạo 1 project mới, chọn type là Class Library Add Reference của NUnit vào project : nunit.framework. Tạo một class Cmp như sau

CODE(Mã)
public class Cmp
{
public static int Largest(int[] list)
{
int index;
int max = Int32.MaxValue;
for (index = 0; index < list.Length; ++index) { if (list[index] > max)
{
max = list[index];
}
}
return max;
}
}

Sau đó tạo tiếp một class lấy tên LargestTest

CODE(Mã)

[TestFixture]
public class LargestTest
{
[Test]
public void LarsetOf3()
{
Assert.AreEqual(9, Cmp.Largest(new int[] { 7, 8, 9 }));
}

}

Biên dịch project ra thành file dll (F6 hoặc Ctrl + Shilft , B). Chạy chuơng trình NUnit bạn vừa cài đặt, open đến file dll vừa tạo ra. Nó sẽ hiện lên như sau:


Trong đó ở phía tay trái sẽ hiện lên các thông tin về phuơng thức hiện thời đang test. Giờ thì ấn nút Run, và oops, một cái thanh bar đỏ lòm hiện ra


Tại cửa sổ kết quả test hiện lên như sau:

CODE(Mã)
TestLargest.LargestOf3 :
expected:<9>
but was:<2147483647>

Kết quả muốn nhận là 9, nhưng kết quả hiện ra lại là cái khỉ gió gì đó. Nguyên nhân là vì ta gán int max = Int32.MaxValue; Giờ đổi lại int max = 0; và chạy lại


ok, phát này thì ngon rồi.

Nếu như mảng đưa vào lặp lại số lớn nhất thì sao?
CODE(Mã)
[Test]
public void TestDups()
{
Assert.AreEqual(9, Cmp.Largest(new int[] { 8, 9, 9, 7 }));
}

Hoặc chỉ có 1 phần tử

CODE(Mã)
[Test]
public void TestOne()
{
Assert.AreEqual(1, Cmp.Largest((new int[] { 1 })));
}

Với 2 trường hợp này có vẻ chạy ngon

Tiếp tục với trường hợp số âm

CODE(Mã)
[Test]
public void TestNegative()
{
Assert.AreEqual(-7, Cmp.Largest(new int[] { -7, -8, -9 }));
}

Lần này thì lại là

CODE(Mã)
FirstTest.LargestTest.TestNegative:
Expected: -7
But was: 0

Và ta phải sửa lại là: int max = Int32.MinValue;
Chạy lại, ok, thêm 1 lỗi đã được sửa

Tuơng tự như vậy, các bạn có thể test các unit trong project của chính mình

DangTrung.

Không có nhận xét nào:

Đăng nhận xét