توفر هذه الحزمة ميزات تساعدك على تشغيل مجموعة اختبارات التطبيق المستندة إلى إطار عمل Symfony بشكل أكثر كفاءة من خلال اختبارات معزولة.
فهو يوفر StaticDriver
الذي سيغلف فئة Driver
التي تم تكوينها في الأصل (مثل DBALDriverPDOMysqlDriver
) ويحتفظ باتصال قاعدة البيانات بشكل ثابت في عملية php الحالية.
بمساعدة فئة ملحق PHPUnit، ستبدأ المعاملة قبل كل حالة اختبار وتسترجعها مرة أخرى بعد انتهاء الاختبار لجميع اتصالات DBAL التي تم تكوينها. يؤدي هذا إلى تعزيز الأداء حيث ليست هناك حاجة لإعادة بناء المخطط أو استيراد نسخة احتياطية من SQL أو إعادة إدراج التركيبات قبل كل حالة اختبار. طالما أنك تتجنب إصدار استعلامات DDL التي قد تؤدي إلى ارتكاب معاملات ضمنية (مثل ALTER TABLE
و DROP TABLE
وما إلى ذلك؛ راجع https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Anapsy) سيتم عزل اختباراتك وسترى جميعها نفس حالة قاعدة البيانات.
ويتضمن أيضًا Psr6StaticArrayCache
الذي سيتم تهيئته تلقائيًا كبيانات التعريف وذاكرة التخزين المؤقت للاستعلام لجميع EntityManagers. أدى هذا إلى تحسين السرعة واستخدام الذاكرة في اختباراتي بشكل كبير! يعد هذا مفيدًا بشكل خاص إذا كان لديك الكثير من الاختبارات التي تقوم بتشغيل النواة (مثل اختبارات وحدة التحكم أو اختبارات ContainerAware) وتستخدم كيانات Doctrine.
التثبيت عبر الملحن
يتطلب الملحن --dev dama/doctrine-test-bundle
إذا كنت لا تستخدم Flex، فقم بتمكين الحزمة عن طريق إضافة الفصل إلى Bundles.php
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
بدءًا من الإصدار 8 وفقط عند استخدام DBAL < 4، يلزمك التأكد من تمكين use_savepoints
في تكوين DBAL الخاص بك لجميع الاتصالات ذات الصلة:
العقيدة: dbal: الاتصالات: الافتراضي: use_savepoints: صحيح
أضف الامتداد إلى تكوين PHPUnit XML الخاص بك
PHPالوحدة 8 أو 9:
<phpunit> ... <الامتدادات> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </الامتدادات> </phpunit>
PHPالوحدة 10+:
<phpunit> ... <الامتدادات> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </الامتدادات> </phpunit>
تأكد من أن لديك أيضًا phpunit/phpunit
متاحًا كتبعية dev
( الإصدارات 8 و9 و10 مدعومة بالملحق المضمن ) لإجراء اختباراتك. وبدلاً من ذلك، تتوافق هذه الحزمة أيضًا مع symfony/phpunit-bridge
ونصها simple-phpunit
. (ملاحظة: قد تحتاج إلى التأكد من أن phpunit-bridge يتطلب إصدار PHPUnit 8+ الصحيح باستخدام متغير البيئة SYMFONY_PHPUNIT_VERSION
).
هذا كل شيء! من الآن فصاعدًا، سيتم التراجع تلقائيًا عن التغييرات التي تجريها على قاعدة البيانات داخل كل حالة اختبار (سواء كانت WebTestCase
أو KernelTestCase
أو أي اختبار مخصص)
قم بتمكين الامتداد في تكوين Behat الخاص بك (على سبيل المثال behat.yml
)
تقصير: # ... الامتدادات: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
هذا كل شيء! من الآن فصاعدًا، سيتم التراجع تلقائيًا عن أي تغييرات تجريها على قاعدة البيانات ضمن كل سيناريو.
يرجى ملاحظة أن هذا لا يعمل إلا إذا تم تنفيذ الاختبارات بنفس عملية Behat. هذا يعني أنه لا يمكن أن يعمل عند استخدام السيلينيوم على سبيل المثال للاتصال بالتطبيق الخاص بك.
تعرض الحزمة تكوينًا يبدو كالتالي افتراضيًا:
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: صحيح
إعداد enable_static_connection: true
يعني أنه سيتم تمكينه لجميع اتصالات dbal العقيدة التي تم تكوينها.
يمكنك تمكينه بشكل انتقائي فقط لبعض الاتصالات إذا لزم الأمر:
dama_doctrine_test:enable_static_connection:connection_a: صحيح
افتراضيًا، سيكون لكل اتصال DBAL للمبادئ التي تم تكوينها اتصال برنامج التشغيل الخاص به والذي تتم إدارته في عملية php الحالية. في حال كنت بحاجة إلى تخصيص هذا السلوك، يمكنك اختيار "مفاتيح اتصال" مختلفة يتم استخدامها لتحديد اتصالات برنامج التشغيل.
مثال لاتصالين سيعيدان استخدام نفس مثيل اتصال برنامج التشغيل:
عقيدة:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# سيؤدي تعيين نفس المفتاح إلى إعادة استخدام نفس اتصال برنامج التشغيل الداخلي كلا اتصالي DBAL الافتراضي: custom_keyfoo: custom_key
منذ الإصدار 8.1.0 : بالنسبة للاتصالات مع النسخ المتماثلة للقراءة/الكتابة، ستستخدم الحزمة نفس اتصال برنامج التشغيل الأساسي بشكل افتراضي للنسخ الأساسية وكذلك للنسخ المتماثلة. يعالج هذا مشكلة حدوث تناقضات عند القراءة/الكتابة إلى اتصالات مختلفة. يمكن أيضًا تخصيص هذا على النحو التالي:
عقيدة:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# سيؤدي تعيين مفاتيح مختلفة إلى استخدام اتصالات برنامج تشغيل داخلي منفصلة للاتصالات الأساسية و النسخة المتماثلة الافتراضية: الأساسية: custom_key_primaryreplicas: النسخة المتماثلة_واحد: custom_key_replica
يمكن رؤية مثال للاستخدام ضمن الاختبارات الوظيفية المضمنة في هذه الحزمة: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
يتم إجراء التمهيد الأولي لقاعدة البيانات باستخدام ملف التمهيد PHPUnit: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
العديد من الاختبارات التي تتأكد من التراجع عن أي تغييرات من الاختبارات السابقة: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
تُستخدم هذه الحزمة أيضًا في مجموعة اختبار Symfony Demo الرسمية: https://github.com/symfony/demo
في بعض الأحيان قد يكون من المفيد أن تكون قادرًا على تصحيح أخطاء محتويات قاعدة البيانات عند فشل الاختبار. وكما هو معتاد، يتم التراجع عن كافة التغييرات تلقائيًا، ويمكنك القيام بذلك يدويًا:
اختبار الوظيفة العامةMyTestCaseThatINeedToDebug() {// ... شيء يغير حالة قاعدة البيانات DAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// الآن تظل تغييرات قاعدة البيانات مستمرة ويمكنك تصحيحها}
في حالة قيامك بتشغيل (ربما دون معرفة ذلك) استعلامات أثناء اختباراتك والتي تلتزم ضمنيًا بأي معاملة مفتوحة (راجع https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html على سبيل المثال) قد ترى خطأ مثل هذا:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
لا توجد حاليًا طريقة لهذه الحزمة للعمل مع هذه الاستعلامات حيث لا يمكن إعادتها بعد انتهاء حالة الاختبار.
انظر أيضًا رقم 58