解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)
解剖SQLSERVER 第六篇 ?對OrcaMDF的系統(tǒng)測試?yán)锉苊鈘egressions?(譯)
http://improve.dk/avoiding-regressions-in-orcamdf-by-system-testing/
當(dāng)我繼續(xù)添加新功能和新的數(shù)據(jù)結(jié)構(gòu)支持進(jìn)去OrcaMDF軟件的時候,bug的風(fēng)險不斷增加
特別是當(dāng)我開發(fā)一個很大的未知功能時,我不能預(yù)估結(jié)構(gòu)和該結(jié)構(gòu)的關(guān)聯(lián),為了降低風(fēng)險,測試是很有必要的
?
單元測試
單元測試是在面向?qū)ο缶幊汤餃y試源代碼某一個功能的最小一部分的測試。一個測試的例子是SqlBigInt數(shù)據(jù)類型解析類,
他應(yīng)該長這個樣子
using System; using NUnit.Framework; using OrcaMDF.Core.Engine.SqlTypes;namespace OrcaMDF.Core.Tests.Engine.SqlTypes {[TestFixture]public class SqlBigIntTests{[Test]public void GetValue(){var type = new SqlBigInt();byte[] input;input = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F };Assert.AreEqual(9223372036854775807, Convert.ToInt64(type.GetValue(input)));input = new byte[] { 0x82, 0x5A, 0x03, 0x1B, 0xD5, 0x3E, 0xCD, 0x71 };Assert.AreEqual(8200279581513702018, Convert.ToInt64(type.GetValue(input)));input = new byte[] { 0x7F, 0xA5, 0xFC, 0xE4, 0x2A, 0xC1, 0x32, 0x8E };Assert.AreEqual(-8200279581513702017, Convert.ToInt64(type.GetValue(input)));}[Test]public void Length(){var type = new SqlBigInt();Assert.Throws<ArgumentException>(() => type.GetValue(new byte[9]));Assert.Throws<ArgumentException>(() => type.GetValue(new byte[7]));}} }這個測試包含了SqlBigInt 類的主入口點,測試long?bigint 數(shù)據(jù)類型是否會造成上溢或下溢的情況,也包含長度檢查。
對于像SqlBigInt這樣簡單的類型單元測試會工作得很好。有時候單元測試會很復(fù)雜當(dāng)相關(guān)聯(lián)的類需要調(diào)用相應(yīng)方法,類等支持他運(yùn)行的底層結(jié)構(gòu)的時候(mock測試)
雖然這是一個工作策略,測試需要不斷進(jìn)行,特別在項目早期階段,整個架構(gòu)都是動態(tài)的
?
系統(tǒng)測試
在測試范圍上,我們需要更大的范圍測試 -系統(tǒng)測試。系統(tǒng)測試旨在測試系統(tǒng)作為一個整體,基本上忽略系統(tǒng)內(nèi)部工作原理
如果要分類的話可以被分為 黑盒測試。對于OrcaMDF,我估計可以捕獲90%的所有的regressions?只使用10%的時間,
相比起單元測試使用更多時間只捕獲少量的regressions 。
因此,這是一個很好的方法在開發(fā)期間的測試,同時可以引入關(guān)鍵的單元測試和集成測試。
例如我想測試DatabaseMetaData 類里面的用戶表名字的解析,我可以模擬SysObjects的值列表,同時對于DatabaseMetaData 類
的構(gòu)造函數(shù)也能模擬MdfFile 所必須的參數(shù),為了做到這一點,我必須從MdfFile 提取出一個接口并且在上面使用mocking framework
?
系統(tǒng)測試的方法執(zhí)行以下流程:
1、連接到SQLSERVER實例
2、在測試固件(Test fixture)里創(chuàng)建測試架構(gòu)
3、分離數(shù)據(jù)庫
4、運(yùn)行OrcaMDF 并加載分離的數(shù)據(jù)庫驗證結(jié)果
?
一個測試樣例,創(chuàng)建兩個用戶表并且驗證DatabaseMetaData類的輸出
using System.Data.SqlClient; using NUnit.Framework; using OrcaMDF.Core.Engine;namespace OrcaMDF.Core.Tests.Integration {public class ParseUserTableNames : SqlServerSystemTest{[Test]public void ParseTableNames(){using(var mdf = new MdfFile(MdfPath)){var metaData = mdf.GetMetaData();Assert.AreEqual(2, metaData.UserTableNames.Length);Assert.AreEqual("MyTable", metaData.UserTableNames[0]);Assert.AreEqual("XYZ", metaData.UserTableNames[1]);}}protected override void RunSetupQueries(SqlConnection conn){var cmd = new SqlCommand(@"CREATE TABLE MyTable (ID int);CREATE TABLE XYZ (ID int);", conn);cmd.ExecuteNonQuery();}} }?
在實際的真實生活場景里這樣可以非常快速的進(jìn)行測試。想測試轉(zhuǎn)發(fā)記錄的解析?只需要簡單地創(chuàng)建一個新的測試
編寫TSQL代碼來生成目標(biāo)數(shù)據(jù)庫狀態(tài)然后驗證掃描到的表數(shù)據(jù)
?
系統(tǒng)測試的缺點
不幸的是系統(tǒng)測試不是萬能藥,它也有它的缺點。最明顯的一個缺點是性能。
單元測試通常需要運(yùn)行非常快,基本上允許您在每個文件保存后在后臺運(yùn)行它們。從綁定CPU開始到運(yùn)行 ,每一個這樣的系統(tǒng)測試都需要半秒
幸運(yùn)的是,它們可以并行運(yùn)行沒有問題。在一臺四核的機(jī)器能讓我每分鐘運(yùn)行480個測試。這能夠讓一個完整的測試集合控制在合理的時間,
同時依然保持測試子集能夠很快運(yùn)行。通常代碼的更改不會對測試造成太多的影響
?
第六篇完
總結(jié)
以上是生活随笔為你收集整理的解剖SQLSERVER 第六篇 对OrcaMDF的系统测试里避免regressions(译)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LinQ to entities 不能识
- 下一篇: 明尼苏达推荐系统导论(第一课 欢迎来到R