如何:建立資料驅動型單元測試
使用Microsoft 單元測試架構的Managed 程式碼,您可以設定單元測試方法來從資料來源擷取用來測試方法的值。這個方法會在資料來源中每個資料列依序執行,可讓您輕鬆地使用單一方法測試各種輸入。
此主題包括下列章節:
建立資料驅動型單元測試包括下列步驟:
建立包含您在測試方法使用的值的資料來源。資料來源可以是任何在機器上登錄執行測試的型別。
加入私用 TestContext 欄位和公用 TestContext 屬性來測試類別。
建立單元測試方法並加入 DataSourceAttribute 屬性加入其中。
使用 DataRow 索引子屬性擷取您在測試中使用的值。
待測方法
例如,假設我們已經建立:
MyBank 會接受並處理序帳戶不同類型的交易。
在MyBank 的一個叫做 BankDb 的專案負責管理帳號交易。
一個叫做Maths存在於 DbBank的專案會處理數學函式來確保所有交易都是對銀行有利的。
一個叫做 BankDbTests 的單元測試專案來測試 BankDb 元件的行為。
一個叫做 MathsTests 的單元測試專案來驗證 Maths 類別的行為。
我們將用迴圈加入兩個整數來測試一個在Maths 的方法:
public int AddIntegers(int first, int second)
{
int sum = first;
for( int i = 0; i < second; i++)
{
sum += 1;
}
return sum;
}
建立資料來源
若要測試 AddIntegers 方法,我們會建立指定參數的範圍值和總和以及自己所傳回的資料來源。在我們的範例中,我們會建立名為 MathsData的SQL Compact 資料庫和名為 AddIntegersData 的包含下列資料行名稱和值的資料表
FirstNumber |
SecondNumber |
Sum |
---|---|---|
0 |
1 |
1 |
1 |
1 |
2 |
2 |
-3 |
-1 |
加入 TestContext 至測試類別
單元測試架構建立 TestContext 物件儲存資料驅動型測試的資料來源資訊。 架構會將這個物件做為 TestContext 我們建立的屬性值。
private TestContext testContextInstance;
public TestContext TestContext
{
get { return testContextInstance; }
set { testContextInstance = value; }
}
在測試方法中,您可以透過 DataRow的TestContext索引屬性來存取資料。
寫入測試方法
AddIntegers 的測試方法相當簡單。 對於資料來源中的每個資料列,我們會使用 FirstNumber 和 SecondNumber 資料行值的 AddIntegers 做為參數,因此,我們檢查傳回值是否為 總和。 資料行值:
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]
[TestMethod()]
public void AddIntegers_FromDataSourceTest()
{
var target = new Maths();
// Access the data
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);
int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);
int actual = target.IntegerMethod(x, y);
Assert.AreEqual(expected, actual,
"x:<{0}> y:<{1}>",
new object[] {x, y});
}
請注意 Assert 方法包括顯示已失敗的反覆項目的 x 和 y 值中的訊息。 根據預設,已確定的值, expected 和 actual,已包含在為失敗的測試的詳細資料。
指定 DataSourceAttribute
DataSource 屬性對資料來源和您在測試方法使用的資料表名稱指定連接字串。 連接字串中的確切資訊會因您所使用的資料來源種類而有所不同。在此範例中,我們使用了 SqlServerCe 資料庫。
[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]
資料來源屬性有三個建構函式。
[DataSource(dataSourceSettingName)]
具有參數的建構函式在方案中使用 app.config 檔案中儲存的連接資訊。dataSourceSettingsName 是 XML 項目的名稱已在指定連接資訊的組態檔的。
使用 app.config 檔可讓您變更資料來源中的位置,而不需要對單元測試做變更。如需如何建立和使用 app.config 檔案的詳細資訊,請參閱逐步解說:使用組態檔定義資料來源。
[DataSource(connectionString, tableName)]
具有兩個參數的 DataSource 建構函式 (Constructor) 為資料來源和包含的資料可用來測試方法資料表名稱指定連接字串。
連接字串是根據資料來源的型別的型別,不過,它應該包含指定資料提供者的非變異的提供者名稱的項目。
[DataSource(
dataProvider,
connectionString,
tableName,
dataAccessMethod
)]
使用 TestContext.DataRow 存取的資料。
若要存取在 AddIntegersData 資料的資料表,請使用 TestContext.DataRow 索引子。 DataRow 是DataRow 物件,因此,我們以索引或資料行名稱擷取資料行值。因為值傳回為物件,我們必須將它們轉換為適當的型別:
int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);
執行測試並檢視結果
當您完成撰寫測試方法時,建立測試專案。 測試方法都會位於 [未執行的測試] 群組中的測試總管視窗。您執行,撰寫,並重新執行測試、測試總管中顯示結果。 [失敗的測試] 的群組中, [通過的測試] 和 [未執行的測試]。 您可以選擇 全部執行 執行所有測試,或選取 執行 選取測試的子集執行。
測試結果列在 [總管] 頂端的動畫為測試回合。在測試回合結束時,所有測試都通過的話狀態列會是綠色的,如果有任何測試失敗則為紅色。測試回合的摘要出現在詳細資料窗格中的測試總管視窗底部。選取測試並下方窗格中的測試詳細資料。
如果您執行在我們的範例中的方法, AddIntegers_FromDataSourceTest 結果列會變成紅色,並測試方法移至 [失敗的測試] A 資料驅動型測試失敗,如果有任何資料來源中的重複的方法會失敗。當您選取測試總管視窗中的失敗的資料驅動型測試,詳細資料窗格會顯示資料列索引所識別的每個反覆項目的結果。在範例中,會出現 AddIntegers 演算法無法正確處理負值。
當修正待測方法和重新執行測試時,結果列空轉綠色,而測試方法移至 [成功的測試] 群組。
請參閱
參考
Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute
Microsoft.VisualStudio.TestTools.UnitTesting.TestContext
Microsoft.VisualStudio.TestTools.UnitTesting.Assert
概念
使用適用於 Managed 程式碼的 Microsoft 單元測試架構撰寫適用於 .NET Framework 的單元測試