我們在對軟件做功能測試時,經常需要重復相同的操作過程,但是輸入不同的數據來進行測試,也就是一個單元測試對應多組測試數據。而一個單元測試中,一個Assert只能做一個判斷,如果僅僅因為測試數據不同而重復設計多個相同的測試用例,顯然沒有人愿意這樣做。使用數據驅動測試,就能達到一個單元測試執行多組測試數據的目的,還能使操作邏輯和測試數據分離。下面就通過實例簡單介紹一下這種測試方法,該實例使用excel作為存儲測試數據的數據源。
某銷售人員每月的工資為底薪加提成,底薪2000,所售產品的單價10元,,當月銷量不大于1000時,提成率為0.05,銷量超過1000不大于2000時,提成率為0.10,超過2000時提成率為0.15,現在需要計算他每月根據產品銷量應發多少工資。設計程序如下:
namespace CalculateSalaryProject{ public class Program { public double GetTotalSalaryBySales(int sales) { const double BaseSalary = 2000; double unitPrice = 10; double royaltyRate = 0.0; if (sales <= 0) { royaltyRate = 0.0; } else if (sales <= 1000) { royaltyRate = 0.05; } else if (sales <= 2000) { royaltyRate = 0.10; } else { royaltyRate = 0.15; } return BaseSalary + unitPrice * sales * royaltyRate; } }
}
程序設計完畢,對程序功能進行單元測試如下:
using CalculateSalaryProject;using Microsoft.VisualStudio.TestTools.UnitTesting;namespace TestProject{ [TestClass] public class UnitTest1 { [TestMethod] public void GetSalaryBySalesUnitTest() { Program program = new Program(); double actualSalary = program.GetTotalSalaryBySales(1); double expectedSalary = 2000.5; Assert.AreEqual(expectedSalary, actualSalary); } }}
該測試用例只對銷量為1時的情況進行了測試,而根據邊界值法,需要測試的數據有-1,0,1,999,1000,1001,1999,2000,2001九種,下面就用數據驅動的方法覆蓋這些數據:
打開excel,輸入測試數據如下圖:
保存為Excel 97-2003 Workbook(.xls)格式,存于測試project的bin\debug目錄下。
下面是單元測試代碼:
using System;using CalculateSalaryProject;using Microsoft.VisualStudio.TestTools.UnitTesting;namespace TestProject{ [TestClass] public class UnitTest2 { private TestContext testContextInstance; public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } [TestMethod] [DeploymentItem("SalesAndSalary.xls")] [DataSource( "System.Data.Odbc", @"Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=D:\DataDrivenTestDemo\TestProject\bin\Debug\SalesAndSalary.xls;DefaultDir=.", "Sheet1$", DataAccessMethod.Sequential)] public void GetSalaryBySalesDataDrivenTest() { int sales = Int32.Parse(TestContext.DataRow["sales"].ToString()); Program program = new Program(); double actualSalary = program.GetTotalSalaryBySales(sales); double expectedSalary =Double.Parse(TestContext.DataRow["expectedSalary"].ToString()); Assert.AreEqual(expectedSalary, actualSalary); } }}
另外,需要在測試project中添加引用System.Data.
執行該測試用例,得如下測試結果: