解剖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軟件的時(shí)候, bug的風(fēng)險(xiǎn) 不斷增加
特別是當(dāng)我開發(fā)一個(gè)很大的未知功能時(shí),我不能預(yù)估結(jié)構(gòu)和該結(jié)構(gòu)的關(guān)聯(lián),為了降低風(fēng)險(xiǎn),測試是很有必要的
?
單元測試
單元測試 是在面向?qū)ο缶幊汤餃y試源代碼某一個(gè)功能的最小一部分的測試。一個(gè)測試的例子是 SqlBigInt數(shù)據(jù)類型 解析類,
他應(yīng)該長這個(gè)樣子
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 ])); } } }
這個(gè)測試包含了SqlBigInt 類的主入口點(diǎn),測試long?bigint 數(shù)據(jù)類型是否會造成上溢或下溢的情況,也包含長度檢查。
對于像SqlBigInt這樣簡單的類型單元測試會工作得很好。有時(shí)候單元測試會很復(fù)雜當(dāng)相關(guān)聯(lián)的類需要調(diào)用相應(yīng)方法,類等支持他運(yùn)行的底層結(jié)構(gòu)的時(shí)候( mock測試 )
雖然這是一個(gè)工作策略,測試需要不斷進(jìn)行,特別在項(xiàng)目早期階段,整個(gè)架構(gòu)都是動態(tài)的
?
系統(tǒng)測試
在測試范圍上,我們需要更大的范圍測試 -系統(tǒng)測試。系統(tǒng)測試旨在測試系統(tǒng)作為一個(gè)整體,基本上忽略系統(tǒng)內(nèi)部工作原理
如果要分類的話可以被分為 黑盒測試。對于OrcaMDF,我估計(jì)可以捕獲90%的所有的regressions?只使用10%的時(shí)間,
相比起單元測試使用更多時(shí)間只捕獲少量的regressions 。
因此,這是一個(gè)很好的方法在開發(fā)期間的測試,同時(shí)可以引入關(guān)鍵的單元測試和集成測試。
例如我想測試DatabaseMetaData 類里面的用戶表名字的解析,我可以模擬SysObjects的值列表,同時(shí)對于DatabaseMetaData 類
的構(gòu)造函數(shù)也能模擬MdfFile 所必須的參數(shù),為了做到這一點(diǎn),我必須從MdfFile 提取出一個(gè)接口并且在上面使用mocking framework
?
系統(tǒng)測試的方法執(zhí)行以下流程:
1、連接到SQLSERVER實(shí)例
2、在 測試固件(Test fixture) 里創(chuàng)建測試架構(gòu)
3、分離數(shù)據(jù)庫
4、運(yùn)行OrcaMDF 并加載分離的數(shù)據(jù)庫驗(yàn)證結(jié)果
?
一個(gè)測試樣例,創(chuàng)建兩個(gè)用戶表并且驗(yàn)證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(); } } }
?
在實(shí)際的真實(shí)生活場景里這樣可以非常快速的進(jìn)行測試。想測試轉(zhuǎn)發(fā)記錄的解析?只需要簡單地創(chuàng)建一個(gè)新的測試
編寫TSQL代碼來生成目標(biāo)數(shù)據(jù)庫狀態(tài)然后驗(yàn)證掃描到的表數(shù)據(jù)
?
系統(tǒng)測試的缺點(diǎn)
不幸的是系統(tǒng)測試不是萬能藥,它也有它的缺點(diǎn)。最明顯的一個(gè)缺點(diǎn)是性能。
單元測試通常需要運(yùn)行非常快,基本上允許您在每個(gè)文件保存后在后臺運(yùn)行它們。從綁定CPU開始到運(yùn)行 ,每一個(gè)這樣的系統(tǒng)測試都需要半秒
幸運(yùn)的是,它們可以并行運(yùn)行沒有問題。在一臺四核的機(jī)器能讓我每分鐘運(yùn)行480個(gè)測試。這能夠讓一個(gè)完整的測試集合控制在合理的時(shí)間,
同時(shí)依然保持測試子集能夠很快運(yùn)行。通常代碼的更改不會對測試造成太多的影響
?
第六篇完
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
