تستخدم العديد من تطبيقات قواعد البيانات الحديثة مشروع Doctrine ORM .
من الممارسات الجيدة نقل العمل باستخدام قاعدة البيانات إلى الخدمات. والخدمات تحتاج إلى اختبار.
لاختبار الخدمات ، يمكنك توصيل قاعدة بيانات اختبار ، أو يمكنك قفل إدارة المستودعات والمستودعات. مع الخيار الأول ، يكون كل شيء واضحًا ، لكن لا يعقل دائمًا نشر قاعدة بيانات لاختبار الخدمة. سنتحدث عن هذا.
على سبيل المثال ، خذ الخدمة التالية:
src / الخدمة / المستخدم / UserService.php نحتاج إلى اختبار طريقة create()
فقط.
حدد الحالات التالية:
- إنشاء مستخدم ناجح بدون مرجع
- إنشاء مستخدم ناجح مع الإحالة
- خطأ "تم تسجيل الدخول بالفعل"
- خطأ "لم يتم العثور على المرجع"
لاختبار الخدمة ، نحتاج إلى كائن يقوم بتنفيذ واجهة Doctrine\ORM\EntityManagerInterface
الخيار 1. نستخدم قاعدة بيانات حقيقية
سنكتب فئة أساسية للاختبارات ، والتي سنرثها لاحقًا.
الآن من المنطقي للاختبارات تعيين متغيرات البيئة. phpunit.xml
ملف phpunit.xml
في قسم php
. سأستخدم sqlite ديسيبل
phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" verbose="true" colors="true"> <php> <env name="DB_DRIVER" value="pdo_sqlite" /> <env name="DB_PATH" value="var/db-test.sqlite" /> <env name="DB_USER" value="" /> <env name="DB_PASSWORD" value="" /> <env name="DB_NAME" value="" /> </php> <testsuites> <testsuite name="default"> <directory>tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit>
الآن سوف نكتب اختبار الخدمة
الاختبارات / الوحدة / الخدمة / UserServiceTest.php تأكد من أن خدمتنا تعمل بشكل صحيح
./vendor/bin/phpunit
الخيار 2. باستخدام MockBuilder
بناء قاعدة بيانات في كل مرة أمر صعب. يمنحنا phpunit بشكل خاص الفرصة لجمع moki أثناء التنقل باستخدام mockBuilder. يمكن العثور على مثال في وثائق Symfony.
الخيار يعمل ، ولكن هناك مشاكل. تحتاج إلى معرفة بوضوح في تسلسل رمز الوصول إلى أساليب EntityManager.
على سبيل المثال ، إذا قام المطور بتبديل التحقق من وجود مرجع وإجراء فحص لتسجيل الدخول المشغول ، فسيتم إنهاء الاختبار. لكن التطبيق ليس كذلك.
أقترح خيار ذكي moke EntityManager ، الذي يخزن جميع البيانات الخاصة به في الذاكرة ولا يستخدم قاعدة بيانات حقيقية.
الخيار 3. نستخدم MockBuilder مع تخزين البيانات في الذاكرة.
من أجل المرونة ، سنضيف متغير بيئة بحيث يمكنك استخدام قاعدة بيانات حقيقية. دعونا phpunit.xml
فصل الشتاء في phpunit.xml
التغييرات phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <php> <env name="EMULATE_BD" value="1" /> </php>
الآن تعديل الفئة الأساسية
الاختبارات المعدلة / TestCase.php الآن يمكننا تشغيل الاختبار مرة أخرى والتأكد من أن خدمتنا تعمل دون الاتصال بقاعدة البيانات.
./vendor/bin/phpunit
شفرة المصدر المتاحة على جيثب