Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: Unit Test trong lập trình C#

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Thumbs down Unit Test trong lập trình C#

    Bản gốc tiếng Anh đầy đủ mình viết tại đây: English Full Tutorial

    Xem hướng dẫn cài đặt NUnit tại đây: NUnit vào VS

    Ghi chú: ai mà xác định làm tester (hay thi đầu vào FPT ) mà không biết Unit Test thì

    Trong bài này mình sẽ hướng dẫn một bài Unit Test đơn giản với C# sử dụng NUnit Framework.

    Mình xây dựng sẵn một class đơn giản ngắn dễ hiểu để ai đọc cũng hiểu

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace UnitTest
    6. {
    7.     enum CalculatingType
    8.     {
    9.         Addition,
    10.         Subtraction,
    11.         Multiplication,
    12.         Division
    13.     }
    14.     class Calculator
    15.     {
    16.         private List<double> List;
    17.         private CalculatingType cType;
    18.  
    19.         public Calculator() { }
    20.  
    21.         public Calculator(List<double> list, CalculatingType type)
    22.         {
    23.             this.List = list;
    24.             this.cType = type;
    25.         }
    26.  
    27.         public List<double> CList
    28.         {
    29.             get { return this.List; }
    30.             set { this.List = value; }
    31.         }
    32.  
    33.         public CalculatingType CType
    34.         {
    35.             get { return this.cType; }
    36.             set { this.cType = value; }
    37.         }
    38.  
    39.         public double GetResult()
    40.         {
    41.             double result = this.List[0];
    42.  
    43.             for (int i = 1; i &lt; this.List.Count; ++i)
    44.             {
    45.                 if (cType == CalculatingType.Addition)
    46.                     result += this.List[i];
    47.                 else if (cType == CalculatingType.Subtraction)
    48.                     result -= this.List[i];
    49.                 else if (cType == CalculatingType.Multiplication)
    50.                     result *= this.List[i];
    51.                 else
    52.                     result /= this.List[i];
    53.             }
    54.  
    55.             return result;
    56.         }
    57.  
    58.     }
    59. }

    Như đã thấy ở trên thì class 'Calculator' có sở hữu một danh sách các số kiểu double và một kiểu enum cho biết loại phép tính.
    Tại project hiện tại, tạo thêm một class mới tên là 'CalculatorTest' để test cái class 'Calculator' nhé. Thông thường sẽ có test cơ bản cho class là test cho
    + Constructor, destructor
    + Properties
    + Methods
    Nhưng vì cái class này bé tẹo chả có gì nhiều nên test rút ngọn properties với constructor làm một nhé

    Add thêm Reference cái cục NUnit.Framework.Dll vào project đi.
    Cài Nunit ở đâu thì nó ở đó.
    Rồi ta thử đoạn test sau
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4. using NUnit.Framework;
    5.  
    6. namespace UnitTest
    7. {
    8.     [TestFixture]
    9.     class CalculatorTest
    10.     {
    11.         [Test]
    12.         public void TestCListA()
    13.         {
    14.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);
    15.             Assert.AreEqual(new List<double> { 1, 2, 3 }, calc.CList);            
    16.         }
    17.     }
    18. }


    Build project rồi gọi NUnit từ VS, sau đó ấn vào nút 'Run'.
    Kết quả thu được là 1 pass xanh lè , vậy là qua!



    Một chút giải thích nhỉ. Sau khi add NUnit vào thì sẽ có thể sử dụng các lớp thuộc tính chỉ định test cho class và method.
    [TestFixture] là cho class, [Test] là cho method
    Khá là đơn giản!
    Hãy thử tiếp ví dụ dưới

    Visual C# Code:
    1. [Test]
    2.         public void TestCListB()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);            
    5.             Assert.AreEqual(new List<double> { 2, 3, 1 }, calc.CList);
    6.         }

    Ở đây bị fail rồi, đỏ lòm
    Visual C# Code:
    1. UnitTest.CalculatorTest.TestCListB:
    2.   Expected and actual are both <System.Collections.Generic.List`1[System.Double]> with 3 elements
    3.   Values differ at index [0]
    4.   Expected: 2.0d
    5.   But was:  1.0d
    Tại index đầu tiên ( vị trí 0 ), giá trị đầu tiên của 2 list khác nhau nên fail rồi.
    Thường thì cứ nghĩ 2 list có các giá trị giống nhau nhưng sắp xếp vị trí khác nhau thì được nhưng ở đây không như thế mà giá trị tại các index sẽ được lần lượt so sánh nhé. Thế mới gọi là test chứ

    Test thử so sánh với một list khác
    Visual C# Code:
    1. [Test]
    2.         public void TestCListC()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);
    5.             Assert.AreEqual(new List<double> { -1, 2, 3 }, calc.CList);
    6.         }

    Cái này 100% là fail rõ ràng.

    Giờ thử đến so sánh kiểu tính toán CalculatingType
    Visual C# Code:
    1. [Test]
    2.         public void TestCTypeA()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);
    5.             Assert.AreEqual(CalculatingType.Addition, calc.CType);
    6.         }
    7.  
    8.         [Test]
    9.         public void TestCTypeB()
    10.         {
    11.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);
    12.             Assert.AreEqual(CalculatingType.Subtraction, calc.CType);
    13.         }

    Đến đây thì chắc là rõ như ban ngày rồi nhỉ.

    Tương tự, đem test cái cục GetResult() nhưng vì thằng này có cục logic 4 case của enum CalculatingType nên tách ra test từng case thành từng hàm test nhỏ cho dễ hiểu.


    Visual C# Code:
    1. [Test]
    2.         public void TestAddition()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Addition);
    5.             Assert.AreEqual(6, calc.GetResult());
    6.         }
    7.  
    8.  
    9.         [Test]
    10.         public void TestSubtraction()
    11.         {
    12.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Subtraction);                      
    13.             Assert.AreEqual(-4, calc.GetResult());
    14.         }
    15.  
    16.         [Test]
    17.         public void TestMultiplication()
    18.         {
    19.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Multiplication);
    20.             Assert.AreEqual(6, calc.GetResult());
    21.         }
    22.  
    23.         [Test]
    24.         public void TestDivisionA()
    25.         {
    26.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Division);
    27.             Assert.AreEqual(0.1666667, calc.GetResult());
    28.         }
    Mấy hàm TestAddition(), TestSubtraction(), TestMultiplication() thì pass, nhưng thằng TestDivisionA() thì fail nhé.
    Lí do là cái đám số đằng sau dấu chấm nó dài thế so sánh biết bao nhiêu là đúng .
    Đến đoạn này thì phải nhanh nhạy một tí, thấy 2 giá trị đầu 1/2 = 0.5 , thế thì vứt béng nó vào làm cái expected result đi

    Visual C# Code:
    1. [Test]
    2.         public void TestDivisionB()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 3 }, CalculatingType.Division);
    5.             Assert.AreEqual( 0.5/3, calc.GetResult());
    6.         }
    OK! TestDivisionB() pass.
    Chưa vội mừng, nhỡ trong list có số 0 thì sao nhở?
    Exception throw ra thì teo.
    Rất may NUnit đã cung cấp một cái attribute để test exception luôn.
    Đây là một demo

    Visual C# Code:
    1. [Test,ExpectedException(typeof(DivideByZeroException))]
    2.         public void TestDivisionC()
    3.         {
    4.             Calculator calc = new Calculator(new List<double> { 1, 2, 0 }, CalculatingType.Division);
    5.             throw new DivideByZeroException();
    6.         }

    Như đoạn code ở trên, chúng ta hy vọng là nó sẽ test cái DivideByZeroException được ném ra. Và tất nhiên là ta pass

    Bài này chỉ là Unit-Test rất đơn giản không có gì khó hiểu cả. Trông thì dễ đấy nhưng trong Software-Testing nó là cả một khối lượng công việc ngập đầu. Test script viết ra mà chạy fail thì ta cứ lôi thằng code ra mà chửi
    None!

  2. #2
    Ngày gia nhập
    10 2008
    Bài viết
    85

    Trích dẫn Nguyên bản được gửi bởi Xcross87 Xem bài viết
    Ghi chú: ai mà xác định làm tester (hay thi đầu vào FPT ) mà không biết Unit Test thì
    thi đầu vào fpt mình thấy unit test là phần dễ qua nhất

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi minhphuong90 Xem bài viết
    thi đầu vào fpt mình thấy unit test là phần dễ qua nhất
    ,
    đến lúc phỏng vấn Unit Test mới vui
    None!

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Trong Visual Studio Team System có sẵn bộ Test rùi mà X, với lại Unit Test không thì chưa đủ, phải có thêm Acceptance Test nữa thì mới check kĩ được http://fitnesse.org/

  5. #5
    Ngày gia nhập
    07 2010
    Bài viết
    12

    các bạn test cái này giúp mình với http://daihoc.com.vn/forum/showthread.php?t=6511

    Các bạn giúp mình cái này với. Mình muốn Convert 1 chuổi string sang kiểu DateTime nhưng mà không được.

    DateTime ngaysinh;
    ngaysinh = DateTime.Parse(txt_ngaysinhchinhxac.Text);

    Khi minh Debug thi chuoi chuyền vào là "09/01/2009". Sau khi Convert thì nó chuyển thành "09/01/2009 12:00:00 AM". Có cách Convert mà chỉ lấy đúng chuổi đã chuyền vào không. Tức là mình muốn sau khi Convert thì chỉ có "09/01/2009" thôi. Ah mà nhớ là lúc đó ngaysinh vẫn là kiểu DateTime nha.

  6. #6
    Ngày gia nhập
    10 2008
    Bài viết
    85

    Mặc định Unit Test trong lập trình C#

    vừa review lại bài tập lớn môn Process tại CTD chủ đề bài tập nhóm của mình là tìm hiểu về NUnit ) , bài này có ích quá

  7. #7
    Ngày gia nhập
    12 2010
    Bài viết
    218

    Vậy có tools nào để test chương trình không vậy ?

  8. #8
    Ngày gia nhập
    09 2010
    Bài viết
    487

    Thank anh X. Em đang định vào đó nè mà chẳng biết làm sao nữa.
    Một mình ngồi khóc ngoài trời bão tố người đi...


  9. #9
    Ngày gia nhập
    03 2011
    Bài viết
    4

    thế mà bạn cũng hỏi àh.nhưng mình cũng xin trả lời là nhiều lắm bạn à vào google thì không thiếu

  10. #10
    Ngày gia nhập
    06 2010
    Nơi ở
    L.A
    Bài viết
    87

    Test script viết ra mà chạy fail thì ta cứ lôi thằng code ra mà chửi


    Đối với phần mềm lớn thế nào cũng có sai sót mà, sao mà đúng hoàn toàn được, lôi nó ra chửi, nó đình công à
    C'est la vie

Các đề tài tương tự

  1. Kỹ thuật C++ Tạo Unit Test Case cho private method trong C# như thế nào?
    Gửi bởi kunkka trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 12-07-2012, 05:14 PM
  2. Lỗi "No such interface supported(exception from hresult: 0x8004002 )" trong unit test
    Gửi bởi haitrieu749 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 29-03-2012, 11:57 PM
  3. Test case | Tạo test Project với NUnit?
    Gửi bởi nguyenthanh2687 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 06-12-2010, 09:04 PM
  4. Unit Test On Microsoft Visual Studio 2008
    Gửi bởi kavo trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 08-05-2010, 08:53 AM
  5. Unit Test 1000 người truy cập Server cùng 1 lúc
    Gửi bởi xinbat007 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 20-03-2010, 06:02 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn