سؤال

باعتباري مبتدئًا في ممارسة التطوير القائم على الاختبار، غالبًا ما ينتهي بي الأمر في مأزق حول كيفية وحدة ثبات الاختبار في قاعدة البيانات.

أعلم أن هذا سيكون من الناحية الفنية اختبارًا للتكامل (وليس اختبارًا للوحدة)، ولكني أريد معرفة أفضل الاستراتيجيات لما يلي:

  1. استعلامات الاختبار.
  2. إدراجات الاختبار.كيف أعرف أن الإدخال الذي حدث خطأ إذا فشل؟يمكنني اختباره عن طريق الإدراج ثم الاستعلام، ولكن كيف أعرف أن الاستعلام لم يكن خاطئًا؟
  3. اختبار التحديثات والحذف - مثل إدخالات الاختبار

ما هي أفضل الممارسات للقيام بذلك؟


فيما يتعلق باختبار SQL:أدرك أنه يمكن القيام بذلك، ولكن إذا استخدمت مخطط O/R مثل NHibernate، فإنه يرفق بعض ثآليل التسمية في الأسماء المستعارة المستخدمة لاستعلامات الإخراج، وبما أن هذا لا يمكن التنبؤ به إلى حد ما، فأنا لست متأكدًا من أنه يمكنني اختباره الذي - التي.

هل يجب أن أتخلى عن كل شيء وأثق ببساطة في NHibernate؟لست متأكدا من أن هذا من الحكمة.

هل كانت مفيدة؟

المحلول

ابحث في وحدة قاعدة البيانات.إنها مكتبة Java، ولكن يجب أن يكون هناك ما يعادلها في C#.يتيح لك إعداد قاعدة البيانات بمجموعة من البيانات حتى تعرف ما هو موجود في قاعدة البيانات، ثم يمكنك التفاعل مع DB Unit لمعرفة ما هو موجود في قاعدة البيانات.يمكن تشغيله ضد العديد من أنظمة قواعد البيانات، بحيث يمكنك استخدام إعداد قاعدة البيانات الفعلي الخاص بك، أو استخدام شيء آخر، مثل HSQL في Java (تنفيذ قاعدة بيانات Java مع خيار في الذاكرة).

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

نصائح أخرى

مثل قال مايك ستون, يعد DbUnit أمرًا رائعًا لجعل قاعدة البيانات في حالة معروفة قبل إجراء الاختبارات.عند الانتهاء من الاختبارات، يمكن لـ DbUnit إعادة قاعدة البيانات إلى الحالة التي كانت عليها قبل إجراء الاختبارات.

وحدة دي بي (جافا)

DbUnit.NET

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

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

لقد كتبت مشاركة هنا بخصوص وحدة اختبار طبقة البيانات الذي يغطي هذه المشكلة بالضبط.نعتذر عن الإضافة (المخزية)، لكن المقال طويل جدًا بحيث لا يمكن نشره هنا.

آمل أن يساعدك ذلك - لقد نجح الأمر بشكل جيد للغاية بالنسبة لي خلال الأشهر الستة الماضية في 3 مشاريع نشطة.

يعتبر،

روب ج

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

ل NHibernate, ، أنا بالتأكيد أؤيد مجرد الاستهزاء بـ NHibernate API بالنسبة لاختبارات الوحدة - ثق في المكتبة للقيام بالشيء الصحيح.إذا كنت تريد التأكد من أن البيانات تذهب فعليًا إلى قاعدة البيانات، فقم بإجراء اختبار التكامل.

بالنسبة للمشاريع القائمة على JDBC، يمكن استخدام إطار عمل Acolyte الخاص بي: http://acolyte.eu.org .فهو يسمح بالوصول إلى البيانات بالحجم الطبيعي الذي تريد اختباره، والاستفادة من تجريد JDBC، دون الحاجة إلى إدارة قاعدة بيانات اختبارية محددة.

أود أيضًا أن أسخر من قاعدة البيانات وأتأكد من أن الاستعلامات هي ما توقعته.هناك خطر أن يتحقق الاختبار من SQL خاطئ، ولكن سيتم اكتشاف ذلك في اختبارات التكامل

من الناحية الفنية، اختبارات الوحدة للثبات ليست اختبارات الوحدة، بل هي اختبارات التكامل.

باستخدام C# باستخدام mbUnit، يمكنك ببساطة استخدام سمات SqlRestoreInfo وRollBack

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

يمكن فعل الشيء نفسه في NUnit، باستثناء أن أسماء السمات تختلف قليلاً.

أما بالنسبة للتحقق مما إذا كان استعلامك ناجحًا، فعادةً ما تحتاج إلى متابعته باستعلام ثانٍ لمعرفة ما إذا كانت قاعدة البيانات قد تغيرت كما تتوقع.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top