مكتبة Composer ذات سمات إضافية لتحسين الاختبار باستخدام PHPUnit.
يتطلب الملحن --dev eliashaeussler/phpunit-attributes
تأتي المكتبة مع ملحق PHPUnit جاهز للاستخدام. يجب أن يتم تسجيله في ملف تكوين PHPUnit الخاص بك:
<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "vendor/phpunit/phpunit/phpunit.xsd" bootstrap = "vendor/autoload.php" >+ <extensions>+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ </extensions> <testsuites> <testsuite name="unit"> <directory>اختبارات</directory> </testsuite> </testsuites> <المصدر> <تشمل> <directory>src</directory> </تشمل> </المصدر> </phpunit>
يمكن تكوين بعض السمات باستخدام معلمات ملحقة مخصصة. ويجب إضافتها إلى قسم تسجيل الامتداد كما يلي:
<extensions>- <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension" />+ <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension">+ <parameter name="fancyParameterName" value="fancyParameterValue" />+ </bootstrap> </الامتدادات>
يتم شحن السمات التالية مع هذه المكتبة:
#[RequiresClass]
#[RequiresPackage]
#[RequiresClass]
النطاق: مستوى الفصل والطريقة
باستخدام هذه السمة، يمكن وضع علامة على الاختبارات أو حالات الاختبار ليتم تنفيذها فقط في حالة وجود فئة معينة. يجب أن تكون الفئة المحددة قابلة للتحميل بواسطة مُحمل الفئة الحالي (والذي عادةً ما يكون مُحمل الفئة الافتراضي للملحن).
افتراضيًا، يتم تخطي حالات الاختبار التي تتطلب فئات غير موجودة. ومع ذلك، يمكن تكوين هذا السلوك باستخدام معلمة ملحق handleMissingClasses
. إذا تم تعيينها على fail
، فسوف تفشل حالات الاختبار التي تحتوي على فئات مفقودة (يجب skip
الإعدادات الافتراضية):
<الامتدادات> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <اسم المعلمة = "handleMissingClasses" value = "فشل" /> </بوتستراب> </الامتدادات>
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresClass(AnImportantClass::class)]اختبار الوظيفة العامةDummyAction(): void{// ...} }
مستوى الفصل:
#[RequiresClass(AnImportantClass::class)]الفصل النهائي DummyTest يمتد TestCase {public function testDummyAction(): void{// تم تخطيه إذا كان AnImportantClass مفقودًا.}اختبار الوظيفة العامةOtherDummyAction(): void{// تم تخطيه إذا كان AnImportantClass مفقودًا.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresClass(AnImportantClass::class)]الوظيفة العامة testDummyAction(): void{// تم تخطيها إذا كانت AnImportantClass مفقودة.}الوظيفة العامة testOtherDummyAction(): void{// لم يتم تخطيها.} }
مستوى الفصل:
#[RequiresClass(AnImportantClass::class, 'يتطلب هذا الاختبار فئة `AnImportantClass`.')]الفصل الأخير يقوم DummyTest بتوسيع TestCase {public function testDummyAction(): void{// يتم تخطيه إذا كان AnImportantClass مفقودًا، بالإضافة إلى الرسالة المخصصة.} public function testOtherDummyAction(): void{// يتم تخطيه إذا كان AnImportantClass مفقودًا، بالإضافة إلى الرسالة المخصصة.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresClass(AnImportantClass::class, 'يتطلب هذا الاختبار فئة `AnImportantClass`.')]وظيفة عامة testDummyAction(): void{// تم تخطيه إذا كان AnImportantClass مفقودًا، بالإضافة إلى الرسالة المخصصة.}اختبار الوظيفة العامةOtherDummyAction(): باطل {// لم يتم تخطيه.} }
مستوى الفصل:
#[RequiresClass(AnImportantClass::class, resultBehavior: OutcomeBehavior::Fail)]الفصل النهائي DummyTest يوسع TestCase {الوظيفة العامة testDummyAction(): void{// تفشل إذا كانت AnImportantClass مفقودة.}اختبار الوظيفة العامةOtherDummyAction(): void{// تفشل إذا كانت AnImportantClass مفقودة.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresClass(AnImportantClass::class, resultBehavior: OutcomeBehavior::Fail)]اختبار الوظيفة العامة DummyAction(): void{// يفشل إذا كان AnImportantClass مفقودًا.}اختبار الوظيفة العامةOtherDummyAction(): void{// لا يفشل.} }
مستوى الفصل:
#[RequiresClass(AnImportantClass::class)] #[RequiresClass(AnotherVeryImportantClass::class)]الفصل النهائي DummyTest يمتد TestCase {الوظيفة العامة testDummyAction(): void{// يتم التخطي إذا كانت AnImportantClass و/أو AnotherVeryImportantClass مفقودة.}الوظيفة العامة testOtherDummyAction(): void{// يتم التخطي إذا كانت AnImportantClass و/أو AnotherVeryImportantClass مفقودة.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresClass(AnImportantClass::class)] #[RequiresClass(AnotherVeryImportantClass::class)]اختبار الوظيفة العامة DummyAction(): void{// تم تخطيه في حالة فقدان AnImportantClass و/أو AnotherVeryImportantClass.}اختبار الوظيفة العامةOtherDummyAction(): void{// لم يتم تخطيه.} }
#[RequiresPackage]
النطاق: مستوى الفصل والطريقة
يمكن استخدام هذه السمة لتحديد متطلبات الحزمة المحددة للاختبارات الفردية بالإضافة إلى فئات الاختبار الكاملة. من المتوقع أن يتم تثبيت الحزمة المطلوبة عبر Composer. يمكنك اختياريًا تحديد قيد الإصدار ورسالة مخصصة.
مهم
تحدد السمة حزم Composer المثبتة من فئة InstalledVersions
التي تم إنشاؤها في وقت البناء والتي أنشأها Composer. من أجل القراءة بشكل صحيح من هذا الفصل، من الضروري تضمين أداة التحميل التلقائي التي أنشأها Composer في البرنامج النصي الخاص بـ PHPUnit الخاص بك:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php"><! -- ... --></phpunit>
يمكنك أيضًا تمرير البرنامج النصي كخيار أمر: phpunit --bootstrap vendor/autoload.php
افتراضيًا، يتم تخطي حالات الاختبار ذات المتطلبات غير المستوفاة. ومع ذلك، يمكن تكوين هذا السلوك باستخدام معلمة ملحق handleUnsatisfiedPackageRequirements
. إذا تم تعيينها على fail
، فسوف تفشل حالات الاختبار ذات المتطلبات غير المستوفاة (يجب skip
الإعدادات الافتراضية):
<الامتدادات> <bootstrap class="EliasHaeusslerPHPUnitAttributesPHPUnitAttributesExtension"> <اسم المعلمة = "handleUnsatisfiedPackageRequirements" value = "فشل" /> </بوتستراب> </الامتدادات>
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/console')]اختبار الوظيفة العامة DummyAction(): void{// ...} }
مستوى الفصل:
#[RequiresPackage('symfony/console')]الفصل النهائي DummyTest يوسع TestCase {الوظيفة العامة testDummyAction(): void{// تم التخطي إذا لم يتم تثبيت Symfony/console.}الوظيفة العامة testOtherDummyAction(): void{// تم التخطي إذا لم يتم تثبيت Symfony/console.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/console')]الوظيفة العامة testDummyAction(): void{// تم تخطيها إذا لم يتم تثبيت Symfony/console.}الوظيفة العامة testOtherDummyAction(): void{// لم يتم تخطيها.} }
مستوى الفصل:
#[RequiresPackage('symfony/*')]الفصل النهائي DummyTest يوسع TestCase {public function testDummyAction(): void{// تم التخطي إذا لم يتم تثبيت حزم Symfony/*.}الوظيفة العامة testOtherDummyAction(): void{// تم التخطي إذا لم يتم تثبيت حزم Symfony/*.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/*')]الوظيفة العامة testDummyAction(): void{// تم تخطيها في حالة عدم تثبيت حزم Symfony/*.}الوظيفة العامة testOtherDummyAction(): void{// لم يتم تخطيها.} }
مستوى الفصل:
#[RequiresPackage('symfony/console', '>= 7')]الفصل النهائي DummyTest يوسع TestCase {public function testDummyAction(): void{// يتم تخطيه إذا كان الإصدار المثبت من Symfony/console أقل من 7.}اختبار الوظيفة العامةOtherDummyAction(): void{// يتم تخطيه إذا كان الإصدار المثبت من Symfony/console أقل من 7.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/console', '>= 7')]اختبار الوظيفة العامة DummyAction(): void{// يتم تخطيه إذا كان الإصدار المثبت من Symfony/console < 7.}اختبار الوظيفة العامةOtherDummyAction(): void{// لم يتم تخطيها.} }
مستوى الفصل:
#[RequiresPackage('symfony/console', message: 'يتطلب هذا الاختبار وحدة تحكم Symfony.')]الفصل النهائي DummyTest يوسع TestCase {public function testOtherDummyAction(): void{// تم التخطي إذا لم يتم تثبيت Symfony/console، بالإضافة إلى الرسالة المخصصة.}public function testOtherDummyAction(): void{// تم التخطي إذا لم يتم تثبيت Symfony/console، بالإضافة إلى الرسالة المخصصة. } }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/console', message: 'يتطلب هذا الاختبار وحدة تحكم Symfony.')]الوظيفة العامة testDummyAction(): void{// تم تخطيه إذا لم يتم تثبيت Symfony/console، بالإضافة إلى الرسالة المخصصة.}وظيفة عامة testOtherDummyAction(): void{// لم يتم تخطيه.} }
مستوى الفصل:
#[RequiresPackage('symfony/console', resultBehavior: OutcomeBehavior::Fail)]الفصل النهائي DummyTest يوسع TestCase {اختبار الوظيفة العامة DummyAction(): void{// يفشل إذا لم يتم تثبيت Symfony/console.}اختبار الوظيفة العامةOtherDummyAction(): void{// يفشل إذا لم يتم تثبيت Symfony/console.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[RequiresPackage('symfony/console', resultBehavior: OutcomeBehavior::Fail)]اختبار الوظيفة العامة DummyAction(): void{// يفشل إذا لم يتم تثبيت Symfony/console.}اختبار الوظيفة العامةOtherDummyAction(): void{// لا يفشل.} }
مستوى الفصل:
#[يتطلب حزمة('symfony/console')] #[RequiresPackage('guzzlehttp/guzzle')]الفصل النهائي DummyTest يمتد TestCase {public function testDummyAction(): void{// يتم تخطيه إذا لم يتم تثبيت Symfony/console و/أو guzzlehttp/guzzle.}اختبار الوظيفة العامةOtherDummyAction(): void{// يتم تخطيه إذا لم يتم تثبيت Symfony/console و/أو guzzlehttp/guzzle تم التثبيت.} }
مستوى الطريقة:
الطبقة النهائية DummyTest تمتد إلى TestCase { #[يتطلب حزمة('symfony/console')] #[RequiresPackage('guzzlehttp/guzzle')]اختبار الوظيفة العامة DummyAction(): void{// تم تخطيه إذا لم يتم تثبيت Symfony/console و/أو guzzlehttp/guzzle.}اختبار الوظيفة العامةOtherDummyAction(): void{// لم يتم تخطيه. } }
يرجى إلقاء نظرة على CONTRIBUTING.md
.
هذا المشروع مرخص بموجب رخصة جنو العامة 3.0 (أو الأحدث).