سؤال

هل لدى أي شخص بعض التلميحات الجيدة لكتابة كود اختبار لتطوير الواجهة الخلفية لقاعدة البيانات حيث يوجد اعتماد كبير على الحالة؟

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

هل يقوم الأشخاص عادةً بإنشاء نظام تطوير منفصل بقاعدة بيانات "مجمدة" بحيث تقوم أي وظيفة محددة دائمًا بإرجاع نفس مجموعة النتائج بالضبط؟

أنا متأكد تمامًا من أن هذه ليست مشكلة جديدة، لذا سأكون مهتمًا جدًا بالتعلم من تجارب الآخرين.

هل توجد مقالات جيدة تناقش مسألة التطوير المستند إلى الويب بشكل عام؟

عادةً ما أكتب كود PHP، لكنني أتوقع أن تكون كل هذه المشكلات إلى حد كبير غير مناسبة للغة وإطار العمل.

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

المحلول

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

تحديث:أظهر بحث جوجل السريع أ ملحق وحدة قاعدة البيانات ل PHPUnit.

نصائح أخرى

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

أعتقد أن ذلك يعتمد على قاعدة البيانات التي تستخدمها، ولكن Red Gate (www.red-gate.com) يصنع أداة تسمى SQL Data Generator.يمكن تكوين هذا لملء قاعدة البيانات الخاصة بك ببيانات اختبار معقولة المظهر.يمكنك أيضًا إخباره بأن يستخدم دائمًا نفس البذرة في منشئ الأرقام العشوائية الخاص به بحيث تكون بياناتك "العشوائية" هي نفسها في كل مرة.

يمكنك بعد ذلك كتابة اختبارات الوحدة الخاصة بك للاستفادة من هذه البيانات الموثوقة والمتكررة.

أما بالنسبة لاختبار جانب الويب من الأشياء، فأنا أبحث حاليًا عن السيلينيوم (selenium.openqa.org).يبدو أن هذا عبارة عن مجموعة اختبار قادرة على استخدام المتصفحات المتعددة والتي ستساعدك على اختبار الوظائف.ومع ذلك، كما هو الحال مع جميع أدوات اختبار مواقع الويب هذه، لا توجد طريقة حقيقية لاختبار مدى جودة هذه الأشياء ينظر في جميع المتصفحات دون إلقاء نظرة بشرية عليها!

نستخدم قاعدة بيانات في الذاكرة (hsql : http://hsqldb.org/).بيات شتوى (http://www.hibernate.org/) يجعل من السهل علينا توجيه اختبارات وحدتنا إلى قاعدة بيانات الاختبار، مع الميزة الإضافية التي يتم إجراؤها بسرعة البرق..

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

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

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

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

من المفيد بالتأكيد إعداد إصدار تجريبي من قاعدة البيانات - أو جعل نصوص الاختبار الخاصة بك تملأ قاعدة البيانات بالبيانات المعروفة كجزء من الاختبارات.

بامكانك ان تحاول http://selenium.openqa.org/ إنه مخصص لاختبار واجهة المستخدم الرسومية بدلاً من تطبيق اختبار طبقة البيانات ولكنه يسجل أفعالك والتي يمكن بعد ذلك تشغيلها لأتمتة الاختبارات عبر منصات مختلفة.

هذه هي استراتيجيتي (أستخدم JUnit، لكنني متأكد من أن هناك طريقة للقيام بما يعادلها في PHP):

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

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

طريقة لاختبار كود قاعدة البيانات هي:

  1. أدخل بضعة صفوف (باستخدام SQL) لتهيئة الحالة
  2. قم بتشغيل الوظيفة التي تريد اختبارها
  3. مقارنة النتائج المتوقعة بالنتائج الفعلية.هنا يمكنك استخدام إطار اختبار الوحدة العادي الخاص بك
  4. قم بتنظيف الصفوف التي تم تغييرها (وبالتالي لن يرى التشغيل التالي التشغيل السابق)

يمكن إجراء التنظيف بطريقة قياسية (بالطبع، فقط في قاعدة بيانات الاختبار) باستخدام DELETE * FROM table.

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

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