الإرشادات التفصيلية: DA0506:

في هذه معاينة، إنشاء الإجراءات المخزنة على وحدة قاعدة بيانات اختبار تتحقق من سلوك العديد. تقوم بإنشاء قاعدة بيانات اختبارات الوحدة تعليمات في التعرف على تعليمات برمجية العيوب التي قد تتسبب في حدوث سلوك تطبيق غير صحيح. يمكنك تشغيل اختبارات الوحدة قاعدة بيانات و تطبيق الاختبارات كجزء من مجموعة بسعر خاص من الاختبارات التلقائية.

في هذه الإرشادات التفصيلية, تؤدى المهام التالية:

  • إنشاء برنامج نصي الذي يحتوي على مخطط قاعدة بيانات

  • إنشاء مشروع قاعدة بيانات و استيراد المخطط

  • نشر مشروع قاعدة بيانات إلى معزول بيئة التطوير

  • إنشاء قاعدة بيانات وحدة الاختبارات

  • تعريف اختبار منطق

  • قم بتشغيل الاختبارات وحدة قاعدة بيانات

  • قم بإضافة اختبار وحدة سالبة

بعد واحد الاختبارات وحدة بالكشف عن خطأ في إجراء مخزّن، تقوم بتصحيح هذا الخطأ و إعادة تشغيل الاختبار الخاصة بك.

المتطلبات الأساسية

إلى اكتمال هذه معاينة، فيجب أن تكون قادراً تشغيل إلى يعيّن إلى ملقم قاعدة بيانات حيث تملك أذونات إلى إنشاء ونشر قاعدة بيانات. لمزيد من المعلومات، راجع Unit Tests و C++, عام, و ويب الخدمات.

إنشاء البرنامج نصي الذي يحتوي على مخطط قاعدة بيانات

إلى إنشاء برنامج نصي التي يمكن استيراد مخطط

  1. من قائمة ملف، أشر إلى جديد، ثم انقر فوق ملف.

    يظهر صندوق الحوار ملف جديد.

  2. في lهوt فئات ، انقر فوق عام إذا أنه هو المميزة بالفعل.

  3. في القائمة قوالب ، انقر فوق ملف Sql، و ثم انقر فوق فتح.

    Transact-SQLفتح محرر.

  4. قم بنسخ ما يلي Transact-SQLالتعليمة البرمجية، و لصقه في Transact-SQLالمحرر.

    PRINT N'Creating Sales...';
    GO
    CREATE SCHEMA [Sales]
        AUTHORIZATION [dbo];
    GO
    PRINT N'Creating Sales.Customer...';
    GO
    CREATE TABLE [Sales].[Customer] (
        [CustomerID]   INT           IDENTITY (1, 1) NOT NULL,
        [CustomerName] NVARCHAR (40) NOT NULL,
        [YTDOrders]    INT           NOT NULL,
        [YTDSales]     INT           NOT NULL
    );
    GO
    PRINT N'Creating Sales.Orders...';
    GO
    CREATE TABLE [Sales].[Orders] (
        [CustomerID] INT      NOT NULL,
        [OrderID]    INT      IDENTITY (1, 1) NOT NULL,
        [OrderDate]  DATETIME NOT NULL,
        [FilledDate] DATETIME NULL,
        [Status]     CHAR (1) NOT NULL,
        [Amount]     INT      NOT NULL
    );
    GO
    PRINT N'Creating Sales.Def_Customer_YTDOrders...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [Def_Customer_YTDOrders] DEFAULT 0 FOR [YTDOrders];
    GO
    PRINT N'Creating Sales.Def_Customer_YTDSales...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [Def_Customer_YTDSales] DEFAULT 0 FOR [YTDSales];
    GO
    PRINT N'Creating Sales.Def_Orders_OrderDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [Def_Orders_OrderDate] DEFAULT GetDate() FOR [OrderDate];
    GO
    PRINT N'Creating Sales.Def_Orders_Status...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [Def_Orders_Status] DEFAULT 'O' FOR [Status];
    GO
    PRINT N'Creating Sales.PK_Customer_CustID...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [PK_Customer_CustID] PRIMARY KEY CLUSTERED ([CustomerID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
    GO
    PRINT N'Creating Sales.PK_Orders_OrderID...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [PK_Orders_OrderID] PRIMARY KEY CLUSTERED ([OrderID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
    GO
    PRINT N'Creating Sales.FK_Orders_Customer_CustID...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [FK_Orders_Customer_CustID] FOREIGN KEY ([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) ON DELETE NO ACTION ON UPDATE NO ACTION;
    GO
    PRINT N'Creating Sales.CK_Orders_FilledDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [CK_Orders_FilledDate] CHECK ((FilledDate >= OrderDate) AND (FilledDate < '01/01/2020'));
    GO
    PRINT N'Creating Sales.CK_Orders_OrderDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [CK_Orders_OrderDate] CHECK ((OrderDate > '01/01/2005') and (OrderDate < '01/01/2020'));
    GO
    PRINT N'Creating Sales.uspCancelOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspCancelOrder]
    @OrderID INT
    AS
    BEGIN
    DECLARE @Delta INT, @CustomerID INT
    BEGIN TRANSACTION
        SELECT @Delta = [Amount], @CustomerID = [CustomerID]
         FROM [Sales].[Orders] WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Orders]
       SET [Status] = 'X'
    WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Customer]
       SET
       YTDOrders = YTDOrders - @Delta
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    END
    GO
    PRINT N'Creating Sales.uspFillOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspFillOrder]
    @OrderID INT, @FilledDate DATETIME
    AS
    BEGIN
    DECLARE @Delta INT, @CustomerID INT
    BEGIN TRANSACTION
        SELECT @Delta = [Amount], @CustomerID = [CustomerID]
         FROM [Sales].[Orders] WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Orders]
       SET [Status] = 'F',
           [FilledDate] = @FilledDate
    WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Customer]
       SET
       YTDSales = YTDSales - @Delta
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    END
    GO
    PRINT N'Creating Sales.uspNewCustomer...';
    GO
    CREATE PROCEDURE [Sales].[uspNewCustomer]
    @CustomerName NVARCHAR (40)
    AS
    BEGIN
    INSERT INTO [Sales].[Customer] (CustomerName) VALUES (@CustomerName);
    SELECT SCOPE_IDENTITY()
    END
    GO
    PRINT N'Creating Sales.uspPlaceNewOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspPlaceNewOrder]
    @CustomerID INT, @Amount INT, @OrderDate DATETIME, @Status CHAR (1)='O'
    AS
    BEGIN
    DECLARE @RC INT
    BEGIN TRANSACTION
    INSERT INTO [Sales].[Orders] (CustomerID, OrderDate, FilledDate, Status, Amount) 
         VALUES (@CustomerID, @OrderDate, NULL, @Status, @Amount)
    SELECT @RC = SCOPE_IDENTITY();
    UPDATE [Sales].[Customer]
       SET
       YTDOrders = YTDOrders + @Amount
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    RETURN @RC
    END
    GO
    CREATE PROCEDURE [Sales].[uspShowOrderDetails]
    @CustomerID INT=0
    AS
    BEGIN
    SELECT [C].[CustomerName], CONVERT(date, [O].[OrderDate]), CONVERT(date, [O].[FilledDate]), [O].[Status], [O].[Amount]
      FROM [Sales].[Customer] AS C
      INNER JOIN [Sales].[Orders] AS O
         ON [O].[CustomerID] = [C].[CustomerID]
      WHERE [C].[CustomerID] = @CustomerID
    END
    GO
    
  5. في قائمة ملف ، انقر فوق كـ حفظ SqlQuery_1.sql .

    يظهر مربع الحوار حفظ بإسم.

  6. في كائن اسم الكائن، نوع من SampleImportScript.sql.

    يمكنك حفظ ملف إلى أي الموقع تشغيل جهاز الكمبيوتر الخاص بك. دون الموقع حيث يجب استخدام هذا برنامج نصي في إجراء التالي.

  7. انقر فوق حفظ.

  8. في قائمة ملف ، انقر فوق الحل إغلاق.

    القادمة التي تاريخ الإنشاء مشروع قاعدة بيانات واستيراد المخطط من وجود تاريخ الإنشاء d برنامج نصي.

إنشاء قاعدة بيانات مشروع واستيراد مخطط

إلى إنشاء مشروع قاعدة بيانات

  1. في قائمة ملف ، أشر إلى جديد ، و انقر مشروع.

    يظهر مربع الحوار مشروع جديد.

  2. تحت المثبتة قوالب ، توسيع العقدة قاعدة بياناتثم ثم انقر فوق من SQL الخادم.

    ملاحظة

    إذا كنت تستخدم Visual Studio 2010 Professional، بدلاً من البحث ضمن القوالب المثبتة، المتوقعة و عقده قاعدة بياناتعلى ، المتوقعة و العقدة SQL الخادم ، و ثم انقر فوق خيارات متقدمة.

  3. في قائمة القوالب، انقر فوق مشروع قاعدة بيانات في SQL الخادم 2008.

    ملاحظة

    إذا كنت تريد نشر قاعدة البيانات الخاصة بك إلى الإصدار قاعدة بيانات أخرى، بدلاً من ذلك باختيار القالب المتوافق مع الخادم الهدف الخاص بك.

  4. في الاسم، اكتب SimpleUnitTestDB.

  5. تحديد خانة اختيار إنشاء الدليل للحل إذا ليس محدداً بالفعل.

  6. مسح خانة اختيار إضافة إلى "عنصر تحكم المصدر" إذا كان ذلك هو الفعل محددة، وانقر فوق ‏‏موافق .

    يتم تاريخ الإنشاء مشروع قاعدة بيانات و تظهر في من مستكشف الحلول. التالي استيراد مخطط قاعدة بيانات من برنامج نصي.

إلى استيراد مخطط قاعدة بيانات من برنامج نصي

  1. في قائمة مشروع ، انقر فوق يستورد برنامج نصي.

  2. انقر فوق التالي بعد أن قمت بقراءة صفحة "الترحيب".

  3. انقر فوق استعراض، وقم بالإشارة إلى مسار الموقع قمت بحفظها في SampleImportScript.sql ملف.

  4. انقر نقراً مزدوجاً فوق الملف SampleImportScript.sql، و انقر فوق إنهاء.

    برنامج نصي هو استيرادها، والكائنات التي تم تعريفها بحيث يتم إضافة برنامج نصي إلى قاعدة بيانات مشروع.

  5. قم بمراجعة التلخيص، ومن ثم انقر فوق إنهاء إلى إتمام تشغيل.

    ملاحظة

    يحتوي إجراء Sales.uspFillOrder خطأ ترميز المتعمدة فسوف تكتشف و الصحيح فيما بعد في هذا إجراء.

إلى فحص مشروع الناتج

  1. في من مستكشف الحلول، توسيع العقدة التابعة مخطط الكائنات.

  2. استكشف عقد فرعية ضمن العقدة مخطط الكائنات في هيكلي.

    مستكشف الحلول يحتوي على ملفات الذي تعريف الكائنات قاعدة بيانات.

  3. من قائمة عرض ، انقر فوق عرض مخطط قاعدة بيانات.

  4. في عرض مخطط ، توسيع العقدة SimpleUnitTestDB.

  5. استكشف العقد الفرعية تحت عقدة SimpleUnitTestDB في هيكلي.

    عرض مخطط يحتوي على الكائنات التي تم تعريفها في الملفات التي تظهر في من مستكشف الحلول.

نشر معزول تطوير بيئة

بعد ذلك تقوم بنشر مشروع لإنشاء قاعدة بيانات يحتوي على المخطط الذي تم استيراده ولكن لا توجد أية بيانات. إنشاء قاعدة بيانات هذه في بيئة تطوير معزولة (أو sandbox) حيث يمكنك تطوير واختبار قاعدة بيانات مع لا تداخل من المحاولات الأخرى.

إلى تكوين وبنية مشروع قاعدة بيانات

  1. من مستكشف الحل، انقر فوق مشروع قاعدة بيانات SimpleUnitTestDB.

  2. تشغيل انقر قائمة مشروع خصائص SimpleUnitTestDB.

    الخصائص صندوق حوار لظهور مشروع.

  3. انقر فوق علامة تبويب نشر.

  4. في القائمة إعدادات تكوين توزيع ، انقر فوق الخاصة بي معزول بيئة التطوير . بواسطة تكوين إعدادات لبيئة التطوير معزولة الخاص بك، يمكنك استخدام إعدادات نشر مختلفة عن تلك التي سيتم استخدامها في البريد البيئات الأخرى، مثل كـ الالخادم التدريج أو الإنتاج.

  5. في إجراء توزيع قائمة, انقر فوق إنشاء برنامج نصي لنشر (.sql) وتوزيع إلى قاعدة بيانات.

  6. في إعدادات قاعدة بيانات الهدف، انقر فوق تحرير.

    يظهر مربع الحوارخصائص الإتصال.

  7. قم بتعيين خصائص اتصال قاعدة بيانات الذي تريده إلى إنشاء، ومن ثم انقر فوق ‏‏موافق .

    في صندوق اتصال الهدف، الصحيح اتصال تظهر سلسلة.

    ملاحظة تنبيهتنبيه

    يجب إنشاء قاعدة بيانات تشغيل خادم اختبار، الخادم تطوير، أو تشغيل كمبيوتر محلي. يجب عدم تحديد خادم الإنتاج الخاص بك.

  8. في من اسم قاعدة بيانات الهدف، اكتب SimpleUnitTestDB.

  9. التالي إلى نشر ملف تكوين، انقر فوق تحرير.

  10. مسح منع توزيع المتزايد إذا قد يحدث فقدان بيانات فحص صندوق.

    ملاحظة

    لهذه معاينة، سيتم اختبار الإجراءات المخزنة مع databكـe فارغ التي قمت بنشر كـ جزءا من اختبار الوحدة databكـe. لم يكن إلى الاحتفاظ بأية بيانات موجودة لأنه سيتم اختبار الإجراءات sإلىred في بيئة تطوير معزول.

  11. من القائمة ملف، انقر فوق حفظ الكل.

  12. من القائمة Build (إنشاء)، انقر فوق Build Solution (إنشاء الحل).

    تحديد الخصائص التي قمت بتعيينها فقط كيف يتم إنشاء برنامج نصي للنشر. حالة الإنشاء يظهر في نافذة إخراج و الإنشاء: يجب أن تظهر up-إلى-date كآخر سطر أو 1 بنجاح.

    ملاحظة

    في حالة عدم ظهور الإطار إخراج ، افتح قائمة عرض و انقر فوق الإخراج.

إلى نشر مشروع قاعدة بيانات

  1. من مستكشف الحل، انقر فوق مشروع قاعدة بيانات SimpleUnitTestDB.

  2. من قائمة بنية ، انقر فوق نشر SimpleUnitTestDB.

    ملاحظة تنبيهتنبيه

    يجب تشغيل هذا توزيع مقابل اختبار الخادم، تطوير الخادم، أو على كمبيوتر محلي. يجب عدم تحديد خادم الإنتاج الخاص بك.

    مشروع قاعدة بيانات هو نشر إلى قاعدة بيانات جديدة. حالة توزيع يظهر في نافذة إخراج و التوزيع: يجب أن تظهر نجاح 1 كـ الخط lكـt. قد تقوم بتعريف على الخطة الجيل البيانات إلى إنشاء بيانات اختبار في قاعدة بيانات الخاصة بك. لهذه معاينة، الذي تختبره التي لا تحتاج إلى توليد بيانات قاعدة بيانات بسيطة جداً.

إنشاء قاعدة بيانات اختبارات الوحدة

إلى إنشاء اختبار وحدة قاعدة بيانات للحصول على إجراءات sإلىred

  1. في قائمة عرض ، انقر فوق عرض مخطط قاعدة بيانات.

  2. في عرض مخطط، المتوقعة و عقدة رسوم تخطيطية ، المتوقعة و عقدة مبيعات ، المتوقعة و العقدة قابلية البرمجة ، و المتوقعة و العقدة إجراءات مخزنة.

  3. انقر نقراً مزدوجاً فوق uspNewCustomer إجراء مخزّن، انقر فوق إنشاء اختبارات الوحدة.

    إنشاء اختبارات وحدة صندوق حوار تظهر.

  4. تحديد فحص مربعات لكافة الإجراءات المخزنة خمسة: Sales.uspCancelOrder Sales.uspFillOrder، Sales.uspNewCustomer ، Sales.uspPlaceNewOrder و Sales.uspShowOrderDetails .

  5. في المشروع، انقر فوق إنشاء Visual C# اختبار مشروع جديد.

  6. قبول الأسماء الافتراضية لاسم مشروع و اسم الفئة، و انقر فوق ‏‏موافق .

    يظهر صندوق الحوار تكوين مشروع 'TestProject1'.

  7. في ينفذ اختبارات الوحدة باستخدام اتصال البيانات التالي، حدد اتصال إلى قاعدة بيانات التي تقوم بنشرها سابقا في هذه معاينة.

    ملاحظة

    إذا كان يجب عليك اختبار طرق العرض أو إجراءات مخزنة الذي يقوم بتقييد أذونات، فستقوم عادة بتعيين هذا الاتصال في هذه الخطوة. هل ثم حدد الاتصال الثانوية، مع أذونات أوسع للتحقق من صحة اختبار. إذا كان لديك اتصال بيانات ثانوي، يجب إضافة هذا مستخدم إلى مشروع قاعدة بيانات، و إنشاء تسجيل دخول الخاصة بذلك مستخدم في برنامج نصي لما قبل توزيع.

  8. في توزيع، تحديد تلقائياً نشر مشروع قاعدة بيانات قبل الوحدة التي يتم تشغيل الاختبارات خانة اختيار.

  9. في مشروع قاعدة بيانات، انقر فوق من SimpleUnitTestDB.dbproj.

  10. في تكوين توزيع، انقر فوق التصحيح.

    قد أيضا توليد بيانات اختبار كجزء من اختبارات وحدة قاعدة بيانات الخاصة بك. لهذه معاينة، سيتم تخطي هذه الخطوة لأن الاختبارات سينشئ بيانات الخاصة بهم.

  11. انقر فوق موافق.

    بناء مشروع اختبار و يظهر "مصمم اختبار وحدة قاعدة بيانات". بعد ذلك، سيتم تحديث منطق الاختبار في Transact-SQLبرنامج نصي من اختبارات الوحدة.

قم بتعريف اختبار المنطق

قاعدة بيانات هذه بسيطة جداً على جدولين، و طلب العميل. تحديث قاعدة بيانات باستخدام الإجراءات المخزنة التالية:

  • uspNewCustomer-هذا إجراء مخزّن إضافة سجل إلى جدول "العميل"، والذي يقوم بتعيين أعمدة YTDOrders و YTDSales الخاص بالعميل إلى الصفر.

  • uspPlaceNewOrder-هذا بتخزين إجراء إضافة سجل إلى الجدول Orders (الطلبيات) للعميل المحدد وقم بتحديث القيمة YTDOrders تشغيل السجل المناظر في جدول العميل.

  • uspFillOrder-هذا إجراء مخزّن قم بتحديث سجل في الجدول Orders (الطلبيات) بتغيير حالة من ' O' 'ب' وزيادة المقدار YTDSales في السجل المناظر في جدول العميل.

  • uspCancelOrder-هذا إجراء مخزّن قم بتحديث سجل في الجدول Orders (الطلبيات) بتغيير حالة من ' O' إلى المقدار 'X' و decrements YTDOrders في السجل المناظر في جدول العميل.

  • uspShowOrderDetails-هذا إجراء مخزّن انضمام الجدول Orders (الطلبيات) بجدول مخصص وتظهر السجلات لعميل بعينه.

ملاحظة

يوضح هذا المثال كيفية إلى إنشاء اختبار وحدة قاعدة بيانات بسيطة. في قاعدة بيانات حقيقية، قد جمع إجمالي مقدار الجميع الطلبات باستخدام حالة ' O' أو 'ب' لمعينه العميل. تتضمن الإجراءات المذكورة في هذه معاينة أيضا لا معالجة الأخطاء. ل مثال، فإنها لم تمنع لك من استدعاء uspFillOrder لترتيب الذي تم مسبقاً تم تعبئتها.

الاختبارات بافتراض أن يبدأ قاعدة بيانات في الولاية نظيفة. يتم إنشاء الاختبارات التي تتحقق من الشروط التالية:

  • uspNewCustomer-التحقق من أن الجدول العميل يحتوي على صف واحد بعد تشغيل إجراء المخزن.

  • uspPlaceNewOrder-العميل لديه معرف العميل 1، قم بوضع ترتيب ل 100 ر. س. تأكد من أن الحد YTDOrders لهذا العميل هو 100 و أن الحد YTDSales هو صفر.

  • uspFillOrder-العميل لديه معرف العميل 1، قم بوضع ترتيب ل 50 ر. س. تعبئة التي ترتيب. تحقق من أن كميات YTDOrders و YTDSales كل من 50.

  • uspShowOrderDetails-بالنسبة للعميل الذي لديه معرف عميل طلبات مكان 1، 100 ر. س و 50 ر. س و $ 5. تحقق من ذلك uspShowOrderDetails بإرجاع عدد أعمدة الموجودة يمين و أن يحتوي على مجموعة النتائج المتوقعة المجموع الاختياري.

ملاحظة

لكامل التعيين التحقق من الاختبارات وحدة قاعدة بيانات، قد عادة من أعمدة غير ذلك تم التعيين بشكل صحيح. إلى الاحتفاظ بهذه معاينة بحجم يمكن إدارتها، فإنه لم يتم توضيح كيفية إلى التحقق من سلوك uspCancelOrder.

إلى كتابة وحدة قاعدة بيانات اختبار uspNewCusإلىmer

  1. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspNewCustomerTest، وتأكد من أن الاختبار هو المميزة في lهوt المجاورة.

    بعد تنفيذ الخطوة السابقة، يمكنك إنشاء برنامج نصي للاختبار لإجراء الاختبار في اختبار وحدة.

  2. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    -- database unit test for Sales.uspNewCustomer
    DECLARE @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @CustomerName = 'Fictitious Customer';
    
    EXECUTE @RC = [Sales].[uspNewCustomer] @CustomerName;
    
    SELECT * FROM [Sales].[Customer];
    
  3. في الجزء اختبار الشروط ، انقر فوق الشرط الاختبار Inconclusive، و ثم انقر فوق يحذف شرط اختبار (x).

  4. في الجزء شروط الاختبار ، انقر فوق عدد الصف في قائمة، ثم انقر فوق إضافة شرط الاختبار (+).

  5. في الإطار خصائص التعيين خاصية عدد الصفوف إلى 1.

  6. من القائمة ملف، انقر فوق حفظ الكل.

    التالي تحديد منطق اختبار الوحدة ل uspPlaceNewOrder.

إلى كتابة وحدة قاعدة بيانات اختبار uspPlaceNewOrder

  1. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspPlaceNewOrderTest، وتأكد من أن الاختبار هو المميزة في lهوt المجاورة.

    بعد إجراء هذه الخطوة، يمكنك إنشاء برنامج نصي للاختبار لإجراء الاختبار في اختبار وحدة.

  2. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    -- database unit test for Sales.uspPlaceNewOrder
    DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1);
    DECLARE @CustomerName AS NVARCHAR(40);
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @OrderDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- place an order for that customer
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status;
    
    -- verify that the YTDOrders value is correct.
    SELECT @RC = [YTDOrders] FROM [Sales].[Customer] WHERE [CustomerID] = @CustomerID
    
    SELECT @RC AS RC
    
  3. في الجزء اختبار الشروط ، انقر فوق الشرط الاختبار Inconclusive، و انقر فوق يحذف شرط اختبار (x).

  4. في الجزء شروط الاختبار ، انقر فوق قيمة Scalar في قائمة، ثم انقر فوق إضافة شرط الاختبار (+).

  5. في الإطار خصائص ، قم بتعيين خاصية القيمة المتوقعة إلى 100.

  6. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspPlaceNewOrderTest، وتأكد من أن من Pre-Test هو المميزة في lهوt المجاورة.

    بعد تنفيذ th هو الخطوة، يمكنك تحديد عبارات وضع بيانات في الالولاية التي هو المطلوبة لتنفيذ الاختبار الخاصة بك. على سبيل المثال، يجب أن إنشاء سجل العميل قبل أن يمكنك وضع طلب.

  7. انقر فوق انقر هنا ل إنشاء إلى إنشاء pre-اختبار برنامج نصي.

  8. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    /*
    Add Transact-SQL statements here that you want to run before
    the test script is run.
    */
    -- Add a customer for this test with the name 'Fictitious Customer'
    DECLARE @NewCustomerID AS INT, @CustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @NewCustomerID = 0,
       @CustomerID = 0,
           @CustomerName = N'Fictitious Customer';
    
    IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName)
    BEGIN
    EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName;
    END
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields
    DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
    
  9. من القائمة ملف، انقر فوق حفظ الكل.

    بعد ذلك تقوم بإنشائها اختبار وحدة ل uspFillOrder.

إلى كتابة وحدة قاعدة بيانات اختبار uspFillOrder

  1. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspFillOrderTest، وتأكد من أن الاختبار هو المميزة في lهوt المجاورة.

    بعد إجراء هذه الخطوة، يمكنك إنشاء برنامج نصي للاختبار لإجراء الاختبار في اختبار وحدة.

  2. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    -- database unit test for Sales.uspFillOrder
    DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1);
    DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT;
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @OrderID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @FilledDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    -- Get the most recently added order.
    SELECT @OrderID = MAX([OrderID]) FROM [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    
    -- fill an order for that customer
    EXECUTE @RC = [Sales].[uspFillOrder] @OrderID, @FilledDate;
    
    -- verify that the YTDOrders value is correct.
    SELECT @RC = [YTDSales] FROM [Sales].[Customer] WHERE [CustomerID] = @CustomerID
    
    SELECT @RC AS RC;
    
  3. في الجزء اختبار الشروط ، انقر فوق الشرط الاختبار Inconclusive، و انقر فوق يحذف شرط اختبار (x).

  4. في الجزء شروط الاختبار ، انقر فوق قيمة Scalar في قائمة، ثم انقر فوق إضافة شرط الاختبار (+).

  5. في الإطار خصائص ، قم بتعيين خاصية القيمة المتوقعة إلى 100.

  6. في شريط التنقل في "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspFillOrderTest، وتأكد من أن يتم تمييز هذه من Pre-Test في القائمة المجاورة. بعد تنفيذ th هو الخطوة، يمكنك تحديد عبارات وضع بيانات في الالولاية التي هو المطلوبة لتنفيذ الاختبار الخاصة بك. على سبيل المثال، يجب أن إنشاء سجل العميل قبل أن يمكنك وضع طلب.

  7. انقر فوق انقر هنا ل إنشاء إلى إنشاء pre-اختبار برنامج نصي.

  8. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    /*
    Add Transact-SQL statements here that you want to run before
    the test script is run.
    */
    BEGIN TRANSACTION
    
    -- Add a customer for this test with the name 'CustomerB'
    DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @NewCustomerID = 0,
           @CustomerName = N'Fictitious Customer';
    
    IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName)
    BEGIN
    EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName;
    END
    
    DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1);
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @OrderDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields
    DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
    
    -- place an order for that customer
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status;
    
    COMMIT TRANSACTION
    
  9. من القائمة ملف، انقر فوق حفظ الكل.

    عند هذه النقطة، تكون جاهزاً إلى تشغيل الاختبارات الخاصة بك.

لكتابة وحدة قاعدة بيانات اختبار uspShowOrderDetails

  1. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspShowOrderDetailsTest، وتأكد من أن الاختبار هو المميزة في lهوt المجاورة.

    بعد إجراء هذه الخطوة، يمكنك إنشاء برنامج نصي للاختبار لإجراء الاختبار في اختبار وحدة.

  2. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    -- database unit test for Sales.uspFillOrder
    DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1);
    DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT;
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @OrderID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @FilledDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- fill an order for that customer
    EXECUTE @RC = [Sales].[uspShowOrderDetails] @CustomerID;
    
    SELECT @RC AS RC;
    
  3. في الجزء اختبار الشروط ، انقر فوق الشرط الاختبار Inconclusive، و انقر فوق يحذف شرط اختبار (x).

  4. في الجزء شروط الاختبار ، انقر فوق مخطط المتوقع في قائمة، ثم انقر فوق إضافة شرط الاختبار (+).

  5. في خصائص نافذة، في خاصية تكوين ، انقر فوق الزر "استعراض" (' ').

  6. في تكوين ل expectedSchemaCondition1 صندوق حوار، قم بتحديد اتصال بقاعدة بيانات الخاصة بك.

  7. انقر فوق استرداد.

    Transact-SQLالأساسي الخاص بك لاختبار الوحدة هو التنفيذ، ويظهر المخطط الناتج في صندوق الحوار. نظراً لعدم تنفيذ التعليمة البرمجية pre-اختبار، لا توجد بيانات هو التي يتم إرجاعها. كما فقط مراجعة المخطط وليس بيانات، ترتيب هو هو جيد.

  8. انقر فوق موافق.

    المخطط المتوقع هو المخزنة باختبار الشرط.

  9. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspShowOrderDetailsTest، وتأكد من أن من Pre-Test هو المميزة في lهوt المجاورة. بعد تنفيذ th هو الخطوة، يمكنك تحديد عبارات وضع بيانات في الالولاية التي هو المطلوبة لتنفيذ الاختبار الخاصة بك. على سبيل المثال، يجب أن إنشاء سجل العميل قبل أن يمكنك وضع طلب.

  10. انقر فوق انقر هنا ل إنشاء إلى إنشاء pre-اختبار برنامج نصي.

  11. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    /*
    Add Transact-SQL statements here that you want to run before
    the test script is run.
    */
    BEGIN TRANSACTION
    
    -- Add a customer for this test with the name 'FictitiousCustomer'
    DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @NewCustomerID = 0,
           @CustomerName = N'Fictitious Customer';
    
    IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName)
    BEGIN
    EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName;
    END
    
    
    DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1);
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @CustomerName = N'Fictitious Customer',
           @OrderDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields
    DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
    
    -- place 3 orders for that customer
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 100, @OrderDate, @Status;
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 50, @OrderDate, @Status;
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 5, @OrderDate, @Status;
    
    COMMIT TRANSACTION
    
  12. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspShowOrderDetailsTest، وانقر فوق اختبار في متجاورة قائمة.

    يجب أن تفعل ذلك لأنك ترغب في إلى يطبق الشرط مجموع اختباري إلى الاختبار، لا إلى pre-اختبار.

  13. في الجزء شروط الاختبار ، انقر فوق مجموع اختباري للبيانات في القائمة، و ثم انقر فوق إضافة شرط الاختبار (+).

  14. في خصائص نافذة، في خاصية تكوين ، انقر فوق الزر "استعراض" (' ').

  15. في تكوين ل checksumCondition1 صندوق حوار، قم بتحديد اتصال بقاعدة بيانات الخاصة بك.

  16. باستبدال Transact-SQLفي صندوق الحوار بما يلي تعليمات برمجية:

    BEGIN TRANSACTION
    
    -- Add a customer for this test with the name 'CustomerB'
    DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @NewCustomerID = 0,
           @CustomerName = N'Fictitious Customer';
    
    IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName)
    BEGIN
    EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName;
    END
    
    
    DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @Status AS CHAR (1);
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @CustomerName = N'Fictitious Customer',
           @OrderDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields
    DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
    
    
    
    -- place 3 orders for that customer
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 100, @OrderDate, @Status;
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 50, @OrderDate, @Status;
    EXECUTE @RC = [Sales].[uspPlaceNewOrder] @CustomerID, 5, @OrderDate, @Status;
    
    
    COMMIT TRANSACTION
    
    
    -- database unit test for Sales.uspFillOrder
    DECLARE @FilledDate AS DATETIME;
    DECLARE @OrderID AS INT;
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @OrderID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @FilledDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- fill an order for that customer
    EXECUTE @RC = [Sales].[uspShowOrderDetails] @CustomerID;
    
    SELECT @RC AS RC;
    

    تضم هذه التعليمة البرمجية Transact-SQLالتعليمة البرمجية من pre-test مع Transact-SQLمن اختبار نفسه. تحتاج كل منهما بإرجاع نفس نتائج التي اختبار إلى إرجاع عندما تقوم بتشغيله.

  17. انقر فوق استرداد.

    Transact-SQLالتي حددتها هو تنفيذه، والمجموع الاختباري هو حسابه من أجل البيانات التي يتم إرجاعها.

  18. انقر فوق موافق.

    مجموع اختباري محسوب هو المخزنة باختبار الشرط. يظهر مجموع اختباري المتوقعة في العمود القيمة "مجموع اختباري للبيانات" اختبار الشرط.

  19. من القائمة ملف، انقر فوق حفظ الكل.

    عند هذه النقطة، تكون جاهزاً إلى تشغيل الاختبارات الخاصة بك.

قم بتشغيل اختبارات وحدة قاعدة بيانات

إلى تشغيل الاختبارات وحدة قاعدة بيانات

  1. في قائمة اختبار ، ثم أشر إلى Windows، و ثم انقر فوق عرض الاختبار.

  2. في إطار "عرض الاختبار"، انقر فوق تحديث على إلى olbar إلى تحديث قائمة الاختبارات.

    يسرد الإطار اختبار عرض الاختبارات التي قمت بإنشائها سابقا في هذه معاينة و إلى الذي قمت بإضافة Transact-SQLعبارات وشروط الاختبار. الاختبار التي هو باسم TestMethod1 هو فارغ و هو غير مستخدمة في ترتيب هو معاينة.

  3. يمين-انقر فوق من Sales_uspNewCustomerTest، ثم انقر فوق تشغيل تحديد.

    Visual Studioيستخدم سياق المميز الذي حددته إلى الاتصال إلى قاعدة بيانات وتطبيقها في الخطة الجيل بيانات. Visual Studioثم التبديل إلى سياق التنفيذ قبل تشغيلTransact-SQLالبرامج النصية في اختبار. وأخيراً، Visual Studioتقييم النتائج Transact-SQLبرنامج نصي بالمقابلة مع تلك التي قمت بتحديدها في حالة الاختبار، وتظهر نتيجة أما مسار أو فشل في نافذة نتائج الاختبار .

  4. عرض النتيجة في الإطار s النتيجة اختبار.

    اختبار مسارات، وهو ما يعني أن SELECTعبارة إرجاع صف واحد عند التشغيل.

  5. كرر الخطوة 3 للاختبارات Sales_uspPlaceNewOrderTest و Sales_uspFillOrderTest Sales_uspShowOrderDetailsTest. يجب أن تكون نتائج كما يلي:

    اختبار

    النتائج المتوقعة

    Sales_uspPlaceNewOrderTest

    تمرير

    Sales_uspShowOrderDetailsTest

    تمرير

    Sales_uspFillOrderTest

    فشل بالتالي خطأ: "الشرط ScalarValueCondition (scalarValueCondition2) فشل: مجموعة نتائج 1 عمود صف 1 1: قيم لا مطابقة، الفعلي '-100' المتوقعة '100'. " يحدث هذا الخطأ لأن التعريف إجراء مخزّن يحتوي على خطأ بسيط.

    بعد ذلك، سيتم تصحيح الخطأ و إعادة تشغيل الاختبار الخاصة بك.

إلى تصحيح الخطأ في Sales.uspFillOrder

  1. في عرض مخطط، انقر نقراً مزدوجاً فوق إجراء sإلىred uspFillOrder إلى فتح تعريفه في Transact-SQLediإلىr.

  2. في التعريف، ابحث عن التالي Transact-SQLكشف:

    UPDATE [Sales].[Customer]
       SET
       YTDSales = YTDSales - @Delta
        WHERE [CustomerID] = @CustomerID
    
  3. قم بتغيير عبارة التعيين في العبارة إلى مطابقة العبارة التالية:

    UPDATE [Sales].[Customer]
       SET
       YTDSales = YTDSales + @Delta
        WHERE [CustomerID] = @CustomerID
    
  4. في قائمة ملف ، انقر فوق حفظ uspFillOrder.proc.sql.

  5. في عرض اختبار ، انقر نقراً مزدوجاً فوق Sales_uspFillOrder اختبار ، انقر فوق تشغيل تحديد.

    تمرير الاختبار.

إضافة اختبار وحدة السالبة

قد تقوم بإنشاء اختبار سالبة للتحقق من أن فشل اختبار عندما يجب أن يفشل ذلك. على سبيل المثال، إذا حاولت إلى إلغاء الأمر طلب التي تم تعبئتها بالفعل، يجب أن يفشل هذا الاختبار. في هذا الجزء من معاينة، بإنشاء اختبار وحدة سالبة Sales.uspCancelOrder إجراء مخزّن.

إلى إنشاء وتأكد من اختبار سالبة، يجب تنفيذ المهام التالية:

  • التحديث إجراء مخزّن لاختبار حالات الفشل

  • قم بتعريف اختبار وحدة الجديدة

  • قم بتعديل تعليمات برمجية للوحدة بإجراء اختبار للإشارة إلى أن هو توقع فشل

  • تشغيل اختبار وحدة

لتحديث إجراء مخزّن

  1. في عرض "المخطط"، المتوقعة و عقده SimpleUnitTestDB، المتوقعة و عقده رسوم تخطيطية، المتوقعة و عقده المبيعات، المتوقعة و عقده قابلية البرمجة، المتوقعة و عقده "إجراءات مخزنة"، و انقر نقراً مزدوجاً فوق uspCancelOrder.

  2. في Transact-SQL، قم بتحديث تعريف إجراء إلى مطابقة التعليمة البرمجية التالية:

    CREATE PROCEDURE [Sales].[uspCancelOrder]
    @OrderID INT
    AS
    BEGIN
        DECLARE @Delta INT, @CustomerID INT, @PriorStatus CHAR(1)
        BEGIN TRANSACTION
            BEGIN TRY
                IF (NOT EXISTS(SELECT [CustomerID] from [Sales].[Orders] WHERE [OrderID] = @OrderID))
                BEGIN
                    -- Specify WITH LOG option so that the error is
                    -- written to the application log.
                    RAISERROR( 'That order does not exist.', -- Message text
                               16, -- severity
                                1 -- state
                            ) WITH LOG;
                END
    
                SELECT @Delta = [Amount], @CustomerID = [CustomerID], @PriorStatus = [Status]
                 FROM [Sales].[Orders] WHERE [OrderID] = @OrderID
    
                IF @PriorStatus <> 'O' 
                BEGIN
                    -- Specify WITH LOG option so that the error is
                    -- written to the application log.
                    RAISERROR ( 'You can only cancel open orders.', -- Message text
                                16, -- Severity
                                1 -- State
                                ) WITH LOG;
                END
                ELSE
                BEGIN
                    -- If we make it to here, then we can cancel the order. Update the status to 'X' first...
                    UPDATE [Sales].[Orders]
                       SET [Status] = 'X'
                    WHERE [OrderID] = @OrderID
                    -- and then remove the amount from the YTDOrders for the customer
                    UPDATE [Sales].[Customer]
                           SET
                               YTDOrders = YTDOrders - @Delta
                    WHERE [CustomerID] = @CustomerID
                    COMMIT TRANSACTION
                    RETURN 1; -- indicate success
                END
            END TRY
            BEGIN CATCH
                DECLARE @ErrorMessage NVARCHAR(4000);
                DECLARE @ErrorSeverity INT;
                DECLARE @ErrorState INT;
    
                SELECT @ErrorMessage = ERROR_MESSAGE(),
                       @ErrorSeverity = ERROR_SEVERITY(),
                       @ErrorState = ERROR_STATE();
    
                ROLLBACK TRANSACTION
                -- Use RAISERROR inside the CATCH block to return
                -- error information about the original error that
                -- caused execution to jump to the CATCH block.
                RAISERROR (@ErrorMessage, -- Mesasge text
                           @ErrorSeverity, -- Severity
                           @ErrorState -- State
                          );
                RETURN 0; -- indicate failure
            END CATCH;
    END
    
  3. تشغيل انقر قائمة ملف حفظ uspCancelOrder.proc.sql.

  4. في مستكشف الحل، يمين-انقر فوق من SimpleUnitTestDB وانقر فوق التوزيع.

    قمت بنشر التحديثات إلى إجراء uspCancelOrder المخزنة. قمت بتم تغييره لا يوجد الكائنات غير ذلك، لذا فقط إجراء مخزّن هو محدث.

    التالي بتحديد اختبار الوحدة المقترنة لتنفيذ هذا إجراء.

إلى كتابة وحدة قاعدة بيانات اختبار uspCancelOrder

  1. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspCancelOrderTest، وتأكد من أن الاختبار هو المميزة في lهوt المجاورة.

    بعد إجراء هذه الخطوة، يمكنك إنشاء برنامج نصي للاختبار لإجراء الاختبار في اختبار وحدة.

  2. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    -- database unit test for Sales.uspFillOrder
    DECLARE @RC AS INT, @CustomerID AS INT, @Amount AS INT, @FilledDate AS DATETIME, @Status AS CHAR (1);
    DECLARE @CustomerName AS NVARCHAR(40), @OrderID AS INT;
    
    SELECT @RC = 0,
           @CustomerID = 0,
           @OrderID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @FilledDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    -- Get the most recently added order.
    SELECT @OrderID = MAX([OrderID]) FROM [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    
    -- try to cancel an order for that customer that has already been filled
    EXECUTE @RC = [Sales].[uspCancelOrder] @OrderID;
    
    SELECT @RC AS RC;
    
  3. في الجزء اختبار الشروط ، انقر فوق الشرط الاختبار Inconclusive، و انقر فوق يحذف شرط اختبار (x).

  4. في الجزء شروط الاختبار ، انقر فوق قيمة Scalar في قائمة، ثم انقر فوق إضافة شرط الاختبار (+).

  5. في الإطار خصائص ، قم بتعيين خاصية القيمة المتوقعة إلى 0.

  6. في شريط التنقل "مصمم اختبار وحدة قاعدة بيانات"، انقر فوق من Sales_uspCancelOrderTest، وتأكد من أن من Pre-Test هو المميزة في lهوt المجاورة. بعد تنفيذ th هو الخطوة، يمكنك تحديد عبارات وضع بيانات في الالولاية التي هو المطلوبة لتنفيذ الاختبار الخاصة بك. على سبيل المثال، يجب أن إنشاء سجل العميل قبل أن يمكنك وضع طلب.

  7. انقر فوق انقر هنا ل إنشاء إلى إنشاء pre-اختبار برنامج نصي.

  8. بتحديث Transact-SQLعبارات في Transact-SQLediإلىr إلى تتطابق مع العبارات التالية:

    /*
    Add Transact-SQL statements here that you want to run before
    the test script is run.
    */
    BEGIN TRANSACTION
    
    -- Add a customer for this test with the name 'CustomerB'
    DECLARE @NewCustomerID AS INT, @RC AS INT, @CustomerName AS NVARCHAR (40);
    
    SELECT @RC = 0,
           @NewCustomerID = 0,
           @CustomerName = N'Fictitious Customer';
    
    IF NOT EXISTS(SELECT * FROM [Sales].[Customer] WHERE CustomerName = @CustomerName)
    BEGIN
    EXECUTE @NewCustomerID = [Sales].[uspNewCustomer] @CustomerName;
    END
    
    DECLARE @CustomerID AS INT, @Amount AS INT, @OrderDate AS DATETIME, @FilledDate AS DATETIME, @Status AS CHAR (1), @OrderID AS INT;
    
    SELECT @RC = 0,
           @CustomerID = 0,
       @OrderID = 0,
           @CustomerName = N'Fictitious Customer',
           @Amount = 100,
           @OrderDate = getdate(),
       @FilledDate = getdate(),
           @Status = 'O';
    
    -- NOTE: Assumes that you inserted a Customer record with CustomerName='Fictitious Customer' in the pre-test script.
    SELECT @CustomerID = [CustomerID] FROM [Sales].[Customer] WHERE [CustomerName] = @CustomerName;
    
    -- delete any old records in the Orders table and clear out the YTD Sales/Orders fields
    DELETE from [Sales].[Orders] WHERE [CustomerID] = @CustomerID;
    UPDATE [Sales].[Customer] SET YTDOrders = 0, YTDSales = 0 WHERE [CustomerID] = @CustomerID;
    
    -- place an order for that customer
    EXECUTE @OrderID = [Sales].[uspPlaceNewOrder] @CustomerID, @Amount, @OrderDate, @Status;
    
    -- fill the order for that customer
    EXECUTE @RC = [Sales].[uspFillOrder] @OrderID, @FilledDate;
    
    COMMIT TRANSACTION
    
  9. من القائمة ملف، انقر فوق حفظ الكل.

    عند هذه النقطة، تكون جاهزاً إلى تشغيل الاختبارات الخاصة بك.

إلى تشغيل الاختبارات وحدة قاعدة بيانات

  1. في عرض الاختبار، يمين-انقر فوق من Sales_uspCancelOrderTest، وانقر فوق تشغيل تحديد.

  2. عرض النتيجة في الإطار s النتيجة اختبار.

    فشل الاختبار و يظهر الخطأ التالي:

    Test method TestProject1.DatabaseUnitTests1.Sales_uspCancelOrderTest threw exception: System.Data.SqlClient.SqlException: You can only cancel open orders.

    بعد ذلك، يمكنك تعديل تعليمات برمجية للإشارة إلى أن ‏‏ استثناء هو المتوقع.

إلى تعديل تعليمات برمجية للاختبار الوحدة

  1. في من مستكشف الحل، توسيع TestProject1 ، اليمين-انقر و DatabaseUnitTests1.cs $ $ $ $ انقر عرض تعليمات برمجية.

  2. في محرر تعليمات برمجية، انتقل إلى Sales_uspCancelOrderTest أسلوب. قم بتعديل السمات الأسلوب إلى تطابق تعليمات برمجية التالية:

            [TestMethod(), ExpectedSqlException(Severity=16, MatchFirstError=false, State=1)]
            public void Sales_uspCancelOrderTest()
    

    تحديد أن تتوقع إلى انظر استثناء "SQL" محددة. يمكنك بشكل اختياري تحديد رقم خطأ معينة. إذا لم تضف هذه السمة، سوف تفشل الاختبار الوحدة، و تظهر رسالة في نافذة "نتائج اختبار"

  3. تشغيل قائمة ملف، انقر فوق حفظ DatabaseUnitTests1.cs.

    بعد ذلك، أعد تشغيل اختبار الوحدة الخاصة بك إلى التحقق من أن تفشل كما هو متوقع.

إلى إعادة تشغيل الاختبارات وحدة قاعدة بيانات

  1. في عرض الاختبار، يمين-انقر فوق من Sales_uspCancelOrderTest، وانقر فوق تشغيل تحديد.

  2. عرض النتيجة في الإطار s النتيجة اختبار.

    مسارات الاختبار، وهو ما يعني أن فشل إجراء عند فإنه كان من المفترض إلى فشل.

الخطوات التالية

في مشروع نموذجي، هل عرفت الاختبارات وحدة إضافى إلى التحقق من أن تعمل الجميع الكائنات قاعدة بيانات حرج بشكل صحيح. عند التعيين الاختبارات هو كاملة، قد فحص هذه الاختبارات في التحكم بالإصدار مشاركتها مع الفريق.

بعد تأسيس خط أساس، يمكنك إنشاء و تعديل الكائنات قاعدة بيانات و ثم قم بإنشاء اقتران الاختبارات للتحقق ما إذا كان تغيير إلى قطع سلوك المتوقع.

راجع أيضًا:

المهام

كيفية القيام بما يلي: إنشاء اختبار وحدة قاعدة بيانات فارغ

كيفية القيام بما يلي: Configure Database Unit Test Execution

المبادئ

Call GC.KeepAlive when using native resources

يتم الآن التحقق من تعليمات برمجية في قاعدة بيانات باستخدام اختبارات الوحدة

إنشاء اختبار البيانات لقواعد بيانات باستخدام مولدات البيانات