Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

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ử)

unit_test_vs2008.png

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.

unit_test_vs2008.png

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

unit_test_vs2008.png

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

unit_test_vs2008.png

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:

unit_test_vs2008.png

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

unit_test_vs2008.png

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.

unit_test_vs2008.png

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

unit_test_vs2008.png

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ả:

unit_test_vs2008.png

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

unit_test_vs2008.png

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

unit_test_vs2008.png

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!

16 Responses to “Unit Test với Visual Studio 2008”

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

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

  3. 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ử.

  4. 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!

  5. 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!

  6. 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?

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

  8. 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 ạ

  9. 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.”);
    }

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

  11. 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!

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

  13. 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());
    	}
    }
    
  14. 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!

  15. 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).

  16. maihuong said

    Em cảm ơn thầy.

    Chúc thầy công tác tốt.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

Join 2,193 other followers

%d bloggers like this: