2010年7月7日 星期三

Data Driven Test

寫了一個類別

public class Class1
{
    public int Add(int a, int b)
    {
      return a + b;
    }
}
作了一個單元測試 (Unit Test)
[TestMethod]
public void TestMethod1()
{
  var o = new Class1();
  int a = 1;
  int b = 2;
  int c = o.Add(a, b);
  Assert.AreEqual<int>(3, c);
}

當然,這個測試通過了。但可惜的是,只能測一個 1 + 2 = 3 的測試案例。如果要測數個案例,要怎麼做呢?

此時,需要一些步驟。

步驟1:增加測試資料

增加一個文字檔 Data.csv, 並加入 TestProject, 內容如下

Val1, Val2, Result
1,2,3
4,6,10
5,7,12
10,-10,0
儲存時,使用 Chinese Trandional (Big5) 的編碼存檔
image
image

步驟2:設定部署

執行 Test/Edit Test Settings/Local(local.testsettings)

image

選取 Test Settings/Deployment 中的 Enable deploymnet 選項。此選項在 Visual Studio 2008 中預設為選取的,但在 Visual Studio 2010 中預設為不選取。

image

接下來,要在 Test Method 中加上 Deployment 及DataSource屬性,指示進行測試時,需要部署該 Data.csv 檔案。如下

[TestMethod, DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "data.csv", "data#csv", DataAccessMethod.Sequential)]
[DeploymentItem("Data.csv")]
public void TestMethod1()

接著,在 Solution Explorer 中選取 Data.csv,按 F4 打開 Properties Windows,將 Copy to Output Directory 設成 Copy always

image

步驟3:修改測試程式

這個動作將執行測試時,輸入 Class1.Add 的參數改由測試資料來讀取

[TestMethod, DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "data.csv", "data#csv", DataAccessMethod.Sequential)]
[DeploymentItem("Data.csv")]
public void TestMethod1()
{
  var o = new Class1();
  int a = Convert.ToInt32(TestContext.DataRow["Val1"]);
  int b = Convert.ToInt32(TestContext.DataRow["Val2"]);
  int c = o.Add(a, b);
  int checkValue = Convert.ToInt32(TestContext.DataRow["Result"]);
  Assert.AreEqual<int>(checkValue, c);
}

結果

測試結果如下。注意到雖然我們只寫了一個 TestMethod,但資料有4組,使用 Debug 模式追蹤,也的確跑了4次。但為什麼會顯示5個測試呢?我也不清楚。

image

image

 

Sample code download

1 則留言:

91 提到...

不曉得如果資料是物件的時候,該怎麼表示?

Share with Facebook