Unit Test với Visual Studio 2008
Các bước tạo 1 test project trong Visual Studio Team System 2008.
Trong version này đã có tích hợp test case project nên việc tạo test project rất dễ dàng. Để dễ dàng thực hiện, tôi sẽ viết 1 chương trình đơn giản cộng 2 số sau đó tạo 1 test project cùng các testcase cho chương trình này.
Bước 1: Trong Visual Studio bạn tạo 1 project mới có kiểu là Class Library(các kiểu project khác đều được nhưng ở đây việc tạo 1 class library sẽ cho bạn hình dung rằng bạn không thể thực thi module này 1 cách độc lập để thử)

Bước 2: Thêm 1 Class mới bằng cách nhấn phải chuột lên Project trong Project Explorer, chọn Add-> Class, đặt tên cho lớp đó là MyCalculator.
Bước 3: Coding các phương thức của bạn. ở đây giả sử tôi có các phương thức như sau:
| using System;
namespace VoVanHai_UnitTesting { public class MyCalculator { public double Cong(int a, int b) { return a + b; } public double Tru(int a, int b) { return a – b; } public double Nhan(int a, int b) { return a * b; } public double Chia(int a, int b) { if (b == 0) throw new Exception(“Lỗi chia cho zero”); return a / b; } } } |
Build project, bạn được 1 file VoVanHai_UnitTesting.dll.
OK, bây giờ bạn tạo 1 test project được rồi đấy!
Bước 4: Nhấn phải chuột lên Solution của bạn trong cửa sổ Solution Explorer, chọn Add-> New Project như hình.

Chọn Test Project như hình rồi nhấn OK

Bạn có 1Test Project như hình

Bạn có thể xỏa bỏ UnitTest1 nếu bạn muốn. Bây giờ ta có thể thêm vào 1 unit test mới bằng cách nhấn phải chuột lên test project của chúng ta rồi chọn Add->Unit Test như hình:

Một của sổ hiện ra:

Nhấn OK, bạn sẽ có 1 lớp có tên MyCalculatorTest.cs với các phương thức test của bạn với các giá trị mặc định (0). Ví dụ 1 phương thức:
| [TestMethod()]
public void NhanTest() { MyCalculator target = new MyCalculator(); // TODO: Initialize to an appropriate value int a = 0; // TODO: Initialize to an appropriate value int b = 0; // TODO: Initialize to an appropriate value double expected = 0F; // TODO: Initialize to an appropriate value double actual; actual = target.Nhan(a, b); Assert.AreEqual(expected, actual); Assert.Inconclusive(“Verify the correctness of this test method.”); } |
Bạn phải chọn các testcase nào đó theo 1 phương pháp bạn đang tuân thủ(chẳng hạn path testing chẳng hạn). Bạn cần sửa lại đoạn code này theo 1 test case gồm có tham số đầu vào và kết quả mong đợi. Ví dụ với phương thức trên bạn nhập tham số a=10, tham số b=10 thì bạn mong ước nhận được kết quả 100. Code đã sửa như sau:
| [TestMethod()]
public void NhanTest() { MyCalculator target = new MyCalculator(); int a = 10;//tham số a của hàm int b = 10;//tham số b của hàm double expected = 100d;//kết quả mong muốn double actual; actual = target.Nhan(a, b); Assert.AreEqual(expected, actual); } |
Nhấn chuột phải lên vị trí tại Testcase mà ta cần chạy thử, chọn Run Test.

Kết quả được cho như sau

Trong trường hợp bây giờ bạn cho a=10, b=5, kết quả mong đợi 100 thì bạn sẽ có mết quả:

Double click vào test result ta có cửa sổ sau chỉ ra chi tiết của lỗi sai:

Để thực thi tất cả các testcase, bạn chạy project (nhấn F5). Ví dụ :

Good. Bây giờ bạn có thể tiếp tục tạo các Test case theo mong muốn của bạn. Chúc thành công!
HuanKC said
Chào anh Hải cho tôi hỏi một câu hỏi sau:
Sau khi làm như anh xong tôi thêm vào một hàm trong lớp MyCalculator. VD:
public string ReturnString(string str1, string str2)
{
return str1 + str2;
}
Bây giờ có cách nào để test hàm đó trong lớp MyCalculatorTest ngoài cách viết tay hoặc tạo unit test mới rồi làm theo trình tự như anh hướng dẫn, có cách nào để lớp MyCalculatorTest tự gen lại không ?
Cảm ơn anh!
Uyên said
Chào anh Hải, mình muốn hỏi thêm:
Theo các bước thực hiện nãy giờ thì mình phải nhập từng giá trị đầu vào và đầu ra cho 1 unit test. Điều này làm mất thời gian nếu có bộ dữ liệu nhiều giá trị.
Vậy có công cụ hoặc cách làm nào thực hiện nhanh hơn ko. Ví dụ như tool cho phép nhập 1 loạt giá trị đầu vào và ra, nhấn nút chạy vèo là xong.
Cám ơn anh!
Võ Văn Hải said
Công cụ không bàn ở đây do thực tế có rất nhiều tool làm 1 cách tự động. Ở đây chỉ là làm thủ công. Tuy nhiên để cho nó cải thiện, bạn có thể nhập 1 loạt giá trị (theo 1 cách tìm teest case nào đó)vào file txt, sau đó load nó để thử.
Nguyễn Thái said
Chào anh!
Anh cho em hỏi một chút được không ah. Em đang tìm hiểu về kiểm thử hướng đối tượng, mà chưa biết phải demo một chương trình cụ thể thế nào cả. Anh có thể định hướng giúp em được không? nếu có thì anh có thể cho em tài liệu về kiểm thử hướng đối tượng được không?
Cảm ơn anh nhiều!
genuis said
cách viết 1 test cho sự kiện Button click như thế nào vậy thầy?Thầy có thể cho em 1 ví dụ không?Cám ơn thầy!
Giao said
Chào thầy,nếu em muốn viết unit test cho windows form application thì phải làm sao?Ví dụ form có 2 textbox đê nhận 2 giá trị và 1 button Add để cộng 2 giá trị trên.Trong trường hợp này phải viết testcase như thế nào?
Edward said
Chào bạn HuanKC said.
Khi bạn viết thêm 1 phương thức mới vào trong class Calculator. Và muốn test thử phương thức này trong cái Unit test mà anh Hải mới vừa tạo ở trên (ví dụ), thì bạn có thể làm đơn giản như sau:
Click chuột phải vào phương thức đó, bạn chọn Create Unit Test… thì VS sẽ tự động gen cho bạn 1 test case như bạn mong muốn.
Chúc vui.
nguyen thanh said
Em chào thầy ạ !
Ở công ty em có sử dụng eclipse để viêt tool để test các chức năng của phần mềm ( giống như test chức năng lưu của phần mềm chẳng hạn)
Thầy có bài viết nào sử dụng eclipse để viết tool test cái này không ạ
Em cảm ơn thầy ạ
ininin00 said
Em chào thầy ạ. Thầy cho em hỏi là khi em test giống như thầy hướng dẫn ở trên nhưng nó thông báo là:Verify the correctness of this test method.
Đây là hàm em test ạ
public void CongTest()
{
Calculator target = new Calculator(); // TODO: Initialize to an appropriate value
int a = 10; // TODO: Initialize to an appropriate value
int b = 10; // TODO: Initialize to an appropriate value
double expected = 20; // TODO: Initialize to an appropriate value
double actual;
actual = target.Cong(a, b);
Assert.AreEqual(expected, actual);
Assert.Inconclusive(“Verify the correctness of this test method.”);
}
phuong14 said
Chào các bạn!
Cho mình hỏi làm thế nào để viết các hàm test trong một chương trình có nhiều class.
phuong said
Chào Thầy!
Em đang tìm hiểu về Unit testing,cho em hỏi khi kiểm thử dơn vị của một chương trình có chia ra các trường hợp kiểm thử(test case) không thầy. Thầy có thể cho em ví dụ cụ thể được không thầy.
Em cảm ơn thầy!
Võ Văn Hải said
“Em đang tìm hiểu về Unit testing,cho em hỏi khi kiểm thử dơn vị của một chương trình có chia ra các trường hợp kiểm thử(test case) không thầy. Thầy có thể cho em ví dụ cụ thể được không thầy.”
Trước hết bạn phải sinh ra bộ Test-Case sử dụng 1 phương pháp nào đó rồi mới đem bộ test đó implements vào chương trình.
Võ Văn Hải said
Tôi viết cho bạn 1 lớp Triangle biểu diễn cho 1 tam giác
public class Triangle { public enum TriangleType{ Equilateral/*đều*/, Scalene/*lệch-thường*/, Isosceles/*cân*/ }; private int a; private int b; private int c; /** * Kiểm tra các số đo có hợp lệ không * @return true nếu 3 cạnh tương ứng 1 tam giác */ private boolean isValidTriangle(int a,int b,int c){ if (a <= 0 || b <= 0 || c < 0) return false; if(a+b<=c||a+c<=b||b+c<=a) return false; return true; } public Triangle(int a, int b, int c) throws Exception{ if(!isValidTriangle(a,b,c)) throw new Exception("Not a valid triangle"); this.a = a; this.b = b; this.c = c; } public TriangleType getTriangleType(){ if(a==b && b==c) return TriangleType.Equilateral; else if(a==b||b==c||c==a) return TriangleType.Isosceles; return TriangleType.Scalene; } public static void main(String[] args) throws Exception{ Triangle t=new Triangle(3, 4, 9); System.out.println(t.getTriangleType()); } }maihuong said
Em chào thầy!
Thầy cho em hỏi, em viết class kiểm tra tam giác bằng C# bên dưới:
public class tamgiac
{
private int a;
private int b;
private int c;
public tamgiac(int a, int b, int c)
{
if (a <= 0 || b <= 0 || c < 0)
{
Console.Write("dữ liệu không hợp lệ");
this.a = a;
this.b = b;
this.c = c;
}
}
public int checktamgiac()
{
bool ktra = false;
if (a < b + c && b <= a + c && c < a + b)
ktra = true;
if (ktra)
{
if (a == b && b == c)
return 2;//tam giac deu
else
if (a != b && a!= c && b!=c)
return 0;//tam giac thường
else
return 1;// tam giac cân
}
else
return -1;//không phải là tam giác
}
}
Em tạo một class để kiểm thử với công cụ Nunit :
[TestFixture]
class testtamgiac
{
[SetUp]
public void setup()
{
}
[Test]
public void testcase1()
{
tamgiac tgiac = new tamgiac(4,1,2);
int expected= -1;
int actual = tgiac.checktamgiac();
Assert.AreEqual(expected,actual);
}
[Test]
public void testcase2()
{
tamgiac tgiac = new tamgiac(2,2,3);
int expected=1;
int actual = tgiac.checktamgiac();
Assert.AreEqual(expected,actual);
}
[Test]
public void testcase3()
{
tamgiac tgiac = new tamgiac(5,5,5);
int expected=2 ;
int actual = tgiac.checktamgiac();
Assert.AreEqual(expected,actual);
}
[Test]
public void testcase4()
{
tamgiac tgiac = new tamgiac(3,4,5);
int expected=0;
int actual = tgiac.checktamgiac();
Assert.AreEqual(expected,actual);
}
[TearDown]
public void tesdown()
{
}
}
Chạy chương trình chỉ có testcase1 là pass, các testcase còn lại thì Fail.
Thầy có thể giúp em được không thầy.
Em cảm ơn thầy!
Võ Văn Hải said
Lớp tam giác của em không chuẩn. tìm đâu đó trong blog có code java về tam giác (chuyển sang C# đổi chút xíu).
maihuong said
Em cảm ơn thầy.
Chúc thầy công tác tốt.