Wednesday, May 6, 2009

Test-Driven Development (TDD) trong .NET bằng ví dụ – Phần 2

Trong Phần 1 chúng ta đã hoàn thành Test 1, bây giờ tiếp theo phần này chúng ta sẽ hoàn thành Test số 2.

Test 2:  Push một đối tượng đơn vào Stack và xác nhận IsEmpty là false

Bây giờ chúng ta sẽ viết code để test yêu cầu này.

    [Test]
    public void PushOne()
    {
        Stack stack = new Stack();
        stack.Push("first element");
        Assert.IsFalse(stack.IsEmpty,
            "Sau khi Push. IsEmpty phải bằng false.");
    }

Và tất nhiên, ta sẽ viết phương thức Push cho lớp Stack.

    public void Push(object obj)
    {
    }

Bây giờ, ta thực hiện chạy NUnit Test với PushOne và cho kết quả sau:

Passed: 1 Failed: 1 Errors: 0 Inconclusive: 0 Invalid: 0 Skipped: 0 Time: 0.078125

StackFixture.PushOne:  Sau khi Push. IsEmpty phải bằng false.
  Expected: False
  But was:  True

Kết quả test fail bởi vì sau khi Push thì m_IsEmpty = false, nhưng ở đây vẫn đặt là true. Do đó, ta thực hiện thay đổi phương thức Push như sau:

    public void Push(object obj)
    {
        m_IsEmpty = false;
    }

Trước khi cài đặt Test Case tiếp theo, chúng ta cần hiệu chỉnh code test để tránh trùng lặp code. Do đó, ta sẽ tạo thêm các phương thức Init để làm việc này với thuộc tính được khai báo là [Setup], nó sẽ tự động khởi tạo các dữ liệu cần thiết trước khi chạy mỗi Test Case. Đây là mã nguồn sau khi hiệu chỉnh:

using System;
using NUnit.Framework;

[TestFixture]
public class StackFixture
{
    private Stack stack;

    [SetUp]
    public void Init()
    {
        stack = new Stack();
    }

    [Test]
    public void Empty()
    {
        Assert.IsTrue(stack.IsEmpty);
    }

    [Test]
    public void PushOne()
    {
        stack.Push("first element");
        Assert.IsFalse(stack.IsEmpty,
            "Sau khi Push. IsEmpty phải bằng false.");
    }
}

Trên đây là một ví dụ tuyệt vời cho nguyên tắc thứ 2 của TDD: Loại trừ trùng lặp.

Bây giờ, kết quả chạy của các test case đã được cài đặt đều pass. Do đó, ta sẽ chuyển qua Test Case tiếp theo.

Test-Driven Development (TDD) trong .NET bằng ví dụ

Test-Driven Development (TDD) như được định nghĩa trong Wiki, là một kỹ thuật phát triển phần mềm chia nhỏ một chức năng thành các pha phát triển nhỏ dựa trên việc định nghĩa các test case. Mỗi pha tạo ra các đoạn code cần thiết để có thể đạt được các pha test. Cuối cùng, người lập trình hiệu chỉnh (refactor) code cho khớp với các thay đổi. Một khái niệm quan trọng của TDD là phải chuẩn bị các bản test trước khi lập trình để thuận tiện cho việc nhanh chóng đáp ứng các thay đổi. Chú ý rằng test-driven development là một phương pháp thiết kế phần mềm, không chỉ là một phương pháp của việc kiểm thử.

Trong bài viết này, chúng tôi sẽ sử dụng một ví dụ là xây dựng một Stack sử dụng Test-Driven Development (TDD) theo từng bước một.

Nhim v

Stack là một cấu trúc dữ liệu mà được truy cập theo kiểu tuần tự vào sau ra trước. Các hoạt động bao gồm: Push, Pop, Top IsEmpty. Push thêm một phần từ vào đỉnh của Stack, Pop lấy một phần tử trên đỉnh của Stack, Top trả lại phần tử trên đỉnh của Stack. IsEmpty trả về true khi Stack rỗng, ngược lại là false.

Như vậy, danh sách test gồm:

  • Tạo một Stack và xác nhận IsEmpty là true.
  • Push một đối tượng đơn vào Stack và xác nhận IsEmpty là false.
  • Push một đối tượng đơn, Pop đối tượng đó và xác nhận IsEmpty là true.
  • Push một đối tượng đơn, ghi nhớ đối tượng đó; Pop đối tượng, và xác nhận hai đối tượng này là giống nhau.
  • Push ba đối tượng, ghi nhớ chúng; Pop từng đối tượng một, và xác nhận chúng được xóa theo đúng thứ tự.
  • Pop một Stack không có thành phần nào.
  • Push một đối tượng đơn và sau đó gọi Top. Xác nhận IsEmpty là false.
  • Push một đối tượng đơn, nhớ nó; sau đó gọi Top. Xác nhận đối tượng trả lại là giống với đối tượng đã được đưa vào.
  • Gọi Top trên một Stack rỗng.

Ở đây, chúng ta sẽ chọn test case đơn giản nhất để thực hiện đầu tiên, đó chính là test case đầu tiên trên danh sách ở trên.

Cài đặt

Tiếp theo, chúng ta sẽ cài đặt từng test case trong danh sách ở trên.

Test 1: Tạo một Stack và xác nhận IsEmpty là true.

Chúng ta sẽ tạo 1 file source code test gọi là StackFixture.cs, trong đó sẽ chứa các test case được cài đặt.

Đầu tiên, chúng ta khai báo

  using System; 
  using NUnit.Framework; 

  [TestFixture] 
  public class StackFixture 
  { /*...*/ }	
  

Tiếp theo, chúng ta viết phương thức test cho test case này, tên là Empty.

    [Test]
    public void Empty()
    {
        Stack stack = new Stack();
        Assert.IsTrue(stack.IsEmpty);
    }

Với bản test ở trên, chúng ta sẽ thực hiện cài đặt code cho Property là IsEmpty của lớp Stack mà ta đang cài đặt.

using System;

public class Stack
{
    private bool m_IsEmpty;

    public bool IsEmpty
    {
        get {
            return m_IsEmpty;
        }
    }
}

Như vậy, việc cài đặt cho test case đầu tiên đã hoàn thành. Khi bắt đầu, bạn nên tập trung vào test case mà bạn đang viết và không nghĩ đến các test case khác. Điều đó sẽ giúp bạn kiểm soát được tốt hơn khi mà lượng test case lớn hơn.

 

Thursday, March 12, 2009

Thay đổi VS Color Schemes

Hãy vào trang VS Color Schemes để tham khảo cách thực hiện thay đổi Color Scheme của Visual Studio gồm cả 2005 và 2008 cũng như SQL Server Management Studio.