إعداد وهدم الدولة قاعدة البيانات المعقدة مع إسبات / الربيع / أداة JUnit

StackOverflow https://stackoverflow.com/questions/822846

  •  03-07-2019
  •  | 
  •  

سؤال

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

والقضية لدي هي مع المسيل للدموع لأسفل. كيف يمكنني بسهولة التراجع عن التغييرات التي تم إجراؤها في مرحلة الإعداد ديسيبل؟

وأنا حاليا باستخدام دعم السبات + الربيع المعاملات اختبار، بحيث بلدي طرق الاختبار الفردية هي ملفوفة في المعاملات.

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

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

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

المحلول

هل عالقة مع بائع قاعدة بيانات محددة؟ إذا لم يكن كذلك، هل يمكن استخدام قاعدة بيانات في الذاكرة، مثل HSQLDB . عندما كنت فعلت مع الاختبارات التي مجرد رمي بعيدا الدولة. هذا هو المناسب فقط إذا كانت الجداول يمكن أن يكون فارغا في بداية اختبار جناح (قبل إعداد برنامجي الخاص بك، وهذا هو).

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

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

إذا هذا الحل يبدو ينطبق يمكنني توضيح ذلك.

نصائح أخرى

وأنت قد ترغب في النظر فيAfterClass الشرح، لأداة JUnit 4. سيتم تشغيل هذا الشرح عند الانتهاء من الاختبارات.

http://cwiki.apache.org/DIRxDEV/junit4-primer.html

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

وDBUnit سوف يساعد كثيرا مع هذا. هل يمكن أن تتحول من الناحية النظرية من autocommits على JDBC، ولكنه سيحصل شعر. الحل الأكثر وضوحا هو استخدام DBUnit لوضع البيانات الخاصة بك إلى حالة معروفة قبل تشغيل الاختبارات. إذا لسبب ما كنت في حاجة إلى بيانات الخاصة بك مرة أخرى بعد أن يتم تشغيل الاختبارات، هل يمكن أن ننظر إلىAfterClass على مجموعة التي تدير كل من الاختبارات الخاصة بك، ولكنه يعتبر عادة ممارسة أفضل لانشاء الاختبارات الخاصة بك ومن ثم تشغيلها، لذلك أنه إذا فشل الاختبار، فإنه ليس فقط لأنه لم يكن لديها بيئة prestine بسبب فشل لتنظيف اختبار مختلف. يمكنك التأكد من أن كل اختبار يضع بيئتها مباشرة.

وأحد الحلول التي قد ترغب في النظر هو استخدام "دليل" التراجع أو تعويض الصفقة في ديسيبل هدم. أعتقد أن (وإذا لم يكن ثم يجب أن يكون إضافة على تافهة إلى كيانات السبات الخاص بك) كل ما تبذلونه من كيانات لها التاريخ والوقت خلق سمة تشير عندما تم إدراجها في الجدول. طريقة الإعداد ديسيبل الخاص بك يجب تسجيل الوقت قبل كل شيء آخر. ثم لديك إجراء بسيط وليس لديسيبل هدم لحذف جميع الكيانات التي تم إنشاؤها بعد وقت recored في الإعداد ديسيبل.

وبطبيعة الحال، هذا لن يعمل للحصول على التحديثات في الإعداد ديسيبل ... ولكن إذا كان لديك عدد محدود من التحديثات ثم النظر في توفير صورة البكر لهذا النوع من البيانات واستعادتها خلال ديسيبل هدم.

إذا كنت تعمل مع قاعدة بيانات صغيرة نسبيا، مع وجود نظم إدارة قواعد البيانات التي يمكن أن تفعل النسخ الاحتياطي / صادرات ذلك بسرعة نسبيا (مثل MS SQL الخادم)، يمكنك أن تنظر في إنشاء نسخة احتياطية قاعدة البيانات قبل الاختبارات، ومن ثم استعادته عند كل اكتمال الاختبار. وهذا يتيح لك انشاء واختبار / تطوير قاعدة البيانات واستخدامها كدولة الانطلاق لجميع الاختبارات الخاصة بك.

وأنا فعلت هذا مع JDBC الأصلي، وتنفيذ '' قاعدة بيانات النسخ الاحتياطي '' و '' استعادة قاعدة البيانات '' T-SQL في الفترات الفاصلة بين الاختبارات، وانها عملت بشكل معقول.

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

هل هناك سبب أن يكون لديك اتصال قاعدة البيانات لتشغيل الاختبارات وحدتك؟ يبدو أنه قد يكون من الأسهل ريفاكتور صفك حتى تتمكن من يسخرون من التفاعل مع قاعدة البيانات. يمكنك يسخر الطبقات (مع بعض الاستثناءات)، وكذلك واجهات مع EasyMock (www.easymock.org).

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

والسبات لديه ميزة أنيق القليل الذي هو بشكل كبير تحت موثقة ومعروفة. يمكنك تنفيذ برنامج نصي SQL أثناء إنشاء SessionFactory مباشرة بعد جيل مخطط قاعدة البيانات لاستيراد البيانات في قاعدة بيانات جديدة. تحتاج فقط لإضافة ملف يسمى import.sql في الجذر CLASSPATH وتعيين إما إنشاء أو إنشاء الإفلات كعقار hibernate.hbm2ddl.auto الخاص بك.

http://in.relation.to/Bloggers/RotterdamJBugAndHibernatesImportsql

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