日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

解剖SQLSERVER 第六篇 對(duì)OrcaMDF的系統(tǒng)測(cè)試?yán)锉?/h1>
系統(tǒng) 3275 0

原文: 解剖SQLSERVER 第六篇 對(duì)OrcaMDF的系統(tǒng)測(cè)試?yán)锉苊鈘egressions(譯)

解剖SQLSERVER 第六篇 ?對(duì)OrcaMDF的系統(tǒng)測(cè)試?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)我開(kāi)發(fā)一個(gè)很大的未知功能時(shí),我不能預(yù)估結(jié)構(gòu)和該結(jié)構(gòu)的關(guān)聯(lián),為了降低風(fēng)險(xiǎn),測(cè)試是很有必要的

?

單元測(cè)試

單元測(cè)試 是在面向?qū)ο缶幊汤餃y(cè)試源代碼某一個(gè)功能的最小一部分的測(cè)試。一個(gè)測(cè)試的例子是 SqlBigInt數(shù)據(jù)類(lèi)型 解析類(lèi),

他應(yīng)該長(zhǎ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è)測(cè)試包含了SqlBigInt 類(lèi)的主入口點(diǎn),測(cè)試long?bigint 數(shù)據(jù)類(lèi)型是否會(huì)造成上溢或下溢的情況,也包含長(zhǎng)度檢查。

對(duì)于像SqlBigInt這樣簡(jiǎn)單的類(lèi)型單元測(cè)試會(huì)工作得很好。有時(shí)候單元測(cè)試會(huì)很復(fù)雜當(dāng)相關(guān)聯(lián)的類(lèi)需要調(diào)用相應(yīng)方法,類(lèi)等支持他運(yùn)行的底層結(jié)構(gòu)的時(shí)候( mock測(cè)試

雖然這是一個(gè)工作策略,測(cè)試需要不斷進(jìn)行,特別在項(xiàng)目早期階段,整個(gè)架構(gòu)都是動(dòng)態(tài)的

?

系統(tǒng)測(cè)試

在測(cè)試范圍上,我們需要更大的范圍測(cè)試 -系統(tǒng)測(cè)試。系統(tǒng)測(cè)試旨在測(cè)試系統(tǒng)作為一個(gè)整體,基本上忽略系統(tǒng)內(nèi)部工作原理

如果要分類(lèi)的話(huà)可以被分為 黑盒測(cè)試。對(duì)于OrcaMDF,我估計(jì)可以捕獲90%的所有的regressions?只使用10%的時(shí)間,

相比起單元測(cè)試使用更多時(shí)間只捕獲少量的regressions 。

因此,這是一個(gè)很好的方法在開(kāi)發(fā)期間的測(cè)試,同時(shí)可以引入關(guān)鍵的單元測(cè)試和集成測(cè)試。

例如我想測(cè)試DatabaseMetaData 類(lèi)里面的用戶(hù)表名字的解析,我可以模擬SysObjects的值列表,同時(shí)對(duì)于DatabaseMetaData 類(lèi)

的構(gòu)造函數(shù)也能模擬MdfFile 所必須的參數(shù),為了做到這一點(diǎn),我必須從MdfFile 提取出一個(gè)接口并且在上面使用mocking framework

?

系統(tǒng)測(cè)試的方法執(zhí)行以下流程:

1、連接到SQLSERVER實(shí)例

2、在 測(cè)試固件(Test fixture) 里創(chuàng)建測(cè)試架構(gòu)

3、分離數(shù)據(jù)庫(kù)

4、運(yùn)行OrcaMDF 并加載分離的數(shù)據(jù)庫(kù)驗(yàn)證結(jié)果

?

一個(gè)測(cè)試樣例,創(chuàng)建兩個(gè)用戶(hù)表并且驗(yàn)證DatabaseMetaData類(lèi)的輸出

      
        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í)生活場(chǎng)景里這樣可以非??焖俚倪M(jìn)行測(cè)試。想測(cè)試轉(zhuǎn)發(fā)記錄的解析?只需要簡(jiǎn)單地創(chuàng)建一個(gè)新的測(cè)試
編寫(xiě)TSQL代碼來(lái)生成目標(biāo)數(shù)據(jù)庫(kù)狀態(tài)然后驗(yàn)證掃描到的表數(shù)據(jù)

?

系統(tǒng)測(cè)試的缺點(diǎn)

不幸的是系統(tǒng)測(cè)試不是萬(wàn)能藥,它也有它的缺點(diǎn)。最明顯的一個(gè)缺點(diǎn)是性能。

單元測(cè)試通常需要運(yùn)行非???基本上允許您在每個(gè)文件保存后在后臺(tái)運(yùn)行它們。從綁定CPU開(kāi)始到運(yùn)行 ,每一個(gè)這樣的系統(tǒng)測(cè)試都需要半秒

幸運(yùn)的是,它們可以并行運(yùn)行沒(méi)有問(wèn)題。在一臺(tái)四核的機(jī)器能讓我每分鐘運(yùn)行480個(gè)測(cè)試。這能夠讓一個(gè)完整的測(cè)試集合控制在合理的時(shí)間,

同時(shí)依然保持測(cè)試子集能夠很快運(yùn)行。通常代碼的更改不會(huì)對(duì)測(cè)試造成太多的影響

?

第六篇完

解剖SQLSERVER 第六篇 對(duì)OrcaMDF的系統(tǒng)測(cè)試?yán)锉苊鈘egressions


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 昌宁县| 林西县| 启东市| 睢宁县| 舟曲县| 武宣县| 镇雄县| 云和县| 雷山县| 澎湖县| 右玉县| 清水河县| 林西县| 灵石县| 龙泉市| 台前县| 昆山市| 那曲县| 胶南市| 本溪市| 湘乡市| 仙居县| 枞阳县| 神木县| 南宁市| 江华| 乐昌市| 彰化市| 竹溪县| 新建县| 佛学| 武义县| 海兴县| 若羌县| 桦南县| 建瓯市| 新巴尔虎右旗| 永安市| 谢通门县| 子洲县| 武功县|