unit testing - guru99 - بيانات قاعدة البيانات المطلوبة في اختبارات التكامل ؛ تم إنشاؤها بواسطة مكالمات API أو باستخدام البيانات المستوردة؟



unit-testing mocking (6)

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

والقاعدة الأساسية لاختبارات الوحدة هي أنها يجب أن تكون مستقلة ، ويمكن تحقيق ذلك بعزل فئة من اعتمادياتها. هناك العديد من الطرق للقيام بذلك ، ويعتمد ذلك على ما إذا كنت تقوم بحقن الاعتمادات الخاصة بك باستخدام IoC (في عالم جافا لدينا الربيع ، EJB3 وغيرها من الأطر / المنصات التي توفر قدرات الحقن) و / أو إذا كنت تهز الكائنات (لجافا لديك JMock و EasyMock ) لفصل فئة يتم اختبارها من JMock .

إذا كنا بحاجة إلى اختبار مجموعات من الأساليب في الفصول المختلفة * ونرى أنها تكامل جيد ، فإننا نكتب اختبارات التكامل . وهنا سؤالي!

  • على الأقل في تطبيقات الويب ، غالبًا ما تستمر الولاية في قاعدة بيانات. يمكننا استخدام نفس الأدوات مثل اختبارات الوحدة لتحقيق الاستقلال من قاعدة البيانات. ولكن في رأيي المتواضع ، أعتقد أن هناك حالات لا تستخدم فيها قاعدة بيانات لاختبارات التكامل أكثر من اللازم (لكن لا تتردد في عدم الموافقة ؛ لا تستخدم قاعدة بيانات على الإطلاق ، هي أيضًا إجابة صحيحة لأنها تجعل السؤال غير ذي صلة) ).
  • عندما تستخدم قاعدة بيانات لاختبارات التكامل ، كيف تملأ قاعدة البيانات هذه بالبيانات؟ يمكنني رؤية نهجين:
    • قم بتخزين محتويات قاعدة البيانات لاختبار التكامل وقم بتحميله قبل بدء الاختبار. إذا تم تخزينه كملف تفريغ SQL ، فسيكون من المفيد معرفة ملف قاعدة البيانات أو XML أو أي شيء آخر.
    • قم بإنشاء بنية قاعدة البيانات الضرورية بواسطة استدعاءات API. ربما يتم تقسيم هذه المكالمات إلى عدة طرق في شفرة الاختبار وقد تفشل كل طريقة من هذه الطرق. يمكن أن ينظر إليه باعتباره اختبار التكامل الخاص بك وجود تبعيات على اختبارات أخرى.

كيف تتأكد من وجود بيانات قاعدة البيانات اللازمة للاختبارات عند الحاجة إليها؟ ولماذا اخترت الطريقة التي تختارها؟

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

* أقوم بتضمين طريقة واحدة للاتصال بطرق أخرى في نفس (أو نفس الحالات) من نفس الفئة في التعريف الخاص بي لاختبار الوحدة ، على الرغم من أنه قد لا يكون صحيحًا من الناحية الفنية. لا تتردد في تصحيحي ، ولكن دعنا نبقيه كمسألة جانبية.

https://src-bin.com


Answer #1

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

انها مباشرة وقابلة للتكرار بسهولة جدا.


Answer #2

أفضل إنشاء بيانات الاختبار باستخدام مكالمات API.

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

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

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

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

شيء آخر متعلق بتكامل اختبار قاعدة البيانات ، هو اختبار أن الترقية من مخطط قاعدة بيانات سابق يعمل بشكل صحيح. لهذا قد ترغب في قراءة كتاب قواعد إعادة بيع ديون: تصميم قاعدة البيانات التطوري أو هذه المادة: http://martinfowler.com/articles/evodb.html


Answer #3

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

لإنشاء البيانات ، قررت إنشاء تطبيق خارجي يملأ قاعدة البيانات ببيانات "عشوائية" ، وقمت بإنشاء مولدات اسم شخص ومسمِّع للشركة إلخ.

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

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


Answer #4

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

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

أيضا ، جعل سور أن لديك قاعدة البيانات في حالة معروفة جيدا قبل كل دولة. لا تريد أن يكون لديك تبعيات بين اختبارات التكامل الخاصة بك.


Answer #5

يبدو أن سؤالك هو في الواقع سؤالان. هل يجب عليك استخدام استبعاد قاعدة البيانات من الاختبار؟ متى تقوم بقاعدة بيانات ثم كيف تقوم بتوليد البيانات في قاعدة البيانات؟

كلما أمكن ، أفضل استخدام قاعدة بيانات فعلية. في كثير من الأحيان يمكن أن تعود طلبات البحث (المكتوبة في SQL ، HQL ، إلخ) في فئات CRUD نتائج مذهلة عند مواجهة قاعدة بيانات فعلية. من الأفضل التخلص من هذه المشكلات في وقت مبكر. غالباً ما يقوم المطورون بكتابة اختبارات وحدة رقيقة جدًا لـ CRUD ؛ اختبار فقط الحالات الأكثر اعتدالا. يمكن أن يؤدي استخدام قاعدة بيانات فعلية للاختبار إلى اختبار جميع أنواع زوايا الحالات التي ربما لم تكن على دراية بها.

أن يقال يمكن أن يكون هناك قضايا أخرى. بعد كل اختبار تريد إرجاع قاعدة البيانات الخاصة بك إلى حالة معروفة. هذه وظيفتي الحالية نحن نوك قاعدة البيانات عن طريق تنفيذ جميع بيانات DROP ومن ثم إعادة إنشاء جميع الجداول من الصفر تماما. هذا بطيء للغاية على Oracle ، ولكن يمكن أن يكون سريعًا جدًا إذا كنت تستخدم قاعدة بيانات في الذاكرة مثل HSQLDB. عندما نحتاج إلى إزالة مشكلات Oracle المحددة ، نقوم فقط بتغيير عنوان URL الخاص ببيانات قاعدة البيانات وخصائص برنامج التشغيل ثم تشغيلها في مقابل Oracle. إذا لم يكن لديك هذا النوع من إمكانية نقل قاعدة البيانات ، فإن Oracle لديه أيضًا نوعًا من ميزة لقطة قاعدة البيانات التي يمكن استخدامها خصيصًا لهذا الغرض ؛ عودة قاعدة البيانات بأكملها إلى حالة سابقة. أنا متأكد من قواعد البيانات الأخرى.

استنادًا إلى نوع البيانات الموجودة في قاعدة البيانات ، قد تعمل واجهة برمجة التطبيقات أو نهج التحميل بشكل أفضل أو أسوأ. عندما يكون لديك بيانات منظمة للغاية مع العديد من العلاقات ، فإن واجهات برمجة التطبيقات ستجعل حياتك أكثر سهولة ، حيث تجعل العلاقات بين بياناتك صريحة. سيكون من الصعب عليك ارتكاب خطأ عند إنشاء مجموعة بيانات الاختبار الخاصة بك. كما ذكرنا من قبل أدوات أخرى لإعادة نشر الملصقات ، يمكن أن تهتم ببعض التغييرات في بنية بياناتك تلقائيًا. غالبًا ما أجد أنه من المفيد التفكير في بيانات اختبار إنشاء واجهة برمجة التطبيقات عند إنشاء سيناريو ؛ عندما يقوم المستخدم / النظام بخطوات X ، YZ ومن ثم تنتقل الاختبارات من هناك. يمكن تحقيق هذه الحالات لأنه يمكنك كتابة برنامج يستدعي نفس API الذي قد يستخدمه المستخدم.

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

تحتوي معظم قواعد البيانات على أدوات لاستيراد وتصدير ملفات نصية محددة من الجداول. لكن في أغلب الأحيان أنت فقط تريد مجموعات فرعية منهم ؛ جعل استخدام مقالب البيانات أكثر تعقيدا. في وظيفتي الحالية نحن بحاجة إلى أخذ بعض مقالب البيانات الفعلية التي يتم الحصول عليها من برامج Matlab وتخزينها في قاعدة البيانات. لدينا أداة يمكنها تفريغ مجموعة فرعية من بيانات قاعدة البيانات ومن ثم مقارنتها مع "الحقيقة الأرضية" للاختبار. يبدو أن أدوات الاستخراج الخاصة بنا يتم تعديلها باستمرار.


Answer #6

لماذا يتم تعريف هذين النهجين على أنهما حصرا؟

  • لا أرى أي حجة قابلة للتطبيق لعدم استخدام مجموعات البيانات الموجودة مسبقًا ، خاصةً البيانات المعينة التي سببت مشكلات في الماضي.

  • لا يمكنني رؤية أي حجة قابلة للتطبيق لعدم توسيع هذه البيانات برمجيًا مع كل الشروط الممكنة التي يمكنك تخيلها مما يتسبب في حدوث مشكلات وحتى بعض البيانات العشوائية لاختبار التكامل .

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

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

كما لاحظ آخرون ، بالطبع ، كل هذا يعتمد بشكل طبيعي على نوع التطبيق الذي تقوم بتطويره ونوع التنظيم الذي تتواجد فيه ، إلخ.





integration-testing