亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

解剖SQLSERVER 第十一篇 對SQLSERVER的多個版本進行自動化測試(譯)

2024-07-21 02:48:57
字體:
來源:轉載
供稿:網友
解剖SQLSERVER 第十一篇 對SQLSERVER的多個版本進行自動化測試(譯)解剖SQLSERVER 第十一篇 對SQLSERVER的多個版本進行自動化測試(譯)

http://imPRove.dk/automated-testing-of-orcamdf-against-multiple-sql-server-versions/

自從我發布了OrcaMDF Studio,我已經意識到SQL2005和SQL2008之間的一些系統表的差異。

這些差異導致OrcaMDF 解析失敗因為代碼是針對2008 R2的格式的

當需要做SQL2005的兼容時,我漸漸意識到我需要擴大多個SQLSERVER版本的測試覆蓋,替代之前的只對一個版本的測試。

而且,我也需要對一些特定版本功能進行特定的測試(例如:稀疏列測試只能運行在SQLSERVER2008及以上版本)

NUnit TestCaseSourceAttribute 解決問題

NUnit支持通過TestCase屬性進行內聯參數測試。更好的是,對于動態測試用例我們還可以提供參數數據,使用TestCaseSource屬性,使用TestCaseSource attribute。

首先,我實現了一個簡單的枚舉來覆蓋我目前工作所支持的版本:

public enum DatabaseVersion{    SqlServer2005,    SqlServer2008,    SqlServer2008R2,}

然后我創建SqlServerTestAttribute類,直接繼承自TestCaseSourceAttribute,就像這樣:

public class SqlServerTestAttribute : TestCaseSourceAttribute{    private static IEnumerable<TestCaseData> versions    {        get        {            foreach (var value in Enum.GetValues(typeof(DatabaseVersion)))                yield return new TestCaseData(value).SetCategory(value.ToString());        }    }    public SqlServerTestAttribute() : base(typeof(SqlServerTestAttribute), "versions")    { }}

這個SqlServerTestAttribute類告訴TestCaseSourceAttribute 在私有靜態的版本屬性(private static)里去找測試用例的源數據。

版本屬性里枚舉出所有的DatabaseVersion值并一個接一個的返回它們——確保將測試類別設置到DatabaseVersion值的名稱

接下來,我將當前的測試轉換為使用新的SqlServerTest attribute,替代先前的vanilla NUnit Test attribute:

[SqlServerTest]public void HeapForwardedRecord(DatabaseVersion version){    ...}

這將導致我所有的測試都需要根據DatabaseVersion枚舉里面的每個枚舉值都運行一次,自動獲取輸入的版本參數里面的每一個值

支持不同的開發環境現在,我不想強迫每個人都安裝所有版本的SQL Server--他們可能只是想軟件支持SQL Server 2005 & 2008R2就夠了。在OrcaMDF.Core.Tests項目里,我定義了每種受支持的測試數據庫的連接字符串,就像這樣

<connectionStrings>    <clear/>    <add name="SqlServer2005" connectionString="Data Source=.SQL2005;Integrated Security=SSPI"/>    <add name="SqlServer2008R2" connectionString="Data Source=.;Integrated Security=SSPI"/></connectionStrings>

如果一個數據庫沒有相應的連接字符串(名稱對應的DatabaseVersion 枚舉值)那么該版本的測試就不會運行。因為這個,我目前忽略SQL Server 2008 并且在我的機器上只安裝了SQL 2005 和SQL 2008R2

為了對當前可用數據庫進行過濾,我修改了我的測試用例讓基類去運行實際的測試,使用lambda表達式:

[SqlServerTest]public void HeapForwardedRecord(DatabaseVersion version){    RunDatabaseTest(version, db =>    {        var scanner = new DataScanner(db);        var rows = scanner.ScanTable("HeapForwardedRecord").ToList();        Assert.AreEqual(25, rows[0].Field<int>("A"));        Assert.AreEqual("".PadLeft(5000, 'A'), rows[0].Field<string>("B"));        Assert.AreEqual(28, rows[1].Field<int>("A"));        Assert.AreEqual("".PadLeft(4000, 'B'), rows[1].Field<string>("B"));    });}

這個RunDatabase 方法在SqlServerSystemTestBase類里面聲明

protected void RunDatabaseTest(DatabaseVersion version, Action<Database> test){    string versionConnectionName = version.ToString();    // Only run test for this version if a connection string has been provided    if (ConfigurationManager.ConnectionStrings[versionConnectionName] == null)        Assert.Inconclusive();    // Setup database and store file paths, if we haven't done so already    ensureDatabaseIsSetup(version);    // Run actual test    using (var db = new Database(databaseFiles[version]))        test(db);}

如果對應的連接字符串沒有在配置文件里面聲明,我們會放棄測試并且會將他標記為不確定的- 根據當前的配置情況我們根本不能運行他。

接下來,ensureDatabaseIsSetup()執行通常的配置代碼(詳細內容可以參考先前的文章)盡管這一次每個數據庫版本,每個測試固件都需要執行。最后 一個OrcaMDF實例將會被創建并傳入實際的測試參數

支持不同SQLSERVER版本的特性正如前面提到的,我需要針對特定SQLSERVER版本的執行的測試方法。標準的SqlServerTestAttribute 自動枚舉所有的DatabaseVersion enumeration里面的值,不過我沒有理由再單獨創建一個SqlServer2005TestAttribute 就像這樣

public class SqlServer2005TestAttribute : TestCaseSourceAttribute{    private static IEnumerable<TestCaseData> versions    {        get        {            yield return new TestCaseData(DatabaseVersion.SqlServer2005).SetCategory(DatabaseVersion.SqlServer2005.ToString());        }    }    public SqlServer2005TestAttribute() : base(typeof(SqlServer2005TestAttribute), "versions")    { }}

那如果需要將測試運行在SQL Server 2008上呢?

public class SqlServer2008PlusTestAttribute : TestCaseSourceAttribute{    private static IEnumerable<TestCaseData> versions    {        get        {            foreach (var value in Enum.GetValues(typeof(DatabaseVersion)))                if((DatabaseVersion)value >= DatabaseVersion.SqlServer2008)                    yield return new TestCaseData(value).SetCategory(value.ToString());        }    }    public SqlServer2008PlusTestAttribute()        : base(typeof(SqlServer2008PlusTestAttribute), "versions")    { }}

一旦我們有attributes,那么將會比較容易的對于我們的版本運行單獨的測試

[SqlServer2008PlusTest]public void ScanAllNullSparse(DatabaseVersion version){    RunDatabaseTest(version, db =>    {        var scanner = new DataScanner(db);        var rows = scanner.ScanTable("ScanAllNullSparse").ToList();  //稀疏列        Assert.AreEqual(null, rows[0].Field<int?>("A"));        Assert.AreEqual(null, rows[0].Field<int?>("B"));    });}

對于ReSharper test runner 的支持為了運行測試,我們需要ReSharper 6.0 因為ReSharper 5.1不支持TestCaseSource attribute。一旦你執行了測試,你將會看到下面的測試結果(已經支持SQL Server 2005 & 2008 R2 測試)

每一個測試用例都會自動對多個版本的DatabaseVersion 進行測試(除了解析測試,因為他沒有實現SqlServerSystemTestBase 因此不能運行多版本測試)。

因為我沒有對 SQL Server 2005作出支持所以大部分對 SQL Server 2005的測試都失敗。當我運行測試的時候所有SQL2008的測試都是inconclusive 。

最后,所有對于SQL2008R2的測試都通過了

測試過濾很明顯,我們不能總是對所有版本的SQLSERVER進行測試,那太浪費時間了。其中一種禁用對特定版本的測試的方法就是刪除連接字符串。

然而,這樣依然會產生不明確的輸出,而且總是修改配置文件會很麻煩

不幸的是,ReSharper test runner不支持對使用TestCaseSourceAttribute創建的參數化測試的category 過濾。我已經在 YouTRACK上面開了一個特性要求,我希望ReSharper團隊會考慮將這個特性添加到ReSharper6.1。如果你也覺得這個特性很棒,請考慮投票支持

幸運的是,NUnit test runner 不支持這種過濾。在NUnit test runner里打開OrcaMDF.Core.Tests程序集會給你以下結果

注意在我們運行測試之前,Nunit怎么知道參數化的測試參數的!同時也需要注意Nunit怎么讓DifferingRecordFormats 測試只運行在SQL2008或以上 ,

而FGSpecificClusteredAllocation測試只讓運行在SQL2005或以上

幸好,如果我們點擊Categories的tab標簽,我們就可以獲得測試類別的清單

通過顯式選擇特定的版本類別,我們可以選擇運行某些版本,一旦運行了,沒有被選擇的類別類別頭部的小圓點會變成灰色

可以注意到 運行時間用了89秒,基本上1秒一個測試,98%的時間花費在了lob類型特性的測試上。由于類別格式,我能夠在主要的測試類別上進行選擇,從而輕松過濾掉長時間運行的測試項目并只關注快速完成的那些類別。

lob 類型特別需要進行測試因為在數據庫啟動之前他們涉及大量的磁盤活動,配置表和配置行的創建

展望未來添加新版本就猶如安裝SQLSERVER那樣簡單,在配置項里添加一個連接字符串,最后,添加SQLSERVER版本名字進去DatabaseVersion 枚舉里。就這么多了。

進一步,在某種程度上我需要按順序測試多種升級途徑。基于我自己做的一些測試,一個從SQL Server 2005升級到SQLSERVER2008 R2之后的數據庫

可能跟在SQLSERVER2008 R2本地創建的數據庫有不同,或者從SQL2008升級到SQL2008R2。因此,我需要測試多種不同的升級途徑確保完全的兼容性。

然而,兼容性測試的優先級在我的測試優先級列表里比較低,因為這些兼容性測試會花費很多時間

第十一篇完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品电影网在线观看| 91在线视频导航| 午夜精品久久久久久久久久久久| 欧美黑人巨大精品一区二区| 国产丝袜精品第一页| 成人国产精品一区二区| 国产免费一区二区三区在线能观看| 欧美激情精品久久久久久大尺度| 日韩国产精品一区| 九九久久综合网站| 亚洲人成在线观看网站高清| 91精品久久久久久久| y97精品国产97久久久久久| 国产suv精品一区二区三区88区| 国产成+人+综合+亚洲欧洲| 亚洲福利视频在线| 91情侣偷在线精品国产| 久久资源免费视频| 亚洲毛片在线观看| 久久精品久久久久久| 久久亚洲精品网站| 国产ts人妖一区二区三区| 国产在线高清精品| 国产精品视频白浆免费视频| 精品国产一区av| 亚洲成avwww人| 国产精品成人免费视频| 2019中文字幕全在线观看| 亚洲精品久久久久国产| 91久热免费在线视频| 欧美影院成年免费版| 国产精品视频久久| 欧美日韩免费观看中文| 久久99热这里只有精品国产| 97香蕉久久超级碰碰高清版| 色香阁99久久精品久久久| 亚洲精品国产综合区久久久久久久| 日韩av中文在线| 好吊成人免视频| 少妇激情综合网| 亚洲精品一区在线观看香蕉| 国产成人精品久久二区二区| 91av中文字幕| 97人洗澡人人免费公开视频碰碰碰| 日韩中文娱乐网| 国产免费一区二区三区香蕉精| 日本久久中文字幕| 中文字幕精品一区久久久久| 亚洲综合日韩在线| 91精品国产91久久久| 午夜精品一区二区三区视频免费看| 欧美视频在线视频| 国产一区二区精品丝袜| 隔壁老王国产在线精品| 欧美日韩精品在线| 国产日韩欧美视频| 伊人久久大香线蕉av一区二区| 97久久超碰福利国产精品…| 亚洲国产高潮在线观看| 日韩高清av在线| 国产日韩换脸av一区在线观看| 精品无人区乱码1区2区3区在线| 91香蕉国产在线观看| 国产精品av免费在线观看| 欧美精品免费在线| 精品国产视频在线| 8x拔播拔播x8国产精品| 亚洲欧洲日产国产网站| 亚洲一区二区少妇| 亚洲激情视频网| 欧美激情在线一区| 久久精品免费电影| 精品国产区一区二区三区在线观看| 精品久久久在线观看| 成人免费网视频| 亚洲欧美色图片| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美乱大交xxxxx另类电影| 91高清视频免费观看| 国产91精品高潮白浆喷水| 91国偷自产一区二区三区的观看方式| 亚洲sss综合天堂久久| 国产精品爽黄69天堂a| 欧美在线激情网| 91精品视频免费看| 久久久午夜视频| 97免费视频在线| 91久久综合亚洲鲁鲁五月天| 欧美一级电影久久| 成人有码视频在线播放| 欧美一区二区三区四区在线| 亚洲视频在线观看视频| 欧美精品免费播放| 日韩av在线电影网| 亚洲专区国产精品| 精品毛片三在线观看| 尤物精品国产第一福利三区| 97精品久久久中文字幕免费| 午夜精品福利在线观看| 另类图片亚洲另类| 国产精品欧美一区二区三区奶水| 国产福利视频一区二区| 亚洲国产精品人久久电影| 久久久午夜视频| 国产欧美日韩中文字幕| 精品国产老师黑色丝袜高跟鞋| 国产日韩在线观看av| 成人xxxxx| 亚洲日本成人网| 成人激情在线播放| 欧美激情va永久在线播放| 国产成人精品免高潮在线观看| 欧美视频在线观看免费网址| 久久亚洲春色中文字幕| 日本久久久a级免费| 色偷偷偷亚洲综合网另类| 中日韩美女免费视频网站在线观看| 91精品久久久久久久久不口人| 在线播放精品一区二区三区| 成人性生交xxxxx网站| 欧美视频在线观看免费| 成人精品视频99在线观看免费| 国产69精品久久久久9| 国产精品视频内| 成人看片人aa| 久久视频中文字幕| 亚洲国产精品人久久电影| 曰本色欧美视频在线| 欧美与欧洲交xxxx免费观看| 91国在线精品国内播放| 日韩欧美中文第一页| 亚洲精品成人免费| 在线成人中文字幕| 精品国产依人香蕉在线精品| 国产一区二区视频在线观看| 日韩精品亚洲视频| 亚洲a一级视频| 国产91色在线| 菠萝蜜影院一区二区免费| 97在线看福利| 国产成人免费av电影| 国产精品福利观看| 性日韩欧美在线视频| 在线播放精品一区二区三区| 这里精品视频免费| 亚洲aa在线观看| 精品色蜜蜜精品视频在线观看| 日韩av在线一区| 国产精品视频免费在线| 久热精品视频在线观看一区| 国产精品永久免费观看| 欧美成人三级视频网站| 成人久久精品视频| 黑人巨大精品欧美一区二区一视频| 亚洲福利在线看| 欧美成人手机在线| 久久国内精品一国内精品| 亚洲精品国偷自产在线99热| 久久艹在线视频| 亚洲欧洲午夜一线一品| 欧美亚洲成人精品| 自拍偷拍亚洲精品| 成人av.网址在线网站| 三级精品视频久久久久|