共用方式為


逐步解說:使用自訂測試條件驗證預存程序的結果

更新:2010 年 12 月

在這個「擴充功能」(Feature Extension) 逐步解說中,您將建立「測試條件」(Test Condition) 以及建立「資料庫單元測試」(Database Unit Test) 來驗證其功能。 此程序包括為測試條件建立類別庫專案,然後簽署並註冊它。 如果您已有測試條件並想更新,請參閱 HOW TO:從舊版升級自訂測試條件

這個逐步解說將說明下列工作:

  1. 如何建立測試條件。

  2. 如何使用強式名稱簽署組件。

  3. 如何將必要的參考加入至專案。

  4. 如何建置擴充功能。

  5. 如何註冊新的擴充功能。

  6. 如何測試新的擴充功能。

必要條件

您必須安裝 Visual Studio Premium 或 Visual Studio Ultimate 才能完成本逐步解說。

建立自訂測試條件

首先,您將建立類別庫。

若要建立類別庫

  1. 按一下 [檔案] 功能表上的 [新增],然後按一下 [專案]。

  2. 在 [新增專案] 對話方塊的 [專案類型] 底下,按一下 [Visual C#]。

  3. 在 [範本] 底下,選取 [類別庫]。

  4. 在 [名稱] 文字方塊中輸入 ColumnCountCondition,然後按一下 [確定]。

下一步,您將會簽署專案。

若要簽署專案

  1. 按一下 [專案] 功能表上的 [ColumnCountCondition 屬性]。

  2. 選取 [簽署] 索引標籤上的 [簽署組件] 核取方塊。

  3. 在 [選擇強式名稱金鑰檔] 方塊中,按一下 [<新增>]。

    [建立強式名稱金鑰] 對話方塊隨即出現。

  4. 在 [金鑰檔名稱] 方塊中,輸入 SampleKey。

  5. 輸入並確認密碼,然後按一下 [確定]。

    當您建置方案時,會使用金鑰檔來簽署組件。

  6. 在 [檔案] 功能表上按一下 [全部儲存]。

  7. 在 [建置] 功能表上,按一下 [建置方案]。

接下來將必要參考加入至專案。

若要將適用的參考加入至專案

  1. 在 [方案總管] 中,選取 [ColumnCountCondition] 專案。

  2. 在 [專案] 功能表上,按一下 [加入參考]。

    [加入參考] 對話方塊隨即開啟。

  3. 選取 [.NET] 索引標籤。

  4. 在 [元件名稱] 欄中,找到下列元件:

    秘訣秘訣

    若要選取多個元件,請在按一下時同時按住 CTRL。

  5. 當完成選取所需的全部元件後,按一下 [確定]。

    選取的參考將出現在 [方案總管] 中專案的 [參考] 節點底下。

建立 ResultSetColumnCountCondition 類別

接下來,您會將 Class1 重新命名為 ResultSetColumnCountCondition,並從 TestCondition 衍生它。 ResultSetColumnCountCondition 類別是簡單的測試條件,會驗證 ResultSet 中傳回的資料行數目是否如您所預期。 您可以使用這個條件確認預存程序的合約是否正確。

若要立測試條件類別

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [Class1.cs],然後按一下 [重新命名],再輸入 ResultSetColumnCountCondition.cs。

  2. 按一下 [] 確認重新命名 Class1 的所有參考。

  3. 開啟 ResultSetColumnCountCondition.cs 檔並將下列 using 陳述式加入至檔案:

    using System;
    using System.Collections.Generic;
    using Microsoft.Data.Schema.UnitTesting;
    using Microsoft.Data.Schema.UnitTesting.Conditions;
    using Microsoft.Data.Schema.Extensibility;
    using System.ComponentModel;
    using System.Data;
    using System.Data.Common;
    using Microsoft.Data.Schema;
    
     
    namespace ColumnCountCondition
    {
        public class ResultSetColumnCountCondition
    
  4. TestCondition 衍生類別:

        public class ResultSetColumnCountCondition : TestCondition
    
  5. 加入 DatabaseSchemaProviderCompatibilityAttribute 屬性。 如需詳細資訊,請參閱使用自訂資料產生器產生特製化測試資料

    [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
       [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    

    這個測試條件同時具有兩個相容性屬性,以便:

    • 在有任何繼承自 DatabaseSchemaProvider 的資料庫結構描述提供者存在時,載入條件。 這會處理資料庫單元測試設計工具具有資料庫結構描述提供者內容的情況。 如果您想要讓測試條件專用於 SQL Server,可以改為指定 SqlDatabaseSchemaProvider。

    • 在沒有資料庫結構描述提供者存在時,載入測試條件。 當資料庫單元測試載入了沒有資料庫結構描述提供者的擴充功能,即會發生沒有資料庫結構描述提供者的情況。

  6. 加入 DisplayName 屬性:

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
            [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    
  7. 建立成員變數:

        {
            private int _resultSet;
            private int _count;
            private int _batch;
     
    
  8. 建立建構函式:

            public ResultSetColumnCountCondition()
            {
                _resultSet = 1;
                _count = 0;
                _batch = 1;
            }
     
    
  9. 覆寫 Assert 方法。 此方法包含 IDbConnection (表示資料庫的連接) 的引數以及 ExecutionResult。 此方法會使用 DataSchemaException 來處理錯誤。

            //method you need to override
            //to perform the condition verification
            public override void Assert(DbConnection validationConnection, ExecutionResult[] results)
            {
                //call base for parameter validation
                base.Assert(validationConnection, results);
     
                //verify batch exists
                if (results.Length < _batch)
                    throw new DataSchemaException(String.Format("Batch {0} does not exist", _batch));
     
                ExecutionResult result = results[_batch - 1];
     
                //verify resultset exists
                if (result.DataSet.Tables.Count < ResultSet)
                    throw new DataSchemaException(String.Format("ResultSet {0} does not exist", ResultSet));
     
                DataTable table = result.DataSet.Tables[ResultSet - 1];
     
                //actual condition verification
                //verify resultset column count matches expected
                if (table.Columns.Count != Count)
                    throw new DataSchemaException(String.Format(
                        "ResultSet {0}: {1} columns did not match the {2} columns expected",
                        ResultSet, table.Columns.Count, Count));
            }
     
    
  10. 加入下列會覆寫 ToString 方法的方法:

            //this method is called to provide the string shown in the
            //test conditions panel grid describing what the condition tests
            public override string ToString()
            {
                return String.Format(
                    "Condition fails if ResultSet {0} does not contain {1} columns",
                    ResultSet, Count);
            }
     
    
  11. 使用 CategoryAttributeDisplayNameAttributeDescriptionAttribute 屬性 (Attribute),加入下列測試條件屬性 (Property):

            //below are the test condition properties
            //that are exposed to the user in the property browser
            #region Properties
     
            //property specifying the resultset for which
            //you want to check the column count
            [Category("Test Condition")]
            [DisplayName("ResultSet")]
            [Description("ResultSet Number")]
            public int ResultSet
            {
                get { return _resultSet; }
     
                set
                {
                    //basic validation
                    if (value < 1)
                        throw new ArgumentException("ResultSet cannot be less than 1");
     
                    _resultSet = value;
                }
            }
     
            //property specifying
            //expected column count
            [Category("Test Condition")]
            [DisplayName("Count")]
            [Description("Column Count")]
            public int Count
            {
                get { return _count; }
     
                set
                {
                    //basic validation
                    if (value < 0)
                        throw new ArgumentException("Count cannot be less than 0");
     
                    _count = value;
                }
            }
     
            #endregion
        }
    }
    

最後的程式碼應如下所示:

using System;
using System.Collections.Generic;
using Microsoft.Data.Schema.UnitTesting;
using Microsoft.Data.Schema.UnitTesting.Conditions;
using Microsoft.Data.Schema.Extensibility;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Schema;

namespace ColumnCountCondition
{
DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
        [DatabaseSchemaProviderCompatibility(null)]

    [DisplayName("ResultSet Column Count")]
    public class ResultSetColumnCountCondition : TestCondition
    {
        private int _resultSet; 
        private int _count; 
        private int _batch; 

        public ResultSetColumnCountCondition()
        {
            _resultSet = 1; 
            _count = 0; 
            _batch = 1; 
        }

        //method you need to override
        //to perform the condition verification
        public override void Assert(DbConnection validationConnection, ExecutionResult[] results) 
        {
            //call base for parameter validation
            base.Assert(validationConnection, results); 

            //verify batch exists
            if (results.Length < _batch) 
                throw new DataException(String.Format("Batch {0} does not exist", _batch)); 

            ExecutionResult result = results[_batch - 1]; 

            //verify resultset exists
            if (result.DataSet.Tables.Count < ResultSet) 
                throw new DataException(String.Format("ResultSet {0} does not exist", ResultSet)); 

            DataTable table = result.DataSet.Tables[ResultSet - 1]; 

            //actual condition verification
            //verify resultset column count matches expected
            if (table.Columns.Count != Count) 
                throw new DataException(String.Format(
                    "ResultSet {0}: {1} columns did not match the {2} columns expected",
                    ResultSet, table.Columns.Count, Count)); 
        }
        //this method is called to provide the string shown in the
        //test conditions panel grid describing what the condition tests
        public override string ToString()
        {
            return String.Format(
                "Condition fails if ResultSet {0} does not contain {1} columns",
                ResultSet, Count); 
        }
         //below are the test condition properties
        //that are exposed to the user in the property browser
        #region Properties

        //property specifying the resultset for which
        //you want to check the column count
        [Category("Test Condition")]
        [DisplayName("ResultSet")]
        [Description("ResultSet Number")]
        public int ResultSet
        {
            get { return _resultSet; }
 
            set
            {
                //basic validation
                if (value < 1) 
                    throw new ArgumentException("ResultSet cannot be less than 1");
 
                _resultSet = value; 
            }
        }
 
        //property specifying
        //expected column count
        [Category("Test Condition")]
        [DisplayName("Count")]
        [Description("Column Count")]
        public int Count
        {
            get { return _count; }
 
            set
            {
                //basic validation
                if (value < 0) 
                    throw new ArgumentException("Count cannot be less than 0");
 
                _count = value; 
            }
        }
 
        #endregion
    }
}

下一步,您將會建置專案。

若要建置專案

  • 在 [建置] 功能表上,按一下 [建置方案]。

接下來,您將收集專案中產生的組件資訊,包括版本、文化特性和 PublicKeyToken。

若要收集組件資訊

  1. 按一下 [檢視] 功能表上的 [其他視窗],然後按一下 [命令視窗] 開啟 [命令視窗]。

  2. 在 [命令] 視窗中輸入下列程式碼。 將 FilePath 替代為已編譯之 .dll 檔案的路徑和檔案名稱。 請在路徑和檔案名稱周圍加上引號。

    注意事項注意事項

    根據預設,已編譯之 .dll 檔案的路徑為 <您的方案路徑>\bin\Debug 或 <您的方案路徑>\bin\Release。

    ? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
    
  3. 按 ENTER。 該行應該看起來如下,其中含有您的特定 PublicKeyToken:

    "ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
    

    標記或複製此組件資訊;此資訊將用於下一個程序。

接下來,您將使用在上一個程序中收集的組件資訊來建立 XML 檔案。

若要建立 XML 檔

  1. 在 [方案總管] 中,選取 [ColumnCountCondition] 專案。

  2. 在 [專案] 功能表中選取 [加入新項目]。

  3. 在 [範本] 窗格中,找出並選取 [XML 檔] 項目。

  4. 在 [名稱] 文字方塊中輸入 ColumnCountCondition.Extensions.xml,然後按一下 [加入] 按鈕。

    ColumnCountCondition.Extensions.xml 檔會加入至 [方案總管] 中的專案。

  5. 開啟並更新 ColumnCountCondition.Extensions.xml 檔,以與下列 XML 相符。 取代您在前面程序擷取的版本、文化特性和 PublicKeyToken。

    <?xml version="1.0" encoding="utf-8"?>
    <extensions assembly=""
                version="1" xmlns="urn:Microsoft.Data.Schema.Extensions"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
    
      <extension type="ColumnCountCondition.ResultSetColumnCountCondition" assembly="ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/>
    </extensions>
    
  6. 在 [檔案] 功能表上,按一下 [儲存]。

接下來,您會將組件資訊和 XML 檔複製到 Extensions 目錄。 當 Visual Studio 啟動時,它會識別和註冊 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目錄和子目錄中的任何擴充功能,以在工作階段中使用。

若要將組件資訊和 XML 檔複製到 Extensions 目錄

  1. 在 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ 目錄中建立名為 CustomConditions 的新資料夾。

  2. 將 ColumnCountCondition.dll 組件檔從輸出目錄 (預設為 My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\) 複製到您剛才建立的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions 目錄中。

  3. 將 ColumnCountCondition.Extensions.xml 檔 (預設在 My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\ 目錄中) 複製到您剛才建立的 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomConditions 目錄中。

    秘訣秘訣

    最佳做法是將擴充組件置於 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 目錄中的資料夾。 這有助您識別哪些擴充功能已包含在產品中,哪些是自訂建立的。 也建議使用資料夾,將擴充功能組織到特定類別。

接下來,您將啟動新的 Visual Studio 工作階段並建立資料庫專案。

若要啟動新的 Visual Studio 工作階段並建立資料庫專案

  1. 啟動第二個 Visual Studio 工作階段。

  2. 按一下 [檔案] 功能表上的 [新增],然後按一下 [專案]。

  3. 在 [新增專案] 對話方塊的 [已安裝的範本] 清單中,展開 [資料庫] 節點,然後按一下 [SQL Server]。

  4. 按一下詳細資料窗格中的 [SQL Server 2008 資料庫專案]。

  5. 在 [名稱] 文字方塊中輸入 SampleConditionDB,然後按一下 [確定]。

接下來,您將建立單元測試。

若要在新的測試類別內建立資料庫單元測試

  1. 在 [測試] 功能表上按一下 [新增測試]。

    注意事項注意事項

    您也可以開始 [方案總管]以滑鼠右鍵按一下測試專案,然後指向 [加入],再按一下 [新增測試]。

    [加入新測試] 對話方塊隨即出現。

  2. 按一下 [範本] 清單中的 [資料庫單元測試]。

  3. 在 [測試名稱] 中輸入 SampleUnitTest。

  4. 按一下 [加入至測試專案] 中的 [建立新的 Visual C# 測試專案]。

  5. 按一下 [確定]。

    [新增測試專案] 對話方塊隨即出現。

  6. 輸入 SampleUnitTest 做為專案名稱。

  7. 按一下 [取消] 即可建立單元測試,而不設定測試專案使用資料庫連接。

    注意事項注意事項

    如需建立和設定具有資料庫連接的資料庫單元測試,請參閱 HOW TO:建立空白資料庫單元測試

    您的空白測試便會出現在 [資料庫單元測試設計工具] 中。 Visual C# 原始程式碼檔會加入至測試專案。

  8. 按一下 [按一下此處以建立] 完成建立單元測試。

最後,您將查看顯示在 SQL Server 專案中的新條件。

若要檢視新條件

  1. 在 [資料庫單元測試設計工具] 的 [測試條件] 底下,按一下 [名稱] 欄底下的 inconclusiveCondition1 測試。

  2. 按一下 [刪除測試條件] 工具列按鈕移除 inconclusiveCondition1 測試。

  3. 按一下 [測試條件] 下拉式清單,然後選取 [ResultSet 資料行計數]。

  4. 按一下 [加入測試條件] 工具列按鈕,加入您的自訂測試條件。

  5. 在 [屬性] 視窗中,設定 [Count]、[Enabled] 和 [ResultSet] 屬性。

    如需詳細資訊,請參閱 HOW TO:將測試條件加入到資料庫單元測試

請參閱

工作

HOW TO:建立資料庫單元測試設計工具的測試條件

HOW TO:註冊和管理功能擴充

概念

建立和定義資料庫單元測試

其他資源

管理組件和資訊清單簽署

變更記錄

日期

記錄

原因

2010 年 12 月

小幅修正最後的程式碼 (屬性),以處理客戶回函。

客戶回函。