[Visual Studio 2012 ] 建立資料驅動單元測試
資料驅動單元測試,可讓我們針對某一個待測程式碼注入資料庫以便執行大量筆數的測試,而 VS 可支援 SQL/XML/CSV/EXCEL/ACCESS… 等等,這裡所指的大量筆數並不是海量資料,也不是負載、壓力測試,這只是餵不同的資料格式給待測方法,例如我們在資料驅動裡放一些邊界資料,用來觀察它有沒有如預期結果執行,通常資料驅動的資料格式越千奇百怪,越能測出待測方法的可靠度,在執行時也要注意拿捏專案時程。單元測試最好能達到任何人都隨時可以測試,建議使用夾帶檔案的方式,不要用MSSQL/MySQL,當然測試資料庫若能重複使用的話是最好不過了。
PS.若需要更完整的資料可以參考 91 哥寫的 TDD 以及重構系列文章,單元測試的技巧是不容忽視的。
http://www.dotblogs.com.tw/hatelove/archive/2013/01/11/learning-tdd-in-30-days-catalog-and-reference.aspx
http://www.dotblogs.com.tw/hatelove/category/5036.aspx
資料驅動測試在VS2012裡操作介面變得不一樣了,有興趣的人可以去看看VS2010的操作介面
http://www.dotblogs.com.tw/yc421206/archive/2010/12/08/19990.aspx
在VS2012裡我找不到操作介面,只好用手動敲打……,這跟消失的單元測試選單一樣很不習慣,不過最後還是找回來單元測試選單
http://www.dotblogs.com.tw/yc421206/archive/2013/03/08/95920.aspx
不知道為什麼VS2012消失了那麼多好用的功能,可能是某些原因才導致 MS 開發團隊這樣做的吧。
@在測試專案裡
PS.若不知道如何建立單元測試可參考http://msdn.microsoft.com/zh-tw/library/ms182532.aspx
Step1.準備測試資料
我的資料長這樣,記得要符合 CSV 檔案格式規則
Step2.加入TestContext 屬性至測試類別
public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } }
如下圖示:
Step3.在測試方法裡加入兩個Attribute
DeploymentItemAttribute
DataSourceAttribute
Step4.使用TestContext.DataRow取得資料
範例如下:
[DeploymentItem("RtuReadFunc1Test.csv")] [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\RtuReadFunc1Test.csv", "RtuReadFunc1Test#csv", DataAccessMethod.Random)] public void ReadCoilsTest() { RtuModbusResponse target = new RtuModbusResponse(); byte[] RequestArray = ModbusUtility.HexStringToBytes(TestContext.DataRow[0].ToString()); byte[] ResponseArray = ModbusUtility.HexStringToBytes(TestContext.DataRow[1].ToString()); byte[] expected = ModbusUtility.HexStringToBytes(TestContext.DataRow[2].ToString()); byte[] actual; actual = target.ReadCoils(RequestArray, ResponseArray); Assert.IsTrue(expected.SequenceEqual(actual)); }
Step5.執行測試
測試結果如下圖,由下圖可以觀察出資料趨動測試有一筆測試不通過,這可能是資料格式有誤,或是待測方法沒有處理到這種格式,這就只能靠人工判斷了。
其實DataSourceAttribute 跟我們一般在用的連線字串一樣,如下所示
Excel:
dbq=|DataDirectory|\\Data.xls;defaultdir=.;driverid=790;maxbuffersize=2048;pagetimeout=5;readonly=true", "Sheet1$", DataAccessMethod.Sequential), TestMethod]
XML:
"|DataDirectory|\\data.xml", "Iterations", DataAccessMethod.Sequential), DeploymentItem("data.xml"), TestMethod]
SQLCE:
MSSQL:
Initial Catalog=tempdb;Integrated Security=True", "Data", DataAccessMethod.Sequential), TestMethod]
參考來源:
http://msdn.microsoft.com/zh-tw/library/ee624082.aspx
或者是將DataSourceAttribute 存放在 app.config 裡
@app.config
<configuration> <configSections> <section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </configSections> <connectionStrings> <add name="MyJetConn" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\testdatasource.accdb; Persist Security Info=False;" providerName="System.Data.OleDb" /> <add name="MyExcelConn" connectionString="Dsn=Excel Files;dbq=data.xlsx;defaultdir=.; driverid=790;maxbuffersize=2048;pagetimeout=5" providerName="System.Data.Odbc" /> </connectionStrings> <microsoft.visualstudio.testtools> <dataSources> <add name="MyJetDataSource" connectionString="MyJetConn" dataTableName="MyDataTable" dataAccessMethod="Sequential"/> <add name="MyExcelDataSource" connectionString="MyExcelConn" dataTableName="Sheet1$" dataAccessMethod="Sequential"/> </dataSources> </microsoft.visualstudio.testtools> </configuration>
@TestMethod
[DeploymentItem("MyTestProject\\data.xlsx")] [DataSource("MyExcelDataSource")] public void MyTestMethod2() { Assert.AreEqual(TestContext.DataRow["Val1"], TestContext.DataRow["Val2"]); }
參考來源:
http://msdn.microsoft.com/zh-tw/library/ms243192.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET