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

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

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

解剖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)行。通常代碼的更改不會對測試造成太多的影響

?

第六篇完

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 托克逊县| 玉林市| 资阳市| 乡宁县| 江津市| 疏附县| 淳安县| 东莞市| 仙游县| 泰宁县| 开远市| 邹平县| 澄迈县| 乌兰县| 神农架林区| 小金县| 迁安市| 丘北县| 集安市| 夹江县| 浙江省| 乳山市| 大英县| 盈江县| 新营市| 无为县| 张家界市| 资讯 | 凉山| 瑞丽市| 海淀区| 乌审旗| 玉田县| 泸水县| 罗田县| 西畴县| 济阳县| 新昌县| 南郑县| 华阴市| 营山县|